zoukankan      html  css  js  c++  java
  • Spring Boot (八): Mybatis 增强工具 MyBatis-Plus

    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官方文档》

  • 相关阅读:
    Vue.js实现的计算器功能完整示例
    vue实现简易计算器
    Vuex中mutations与actions的区别详解
    两个子组件之间的传值
    JS操作元素节点(非常详细)
    js包装类
    Vue Router 的params和query传参的使用和区别(详尽)
    初步了解生命周期
    简单介绍一下Progressive Web App(PWA)
    webpack学习笔记(阮一峰教程demo)
  • 原文地址:https://www.cnblogs.com/babycomeon/p/11633476.html
Copyright © 2011-2022 走看看