1. 程式人生 > >Spring Boot (八): Mybatis 增強工具 MyBatis-Plus

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官方文件