通用 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 目錄
新增功能和引數
增加
@RegisterMapper
自動註冊 Mapper 介面標記通用 Mapper 所有已有方法都增加了該註解,MapperHelper 中實現對該註解的檢測和自動配置。
實現自己的基類介面時也可以自己新增,例如:
@RegisterMapper public interface MyMapper<T> extends Mapper<T> { }
增加該註解後會自動註冊該介面到通用 Mapper(不需要配置
mappers
引數指定該介面了)。即使不增加該介面,如果只用到了通用 Mapper 提供的方法,也可以自動註冊,通用 Mapper 會自動向上查詢帶有該註解的父介面。
如果是自己開發的通用方法,建議加上該註解,否則還需要自己配置 mappers 引數。
增加
@KeySql
註解,用於配置主鍵策略,替換 JPA 中的複雜用法,可以檢視 2.3 主鍵策略 瞭解詳細用法。增加
resolveClass
引數,可以配置EntityResolve
介面的實現類,可以替換預設轉換 entity 到 table 的過程,替換後原來支援的一些配置會失效。當特殊型別的欄位標記
@Column
或@ColumnType
註解時,可以作為表字段進行使用(例如列舉,複雜型別,需要配合 TypeHandler)。EntityColumn
增加 blob 屬性,給 WithBLOBs 系列方法做準備。增加引數
usePrimitiveType
,配置為true
後,簡單型別會包含 8 種基本型別。引入 MyBatis 中的 Log 介面,方便記錄更多的操作資訊。
增加
safeDelete
引數,配置為true
後,delete
和deleteByExample
都必須設定查詢條件才能刪除,否則會丟擲異常(org.apache.ibatis.exceptions.PersistenceException
)。增加
safeUpdate
引數,配置為true
後,updateByExample
和updateByExampleSelective
都必須設定查詢條件才能更新,否則會丟擲異常(org.apache.ibatis.exceptions.PersistenceException
)。常用的兩個updateByPrimaryKey
和updateByPrimaryKeySelective
由於要求必須使用主鍵,不存在這個問題。增加
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 物件型別。