1. 程式人生 > >通用 Mapper 4.0.0 版本釋出

通用 Mapper 4.0.0 版本釋出

通用 Mapper4 是一個可以實現任意 MyBatis 通用方法的框架,專案提供了常規的增刪改查操作以及Example 相關的單表操作。通用 Mapper 是為了解決 MyBatis 使用中 90% 的基本操作,使用它可以很方便的進行開發,可以節省開發人員大量的時間。

4.0 更新日誌

此次更新最大的變化是專案結構調整了,將原來的 mapper 拆分成了 core, base, extra, generator, spring 五個子模組,將獨立的 mapper-weekend 和 spring-boot-starter 專案新增到 mapper 中作為兩個子專案,拆分後的整個專案如下:

  • all - 為了方便開發人員使用,遮蔽模組細節,提供的整合,下面兩個子模組是具體實現,具體包含了 core, base, extra, generator, spring, weekend 六個專案。
    • dependencies - 以依賴方式整合,包含 tk.mybatis:mapper 的完整功能。
    • mapper - 通過 maven-shade-plugin 打包整合,和原來的 tk.mybatis:mapper 完全一樣,並且 Maven 座標就是 tk.mybatis:mapper。
  • base - 所有 Mapper<T> 等介面的實現,獨立出來後方便整體替換這部分實現。
  • core - 通用 Mapper 的核心,依賴 core 可以實現自己的通用方法,base 就是以此為依賴的一種實現。
  • extra - base 方法擴充套件,提供有侷限性的通用介面。
  • generator - 程式碼生成器,包含了通用 Mapper 程式碼生成器和一個通用的全功能程式碼生成器外掛。
  • spring - 通用 Mapper 和 Spring 整合需要的關鍵類,重寫了 MyBatis 幾個實現類。
  • spring-boot-starter - 通用 Mapper 和 Spring Boot 整合。
  • weekend - 基於 Java8 方法引用的 Example 替代物件 Weekend,可以避免字串形式的欄位名。

除了上面的模組外,mapper 下面還有一個 wiki 目錄,該目錄是對 wiki 倉庫的引用,wiki 的兩個倉庫分別如下:

此外,專案中各個模組的父依賴為 mapper-parent 專案:

全新文件

Wiki 地址

Wiki 目錄

新增功能和引數

  1. 增加 @RegisterMapper 自動註冊 Mapper 介面標記

    通用 Mapper 所有已有方法都增加了該註解,MapperHelper 中實現對該註解的檢測和自動配置。

    實現自己的基類介面時也可以自己新增,例如:

    @RegisterMapper
    public interface MyMapper<T> extends Mapper<T> {
    
    }

    增加該註解後會自動註冊該介面到通用 Mapper(不需要配置 mappers 引數指定該介面了)。

    即使不增加該介面,如果只用到了通用 Mapper 提供的方法,也可以自動註冊,通用 Mapper 會自動向上查詢帶有該註解的父介面。

    如果是自己開發的通用方法,建議加上該註解,否則還需要自己配置 mappers 引數。

  2. 增加 @KeySql 註解,用於配置主鍵策略,替換 JPA 中的複雜用法,可以檢視 2.3 主鍵策略 瞭解詳細用法。

  3. 增加 resolveClass 引數,可以配置 EntityResolve 介面的實現類,可以替換預設轉換 entity 到 table 的過程,替換後原來支援的一些配置會失效。

  4. 當特殊型別的欄位標記 @Column@ColumnType 註解時,可以作為表字段進行使用(例如列舉,複雜型別,需要配合 TypeHandler)。

  5. EntityColumn 增加 blob 屬性,給 WithBLOBs 系列方法做準備。

  6. 增加引數 usePrimitiveType,配置為 true 後,簡單型別會包含 8 種基本型別。

  7. 引入 MyBatis 中的 Log 介面,方便記錄更多的操作資訊。

  8. 增加 safeDelete 引數,配置為 true 後,deletedeleteByExample 都必須設定查詢條件才能刪除,否則會丟擲異常(org.apache.ibatis.exceptions.PersistenceException)。

  9. 增加 safeUpdate 引數,配置為 true 後,updateByExampleupdateByExampleSelective 都必須設定查詢條件才能更新,否則會丟擲異常(org.apache.ibatis.exceptions.PersistenceException)。常用的兩個 updateByPrimaryKeyupdateByPrimaryKeySelective 由於要求必須使用主鍵,不存在這個問題。

  10. 增加 useJavaType 引數,設定 true 時如{id, javaType=java.lang.Long},對於使用 User extends Pk<Long> 形式時,需要設定,否則 mybatis 低版本(<3.4.0) 無法識別型別。

新增的引數可以參考 配置介紹

完善和修復問題

  • 解決使用 Config 物件配置通用 Mapper 時,部分引數不起作用的問題
  • 新增完善 @ColumnType 註解的測試用例
  • 新增完善 Id,Table,Column 三個註解的測試
  • 增加全面的 TypeHandler 測試。
  • update 上面的 @Options 註解在 3.2.x 版本時會影響清空二級快取,已經去掉該註解。
  • 相容 Spring Boot 2.0.0-RELEASE 版本。

移除的功能或引數

  • 移除 UUID 引數,不再支援 OGNL 方式對主鍵設定 UUID,如果有需要請通過 SQL 方式。
  • 移除對 @SequenceGenerator 註解的支援,IDENTITY 引數去掉了該註解提供的序列名,現在支援3個引數,順序為列名({0})、屬性名({1})、表名({2})。

專案升級

只需要升級版本號,例如通用 Mapper:

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper</artifactId>
    <version>4.0.0</version>
</dependency>

使用 Spring Boot 時:

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>

雖然專案拆分了,但是在專案打包釋出上遮蔽了這些細節。

後續如果想要更深入的定製,還可以按下面的方式引入依賴:

<!-- 必備依賴,提供核心功能 -->
<dependency>
  <groupId>tk.mybatis</groupId>
  <artifactId>mapper-core</artifactId>
  <version>${mapper-core.version}</version>
</dependency>
<!-- 如果需要通用 Mapper 自帶的 Mapper 介面和系列方法,需要引入本依賴 -->
<!-- 拆分 base 專案的目的在於以後可能會提供其他的方式來實現介面 -->
<dependency>
  <groupId>tk.mybatis</groupId>
  <artifactId>mapper-base</artifactId>
  <version>${mapper-base.version}</version>
</dependency>
<!-- 針對開發人員的需要提供的一些額外的介面,都有特殊的使用要求 -->
<dependency>
  <groupId>tk.mybatis</groupId>
  <artifactId>mapper-extra</artifactId>
  <version>${mapper-extra.version}</version>
</dependency>
<!-- 基於 Java8 方法引用的類 Example 物件 Weekend -->
<dependency>
  <groupId>tk.mybatis</groupId>
  <artifactId>mapper-weekend</artifactId>
  <version>${mapper-weekend.version}</version>
</dependency>
<!-- 程式碼生成器 -->
<dependency>
  <groupId>tk.mybatis</groupId>
  <artifactId>mapper-generator</artifactId>
  <version>${mapper-generator.version}</version>
</dependency>
<!-- Spring 整合必備 -->
<dependency>
  <groupId>tk.mybatis</groupId>
  <artifactId>mapper-spring</artifactId>
  <version>${mapper-spring.version}</version>
</dependency>
<!-- Spring Boot 自動配置 -->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>${mapper-starter.version}</version>
</dependency>

以後會提供稍微複雜的示例,比如增加一個 mapper-base 的替代,用於實現下面這種型別的介面定義:

public interface Mapper<T, P, E> extends xxx,xxx {}

其中 T,P,E 分別代表實體類型別,主鍵型別,Example 物件型別。