1. 简介

在上一篇文章《Spring Boot (七): Mybatis极简配置》 中我们介绍了在 Spring Boot 中 Mybatis 的基础使用方式,其中有一部分美中不足的是 Mybatis 本身并未提供分页功能,还需要我们自己手动添加 PageHelper 插件或者自己实现分页的工具类,并且对单表的操作并不友好,简单的 insert 、 update 、 delete 还需我们添加 SQL 语句,在目前微服务的架构模式下,每个服务拥有自己的单独的数据库,单表的使用场景会越来越多, Mybatis 的使用无疑会产生很多重复劳动。

Mybatis Plus 在这样的背景下应运而生了,MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。而开源团队对这个开源项目的愿景如下:

愿景

我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

2. 特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 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. 工程实战

3.1 工程依赖 pom.xml 如下:

代码清单: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>
  • mybatis-plus-boot-starter 为 mybatis-plus 所需依赖
  • p6spy 为 SQL 分析打印依赖,如不需要,可以单独引入 mybatis-plus-boot-starter 。

3.2 配置

配置文件 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-namecom.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
# 使用日志系统记录 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

3.3 Mapper 类

代码清单: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> ,其中的注释非常详尽。

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<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 代码仓库自行取用。

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();
} }

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
}

这时我们查看控制台的日志,可以看到 SQL 分析的相关日志,如下:

从日志中,我们可以清楚的看到当前日志执行的过程,先执行了什么后执行了什么,并且耗时是多少,有助于我们的进行 SQL 的性能分析,知道具体是哪些 SQL 耗时会比较长。

5. 小结

Mybatis-Plus 整体使用都比较简单,Mybatis 支持的使用方式 Mybatis-Plus 都支持,只是原本配置文件 application.yml 中的 mybatis.*** 需要替换成为 mybatis-plus.*** ,并且增强了 Mybatis 原本单表操作的不足之处,对于官方的宣言:只做增强不做改变,为简化开发、提高效率而生。笔者认为是十分贴切的。本文仅介绍了 Mybatis-Plus 的一些基础使用方式,官方除了增强了单表操作、分页、 SQL 分析等功能外,还提供了很多实用的插件,例如:热加载、逻辑删除、SQL 注入器、攻击 SQL 阻断解析器等功能,如有需要的读者朋友可以访问官方文档自取。

5. 示例代码

示例代码-Github

示例代码-Gitee

6. 参考

《Mybatis-Plus官方文档》

Spring Boot (八): Mybatis 增强工具 MyBatis-Plus的更多相关文章

  1. Spring Boot入门(六):使用MyBatis访问MySql数据库(注解方式)

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 本篇博客我们讲解下在Spring Boot中使用MyBatis访问MySql数据库的简单用法. 1.前期 ...

  2. Spring Boot(六):如何使用mybatis

    Spring Boot(六):如何使用mybatis orm框架的本质是简化编程中操作数据库的编码,发展到现在基本上就剩两家了,一个是宣称可以不用写一句SQL的hibernate,一个是可以灵活调试动 ...

  3. Spring Boot 项目学习 (二) MySql + MyBatis 注解 + 分页控件 配置

    0 引言 本文主要在Spring Boot 基础项目的基础上,添加 Mysql .MyBatis(注解方式)与 分页控件 的配置,用于协助完成数据库操作. 1 创建数据表 这个过程就暂时省略了. 2 ...

  4. Spring Boot (七): Mybatis极简配置

    Spring Boot (七): Mybatis极简配置 1. 前言 ORM 框架的目的是简化编程中的数据库操作,经过这么多年的发展,基本上活到现在的就剩下两家了,一个是宣称可以不用写 SQL 的 H ...

  5. Spring Boot 2.X(五):MyBatis 多数据源配置

    前言 MyBatis 多数据源配置,最近在项目建设中,需要在原有系统上扩展一个新的业务模块,特意将数据库分库,以便减少复杂度.本文直接以简单的代码示例,如何对 MyBatis 多数据源配置. 准备 创 ...

  6. spring boot 结合Redis 实现工具类

    自己整理了 spring boot 结合 Redis 的工具类引入依赖 <dependency> <groupId>org.springframework.boot</g ...

  7. Spring Boot(八):RabbitMQ详解

    Spring Boot(八):RabbitMQ详解 RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多 ...

  8. [Spring] 学习Spring Boot之二:整合MyBatis并使用@Trasactional管理事务

    一.配置及准备工作 1.在 Maven 的 pom 文件中新增以下依赖: <dependency> <groupId>mysql</groupId> <art ...

  9. Spring Boot CRUD+分页(基于Mybatis注解方式)

    步骤一:关于Mybatis Mybatis 是用来进行数据库操作的框架.其中分页使用Mybatis中的PageHelper插件. Mybatis与hibernate对比: 1.hibernate是一个 ...

随机推荐

  1. 第8章 浏览器对象模型BOM 8.1 window对象

    ECMAScript是javascript的核心,但如果要在web中使用javascript,那么BOM(浏览器对象模型)则无疑是真正的核心.BOM提供了很多对象,用于访问浏览器的功能,在浏览器之间共 ...

  2. 【selenium】- selenium IDE的安装以及使用

    本文由小编根据慕课网视频亲自整理,转载请注明出处和作者. 1. 自动化测试工程师的任务 一个合格的自动化测试工程师,需要把框架搭建起来.让不是自动化测试的人,一个普通功能化测试的人,可以完成自动化测试 ...

  3. HDU-3478Catch二分图的否命题

    HDU-3478Catch 题意:考虑Thief能否: 由于我推着推着就想到必须要三点可以互通,和二分图的结论正好相反,所以就试了一发, 真没想到thief的初始位置是不用考虑的. 下面是ac代码: ...

  4. 复习+dfs

    1.参考:https://www.cnblogs.com/ckxkexing/p/8466097.html 这道题自己写过,还写过blog,但是第二次写还是不会. (于是开坑,想做做dfs的整理.

  5. Joyful HDU - 5245 概率问题

    Sakura has a very magical tool to paint walls. One day, kAc asked Sakura to paint a wall that looks ...

  6. codeforces 828 C. String Reconstruction(思维+优先队列)

    题目链接:http://codeforces.com/contest/828/problem/C 题解:有点意思的题目,可用优先队列解决一下具体看代码理解.或者用并查集或者用线段树都行. #inclu ...

  7. 牛客小白赛4 A 三角形 数学

    链接:https://www.nowcoder.com/acm/contest/134/A来源:牛客网 题目描述 铁子从森林里收集了n根木棍,她开始将它们按顺序的排成一排,从左到右依次为1到n,她回想 ...

  8. html/css中相对定位relative和绝对定位absolute的用法

    一.相对定位(position:relative) 1.相对定位:将盒子的position属性设置为relative:可通过left.top.right.bottom设置偏移量. 相对定位基础用法示例 ...

  9. 2018 Multi-University Training Contest 1(部分题解)

    Maximum Multiple Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  10. STM32F 系列单片机 调试记录

    1.RTC 配置 调一个 RTC,刚开始运行都正常,设置的时间跟读出的时间一样.但是换了一个芯片出现读出的年不对的情况,调试才发现是RTC设置的时候有些参数漏掉没填导致的. T_S32 DRIVER_ ...