Mybatis学习第二天——mapper的动态代理

Posted 洞若观火

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis学习第二天——mapper的动态代理相关的知识,希望对你有一定的参考价值。

传统的Dao层开发通过接口与实现类的方式,Mybatis中通过mapper动态代理是需要定义接口。

1.传统Dao层封装

那么可以将公共资源提取出来,剩余的封装成方法来实现。下面是UserDaoImpl.java中对查询的简单封装

 1 package com.mybatis.dao.impl;
 2 
 3 import org.apache.ibatis.session.SqlSession;
 4 import org.apache.ibatis.session.SqlSessionFactory;
 5 
 6 import com.mybatis.dao.UserDao;
 7 import com.mybatis.pojo.User;
 8 
 9 public class UserDaoImpl implements UserDao {
10 
11     //没有导入Spring,采用传参的方式获取
12     SqlSessionFactory sqlSessionFactory ;
13 
14     public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
15         super();
16         this.sqlSessionFactory = sqlSessionFactory;
17     }
18 
19     @Override
20     public User findUserById(Integer id) {
21         SqlSession sqlSession = sqlSessionFactory.openSession();
22         User user = sqlSession.selectOne("test.findUserById",id);
23         
24         sqlSession.close();
25         return user;
26     }
27 
28 }

在测试中通过加载公共资源,确定调用的mapper文件(此时表示User.xml)

 1 @Test
 2     public void testName() throws Exception {
 3         /**
 4          *   1. 创建SqlSessionFactoryBuilder对象
 5              2. 加载SqlMapConfig.xml配置文件
 6              3. 创建SqlSessionFactory对象
 7              4. 创建SqlSession对象
 8              5. 执行SqlSession对象执行查询,获取结果User
 9              6. 打印结果
10              7. 释放资源
11          */
12         String resource = "SqlMapConfig.xml";
13         InputStream in = Resources.getResourceAsStream(resource);
14         
15         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
16         
17         UserDao userdao = new UserDaoImpl(sqlSessionFactory);
18         
19         User user = userdao.findUserById(1);
20         
21         System.out.println(user.getUsername());

2.mapper动态代理模式

UserMapper um = sqlSession.getMapper(UserMapper.class);获取代理,传入的值为创建的动态代理接口

(个人理解,有误希望指正)

在UserMapper接口中,创建的方法需要满足以下四个原则Mybatis才能进行动态代理操作:

1 public interface UserMapper {
2     //四大原则
3     //1.接口中的方法名与User.xml中对应的id名一致
4     //2.方法中的返回类型与User.xml中的一致
5     //3.传入的参数类型一致
6     //4.命名空间绑定此接口
7     public User findUserById(Integer id);
8 }

前三个好理解,方法的名字,返回类型,参数类型与User.xml文件中的属性一致。命名空间绑定此接口,只需要在namesapce上用接口的全路径。如下:

注意:User.xml一定要在核心配置SqlMapConfig.xml中加载

3.mapper映射器

1     <mappers>
2         <!-- 第一种方式只需指定mapper文件路径即可 -->
3         <mapper resource="sqlmap/User.xml"/>
4         <mapper resource="sqlmap/UserMapper.xml"/>
5         <!-- 第二种方式,需对应接口的路径,同时mapper文件名需与接口名一致,文件位置必须在同一目录下 -->
6         <mapper class="com.mybatis.mapper.UserMapper"/>
7         <!-- 第三种方法,指定接口文件的包名,同时mapper文件名需与接口名一致,文件位置必须在同一目录下 -->
8         <package name="com.mybatis.mapper"/>
9     </mappers>

推荐使用第三种方式。

 

以上是关于Mybatis学习第二天——mapper的动态代理的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis学习总结二

MyBatis之Mapper动态代理

MyBatis - Mapper动态代理开发

mybatis源码阅读(动态代理)

Mybatis框架中Mapper动态代理方式

02.MyBatis在DAO层开发使用的Mapper动态代理方式