
SpringMVC+Mybatis (动态代理)学习笔记
要用mapper代理的方式开发Mybatis: 静态代理 动态代理 AOP???
就可以通过包扫描;
发布日期:2021-05-07 05:54:41
浏览次数:16
分类:技术文章
本文共 4651 字,大约阅读时间需要 15 分钟。
在demomybatis的基础上,新建dao包,持久层,其中有IUserDao接口:
package com.bit.dao;import com.bit.po.user;//因为该接口位于dao层,所以错误的东西应该让客户的页面看到,所以应往上抛Exceptionpublic interface IUserDao { public int addUser(user user1) throws Exception; public int modifyUser(int id,user user2)throws Exception; public int delUser(int id)throws Exception; public user queryUser(int id)throws Exception;}
并写其实现类UserDaoImpl:(部分方法略,只体现查找)
package com.bit.dao;import com.bit.po.user;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;import java.io.InputStream;public class UserDaoImpl implements IUserDao { //需要使用sqlSessionFactory和sqlSession private SqlSessionFactory sqlSessionFactory=null; //无参构造,new UserDaoImpl时也能new SqlSessionFactory public UserDaoImpl() { String mybatisConfigFile="sqlMapConfig.xml"; InputStream is=null; try { is=Resources.getResourceAsStream(mybatisConfigFile); sqlSessionFactory=new SqlSessionFactoryBuilder().build(is); } catch (IOException e) { e.printStackTrace(); } } @Override public user queryUser(int id) throws Exception { SqlSession sqlSession=sqlSessionFactory.openSession(); user user1=sqlSession.selectOne("test.queryUserById",id); return user1; }}
新建一个测试类MyBatisTest2,它相当于客户端,此时的测试类中不需要new SqlSessionFactory和SqlSession了:
package com.bit;import com.bit.dao.IUserDao;import com.bit.dao.UserDaoImpl;import com.bit.po.user;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import java.io.IOException;import java.io.InputStream;public class MybatisTest2 { //只需要Dao //此时没有Spring,自行创建 private IUserDao iUserDao=new UserDaoImpl(); @Test public void queryUser(){ try { user user1 = iUserDao.queryUser(2); System.out.println(user1);}catch (Exception ex){ ex.printStackTrace();}}}
运行结果为:

接口修改方法如下:
package com.bit.dao;import com.bit.po.user;import java.util.List;//因为该接口位于dao层,所以错误的东西应该让客户的页面看到,所以应往上抛Exceptionpublic interface IUserDao { public user queryUserById(int myid)throws Exception; public ListqueryUserByName(String name)throws Exception; public void modifyUser(user user1) throws Exception; public void delUser(int id)throws Exception; public user queryUser(int id)throws Exception;}
如果用户有很多个订单,难道需要很多个Impl类? 利用动态代理,代理对象,像反射一样,运行期创建。因此不再需要UserDaoImpl。
那么只剩下接口,没有实现类。——通过代理Proxy,动态代理需要实现一些规则。约定优于配置。
在mapper包下新建user.xml:
> update user set username=#{ userName} where userid=#{ userID}; delete from user where userid=#{ value};
新建单元测试MybatisTest3:
package com.bit;import com.bit.dao.IUserDao;import com.bit.po.user;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import java.io.IOException;import java.io.InputStream;public class MybatisTest3 { private SqlSessionFactory sqlSessionFactory; @Before public void testInit() { String mybatisConfigFile="sqlMapConfig.xml"; InputStream is=null; try { is=Resources.getResourceAsStream(mybatisConfigFile); sqlSessionFactory=new SqlSessionFactoryBuilder().build(is); } catch (IOException e) { e.printStackTrace(); } } //测queryById //使用mapper动态代理 @Test public void test() { SqlSession sqlSession=sqlSessionFactory.openSession(); //代理对象与被代理对象实现同一接口,所以生成的代理对象也实现了IUserDao这个接口 try { IUserDao userDao=sqlSession.getMapper(IUserDao.class); user user1=userDao.queryUserById(3); System.out.println(user1); } catch (Exception ex) { ex.printStackTrace();} finally { sqlSession.close(); } }}
再把user.xml的名字改成与接口名一致,并且放在同一个包下:

可以将dao层改名为mapper层。(现在改名叫mapper了。)
总结:
动态代理实现Mybatis的七个规则
规则1:workspace一致,
2:方法名与id名一致 3.方法参数与ParameterType一致 4.方法返回值与ResultType一致 5.接口与xml名字一致 6.接口与xml在同一个包下 7.通过包扫描发表评论
最新留言
很好
[***.229.124.182]2025年04月10日 17时43分47秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
.NET CORE(C#) WPF 重新设计Instagram
2019-03-05
.NET CORE(C#) WPF 方便的实现用户控件切换(祝大家新年快乐)
2019-03-05
C# WPF开源控件库:MahApps.Metro
2019-03-05
使用QT实现一个简单的登陆对话框(纯代码实现C++)
2019-03-05
QT :warning LNK4042: 对象被多次指定;已忽略多余的指定
2019-03-05
GLFW 源码 下载-编译-使用/GLAD配置
2019-03-05
针对单个网站的渗透思路
2019-03-05
Typescript 学习笔记六:接口
2019-03-05
Scala字符串与容器
2019-03-05
关于JTAG,你知道的和不知道的都在这里
2019-03-05
【CTF】CTFHub 技能树 文件头检查 writeup
2019-03-05
web服务器-并发服务器2
2019-03-05
【SqlServer】如何把本地SqlServer数据库部署到远程服务器上
2019-03-05
【ASP.NET】ASP.NET中权限验证使用OnAuthorization实现
2019-03-05
第9章 用户自己建立数据类型
2019-03-05
02、MySQL—数据库基本操作
2019-03-05
RedHat Linux-配置YUM仓库
2019-03-05
Redis数据类型
2019-03-05
1907: 树的路径覆盖
2019-03-05