在上一篇文章 《Spring Boot (七): Mybatis极简配置》 中我们介绍了在 Spring Boot 中 Mybatis 的基础使用方式,其中有一部分美中不足的是 Mybatis 本身并未提供分页功能,还需要我们自己手动添加 PageHelper
插件或者自己实现分页的工具类,并且对单表的操作并不友好,简单的 insert 、 update 、 delete 还需我们添加 SQL 语句,在目前微服务的架构模式下,每个服务拥有自己的单独的数据库,单表的使用场景会越来越多, Mybatis 的使用无疑会产生很多重复劳动。
Mybatis Plus 在这样的背景下应运而生了,MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。而开源团队对这个开源项目的愿景如下:
愿景
Mybatis-Plus 相比较 Mybatis 更好的支持了单表的相关操作,并且直接支持分页功能,还加入了一系列有助于开发的插件,相关详细内容推荐各位读者访问官方网站获得: https://mybatis.plus/guide/ 。下面将会介绍 Mybatis-Plus 的单表操作和引入 SQL 分析插件。
代码清单:spring-boot-mybatis-plus/pom.xml
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency> <!-- https://mvnrepository.com/artifact/p6spy/p6spy --> <dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>3.8.6</version> </dependency>
配置文件 application.yml 如下:
代码清单:spring-boot-mybatis-plus/src/main/resources/application.yml
server: port: 8080 spring: application: name: spring-boot-mybatis-xml datasource: url: jdbc:p6spy:mysql://172.16.96.112:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: 123456 driver-class-name: com.p6spy.engine.spy.P6SpyDriver type: com.zaxxer.hikari.HikariDataSource hikari: auto-commit: true minimum-idle: 2 idle-timeout: 60000 connection-timeout: 30000 max-lifetime: 1800000 pool-name: DatebookHikariCP maximum-pool-size: 5 # 配置slq打印日志 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
注意:开启 mybatis-plus 的 SQL 分析打印
mybatis-plus.configuration.log-impl
。 spring.datasource.driver-class-name
为 com.p6spy.engine.spy.P6SpyDriver
,这个配置是使用 p6spy 提供的驱动类。 代码清单:spring-boot-mybatis-plus/src/main/resources/spy.properties
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory # 自定义日志打印 logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger #日志输出到控制台 appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger # 使用日志系统记录 sql #appender=com.p6spy.engine.spy.appender.Slf4JLogger # 设置 p6spy driver 代理 deregisterdrivers=true # 取消JDBC URL前缀 useprefix=true # 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. excludecategories=info,debug,result,batch,resultset # 日期格式 dateformat=yyyy-MM-dd HH:mm:ss # 实际驱动可多个 #driverlist=org.h2.Driver # 是否开启慢SQL记录 outagedetection=true # 慢SQL记录标准 2 秒 outagedetectioninterval=2
代码清单:spring-boot-mybatis-plus/src/main/java/com/springboot/springbootmybatisplus/mapper/UserMapper.java
public interface UserMapper extends BaseMapper<User> { }
这里只需要继承 BaseMapper 即可, BaseMapper 为我们提供了丰富的单表操作,具体的操作可以查看源码 com.baomidou.mybatisplus.core.mapper.BaseMapper<T>
,其中的注释非常详尽。
Mybatis-Plus 除了为我们提供了基础的 Mapper 类以外,还为我们提供了 IService ,通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆。并且官方建议我们如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类。
UserService.java 代码如下:
代码清单:spring-boot-mybatis-plus/src/main/java/com/springboot/springbootmybatisplus/service/UserService.java
public interface UserService extends IService<User> { }
UserServiceImpl.java 代码如下;
代码清单:spring-boot-mybatis-plus/src/main/java/com/springboot/springbootmybatisplus/service/impl/UserServiceImpl.java
@Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { }
相关测试代码已经创建测试 controller ,这里就不列出了,有需要的读者可以访问 Github 代码仓库自行取用。
代码清单:spring-boot-mybatis-plus/src/main/java/com/springboot/springbootmybatisplus/config/MybatisPlusConfig.java
@Configuration public class MybatisPlusConfig { /** * 注册分页插件 * @return */ @Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); } }
启动工程后,打开浏览器访问: http://localhost :8080/findPage ,可以看到 json 正常返回,如下:
{ "records":[ { "id":"a0ac692d-e1f1-11e9-9a69-0242ac110002", "nickName":"geekdigging.com", "age":108, "createDate":"2019-09-28T13:12:31.000+0000" }, { "id":"b9168576-e1f1-11e9-9a69-0242ac110002", "nickName":"www.geekdigging.com", "age":18, "createDate":"2019-09-28T13:13:12.000+0000" } ], "total":2, "size":5, "current":1, "orders":[ ], "searchCount":true, "pages":1 }
这时我们查看控制台的日志,可以看到 SQL 分析的相关日志,如下:
从日志中,我们可以清楚的看到当前日志执行的过程,先执行了什么后执行了什么,并且耗时是多少,有助于我们的进行 SQL 的性能分析,知道具体是哪些 SQL 耗时会比较长。
Mybatis-Plus 整体使用都比较简单,Mybatis 支持的使用方式 Mybatis-Plus 都支持,只是原本配置文件 application.yml 中的 mybatis.***
需要替换成为 mybatis-plus.***
,并且增强了 Mybatis 原本单表操作的不足之处,对于官方的宣言:只做增强不做改变,为简化开发、提高效率而生。笔者认为是十分贴切的。本文仅介绍了 Mybatis-Plus 的一些基础使用方式,官方除了增强了单表操作、分页、 SQL 分析等功能外,还提供了很多实用的插件,例如:热加载、逻辑删除、SQL 注入器、攻击 SQL 阻断解析器等功能,如有需要的读者朋友可以访问官方文档自取。
示例代码-Github
示例代码-Gitee
《Mybatis-Plus官方文档》