这就是——通用Mapper
什么是通用mapper?
通用mapper 可以极大的方便开发人员进行ORM,提供极其方便的单表增删改查。
可以按照自己的需要选择通用方法,还能很方便的开发自己的通用方法。
为什么要用通用mapper?
原生Mybatis的痛点
1、mapper.xml文件里有大量的sql,当数据库表字段变动,配置文件就要修改
2、需要自己实现sql分页,select * from table where . . . limit 1,3
自己手写分页,除了传参page、pageSize,还需要返回条目总数count。
3、数据库可移植性差:如果项目更换数据库,比如oracle-->mysql,mapper.xml中的sql要重新写,因为Oracle的PLSQL 和mysql 支持的函数是不同的。
4、生成的代码量过大。
5、批量操作,批量插入,批量更新,需要自写。
快速开始
用过 Mybatis Geneator(MBG)都知道,我们可以通过配置generatorConfig.xml,指定一个数据库以及数据库表,可以使用MBG直接生成对应的Java Bean实体类(POJO)、Mapper.java接口(DAO层接口)、Mapper.xml,以及实体类的Example.java。
这就是类似于Hibernate 的逆向工程。逆向从数据库表生成了实体类。
但是这种原生的MBG生成的方式,仍然有一些不足之处。如果再配合使用通用mapper ,会有更多方便之处。下面通过对比原生mybatis生成 和 集成通用mapper后的生成,看看具体有什么区别。
代码对比(原生mybatis生成 VS 通用mapper生成)
以单表person,生成对应的Person实体类为例:
原生mybatis生成:
PersonMapper.xml、Person.java、PersonMapper.java、PersonExample.java
通用mapper生成:
PersonMapper.xml、Person.java、PersonMapper.java
原生mybatis生成的POJO中,纯代码,不包含注解。
通用mapper生成的POJO中,属性加了 (持久化)注解,与数据库字段进行匹配。
原生mybatis生成的PersonMapper.xml中,有很多sql。
通用mapper生成的PersonMapper.xml中,只有一个POJO与数据库字段的映射<resultMap>。
通用mapper生成的PersonMapper.java接口,extends MyMapper<?>。
实际上,MyMapper<?>已经提供常用的 单表CRUD方法的实现。
如果还有其他特殊CRUD需求(如多表连接查询),只需自己在PersonMapper.java接口添加方法,对应在PersonMapper.xml写sql就行了。
image2.png
原生mybatis生成的PersonExample.java类,是和具体的POJO类关联,生成POJO类时,对应的Example类也生成(生成配置中,可以选择不生成)。
PersonExample example = new PersonExample();
example.createCriteria().andEqualTo("id","1");
personMapper.selectByExample(example);
通用mapper的Example类,是通用的,并不是和具体的POJO绑定。构造时,只需要传入实体类的Class<?>类型。
image3.png
原生mybatis的批量插入,需要写sql,进行for循环。
image4.png
通用mapper,天然的就支持批量操作。直接调用personMapper.insertList()
image5.png
A powerful GUI tool for MyBatisGenerator(MBG)