什么是通用Mapper

通用Mapper就是为了解决单表增删改查, 基于Mybatis的插件机制。开发人员不需要编写SQL, 不需要
在DAO中增加方法, 只要写好实体类, 就能支持相应的增删改查方法

如何使用

1.首先在maven项目, 在pom.xml中引入mapper的依赖

  1. <dependency>
  2. <groupId>tk.mybatis</groupId>
  3. <artifactId>mapper</artifactId>
  4. <version>3.1.2</version>
  5. </dependency>

2、可以查看源码

image.png

3、在Mybatis配置文件中完成配置

有一个插件的实现类去实现接口,并且对核心对象进行了拦截。

  1. <plugins>
  2. <plugin interceptor="tk.mybatis.mapper.mapperhelper.MapperInterceptor">
  3. <!--指定当前的通用Mapper接口是哪一个,多个接口用逗号隔开
  4. 进行自定义接口时候要继承这个接口-->
  5. <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
  6. </plugin>
  7. </plugins>

4、实体类设置主键

  1. // 当前的实体与数据库的user表产生映射关系
  2. @Table(name ="user")
  3. public class User {
  4. @Id // 设置主键
  5. @GeneratedValue(strategy = GenerationType.IDENTITY) // 主键的生成策略(主键自动增长)
  6. private Integer id;
  7. // 如果表的字段和属性的不一致,则借助@Column来配置映射关系
  8. private String username;
  9. //get set方法
  10. }

5、定义一个通用Mapper

  1. // 接口继承Mapper接口,需要指定一个泛型,当前是需要操作User实体类,则里面就是User。
  2. // 因为继承了Mapper这个接口,也就具备了对单表的增删改查功能
  3. public interface UserMapper extends Mapper<User> {
  4. }

image.gif

6、测试

  1. @Test
  2. public void test01(){
  3. // 获取动态代理对象
  4. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  5. User user = new User();
  6. user.setId(1);
  7. User user1 = mapper.selectOne(user);
  8. System.out.println(user1);
  9. // 根据主键进行查询
  10. mapper.selectByPrimaryKey(1);
  11. // 根据实体属性查询总数
  12. mapper.selectCount(user);
  13. int insert = mapper.insert(user);
  14. int i1 = mapper.updateByPrimaryKey(user);
  15. int delete = mapper.delete(user);
  16. mapper.deleteByPrimaryKey(1);
  17. //2.example方法, 里面的参数是表示当前对那个实体进行操作 现在是对User类进行操作
  18. Example example = new Example(User.class);
  19. // example.createCriteria()意思就是查询User表的所有记录,后面是添加的条件
  20. example.createCriteria().andEqualTo("id",1);// 将id等于1的都查询出来
  21. // 自定义查询
  22. List<User> users = mapper.selectByExample(example);// 查询的结果是个集合
  23. for (User user2 : users) {
  24. System.out.println(user2);
  25. }
  26. }

7、为什么第五步没有定义方法,但是第六步能调用方法呢

因为第五步继承了Mapper这个父类方法,如下图的这些方法在Mapper中已经定义了
image.png

Mybatis的架构原理

1、架构设计

Mybatis的通用Mapper&架构原理 - 图4image.gif

我们把Mybatis的功能架构分为三层:

(1) API接口层:

提供给外部使用的接口API, 开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
MyBatis和数据库的交互有两种方式:
a、使用传统的My Bat is提供的API;
b、使用Mapper代理的方式

(2) 数据处理层:

负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

(3)基础支撑层:

负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑

image.gif

2、主要构件及其相互关系

image.png

image.png

3、总体流程

(1)加载配置并初始化

触发条件:加载配置文件
配置来源于两个地方, 一个是配置文件(主配置文件conf.xml, mapper文件*.xm) , 一个是java代码中的注解, 将主配置文件内容解析封装到Configuration,将sql的配置信息加载成为一个mappedstatement对象,存储在内存之中

(2)接收调用请求

触发条件:调用Mybatis提供的API
传入参数:为SQL的ID和传入参数对象
处理过程:将请求传递给下层的请求处理层进行处理。

(3)处理操作请求

触发条件:API接口层传递请求过来
传入参数:为SQL的ID和传入参数对象处理过程:
(A) 根据SQL的ID查找对应的MappedStatement对象。
(B) 根据传入参数对象解析MappedStatement对象, 得到最终要执行的SQL和执行传入参数。
(C) 获取数据库连接, 根据得到的最终SQL语句和执行传入参数到数据库执行, 并得到执行结果。
(D) 根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理, 并得到最终的处理结果。
(E)释放连接资源。

(4)返回处理结果

将最终的处理结果返回。