MyBatis是目前最流行的JDBC持久层框架,著名的ssm框架中的m。关于springboot集成mybatis可以参考本系列前面的文章(003和004)。关于MyBatis不再介绍。
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MyBatis-Plus特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
支持关键词自动转义:支持数据库关键词(order、key......)自动转义,还可自定义关键词
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击
框架结构
关于其它,可以参考官方文档。
项目依赖
接下来开始写代码例子,首先创建一个项目,依赖如下:
可以看到除了正常的ssm依赖之外,只多了一个mybatis-plus-boot-starter依赖。
注意:针对目前的版本,有一点值得注意,我们在使用MyBatis的时候,习惯使用的分页组件是pagehelper,但是在使用mybatis plus的时候,如果引入pagehelper依赖,会让mybatis plus的分页发生错误,所以,使用mybatis plus不要再引入pagehelper。
单表增删改查
MyBatis Plus多表的复杂的SQL操作同mybatis没有太大的区别,同样是麻烦的SQL语句和方法调用,但是单表简化了很多。上面的特性中提到,MyBatis Plus(以下简称mp)仅需少量的配置,即可实现单表的大部分crud操作。首先我们在配置文件中只配置简单的数据源,其它不做任何配置:
在启动类中,增加一个mapper扫描注解:
@MapperScan("mp.mapper")
mp.mapper为mapper的接口包路径。这个注解是MyBatis原生的。
简单的配置基本完成了,下面开始写业务代码,首先看实体类:
简单的用户信息,上面的注解是基于lombok,如果不习惯可以使用get/set。
再来看mapper:
mapper只需要继承BaseMapper即可,不需要写任何代码。再来看service类:
可以看到service单表操作只需要继承ServiceImpl即可,也不需要写任何代码,接下来看一下controller中对应的接口:
简单的单表增删改查就写好了,与原生的MyBatis相比,没有SQL语句,mapper接口和service类几乎是零代码,所以说mp是MyBatis的增强工具。通过上面可以看到,直接调用userService里面有很多实现好的方法,这些方法都在ServiceImpl中,下面简单看一下都有哪些:
可以看到,ServiceImpl里面包含了很多有用的单表crud方法(具体内容查看源码),这种做法类似于JPA,以前很多人抱怨说MyBatis在单表的时候也要写大量的SQL语句,现在有了mp,这些都不再是问题。
现在启动项目,简单运行一下上面四个接口,先看新增方法:
修改方法:
查询方法:
删除方法:
四个接口都没有问题。其它自带的方法可以自行学习测试。
分页查询
分页需要加入分页插件,在springboot的启动类中加入如下方法:
如果不加返回的分页数据的总页数和总记录数会有问题,接下来先看单表的简单的分页查询。
返回的数据如下:
这是service中调用的selectPage方法,返回Page对象,需要传入两个参数,第一个主要是当前页码和每页记录数,第二个Wrapper主要用来组合条件,也是实体包装器,用于处理 sql 拼接,排序,实体参数查询等!实体包装器 EntityWrapper 继承 Wrapper。简单的实例如下:
或者:
具体的使用方法如下:
不仅在分页查询中,在单表的列表查询selectList方法中,也可以传参数wrapper,这样我们对单表的操作基本上就不用写service代码和SQL语句了。其它详细内容可以参考官方文档。
单表的分页十分好实现,虽然mp封装了单表的大部分操作,但是就像JPA一样,复杂的情况还是需要手写SQL,下面看一下自定义SQL的分页。首先配置SQL语句的xml文件的位置:
mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
然后在对应的的目录下创建userMapper.xml文件,并写一个SQL:
可以看到SQL语句的定义和以前并没有什么区别。接下来在mapper接口中定义方法:
方法的定义几乎和以前一样,唯一的区别是参数列表的第一个参数增加了一个Pagination类型的page,这是翻页对象,可以作为 xml 参数直接使用,传递参数 Page 即自动分页。
然后看一下service的调用方式:
service调用mapper虽然和以前有区别,但也很简单。
最后是controller调动service,这里就没有什么特别的了:
最后重启项目,测试接口:
可以看到自定义SQL的分页也很容易实现,复杂的SQL同样如此。
执行效率插件
接下来介绍一个实用的执行效率插件,即性能分析拦截器,用于输出每条 SQL 语句及其执行时间。在springboot中只需要在启动类中加入如下方法:
这个时候,执行任何数据库操作都会在控制台打印SQL语句和执行的时间:
是一个非常实用的插件!
注意!该插件只用于开发环境,不建议生产环境使用。。。
官方还提供了很多很多的插件:
包括读写分离,idea快速开发等等都非常实用,有兴趣可以自行学习,此处不再一一列举。
代码地址: https://gitee.com/blueses/spring-boot-demo