Mybatis Plus 在这样的背景下应运而生了,MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。而开源团队对这个开源项目的愿景如下:
愿景
我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 – Sequence),可自由配置,完美解决主键问题
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
Mybatis-Plus 相比较 Mybatis 更好的支持了单表的相关操作,并且直接支持分页功能,还加入了一系列有助于开发的插件,相关详细内容推荐各位读者访问官方网站获得:https://mybatis.plus/guide/ 。下面将会介绍 Mybatis-Plus 的单表操作和引入 SQL 分析插件。
工程实战
3.1 工程依赖 pom.xml 如下:
代码清单:spring-boot-mybatis-plus/pom.xml
代码清单: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
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImplCOPY
注意:开启 mybatis-plus 的 SQL 分析打印
需要配置 mybatis-plus.configuration.log-impl 。
修改配置 spring.datasource.driver-class-name 为 com.p6spy.engine.spy.P6SpyDriver ,这个配置是使用 p6spy 提供的驱动类。
url 前缀为 jdbc:p6spy 跟着冒号为对应数据库连接地址。
该插件有性能损耗,不建议生产环境使用。
还需增加 spy.properties ,如下:
代码清单: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
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
deregisterdrivers=true
useprefix=true
excludecategories=info,debug,result,batch,resultset
dateformat=yyyy-MM-dd HH:mm:ss
#driverlist=org.h2.Driver
outagedetection=true
outagedetectioninterval=2COPY
3.3 Mapper 类
代码清单:spring-boot-mybatis-plus/src/main/java/com/springboot/springbootmybatisplus/mapper/UserMapper.java
public interface UserMapper extends BaseMapper {
}COPY
这里只需要继承 BaseMapper 即可, BaseMapper 为我们提供了丰富的单表操作,具体的操作可以查看源码 com.baomidou.mybatisplus.core.mapper.BaseMapper ,其中的注释非常详尽。
3.4 Service 类
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 {
}COPY
UserServiceImpl.java 代码如下;
代码清单:spring-boot-mybatis-plus/src/main/java/com/springboot/springbootmybatisplus/service/impl/UserServiceImpl.java
@Service
public class UserServiceImpl extends ServiceImpl
}COPY
相关测试代码已经创建测试 controller ,这里就不列出了,有需要的读者可以访问 Github 代码仓库自行取用。
3.5 分页配置类
代码清单: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();
}
}COPY
4. 测试
启动工程后,打开浏览器访问: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
}COPY
这时我们查看控制台的日志,可以看到 SQL 分析的相关日志,如下:
从日志中,我们可以清楚的看到当前日志执行的过程,先执行了什么后执行了什么,并且耗时是多少,有助于我们的进行 SQL 的性能分析,知道具体是哪些 SQL 耗时会比较长。