1. 程式人生 > >Mybatis詳解系列(五)--Mybatis Generator和全註解風格的MyBatis3DynamicSql

Mybatis詳解系列(五)--Mybatis Generator和全註解風格的MyBatis3DynamicSql

# 簡介 Mybatis Generator (MBG) 是 Mybatis 官方提供的程式碼生成器,通過它可以在專案中自動生成簡單的 CRUD 方法,甚至**“無所不能”**的高階條件查詢(**MyBatis3DynamicSql** ),讓我們避免了進行資料庫互動時需要手動建立物件和配置 Mybatis 對映等基礎工作。 另外,MBG 有很好地擴充套件性,它提供了大量的介面和外掛用來給我們自定義生成的程式碼應該是什麼樣子,例如我們可以自定義註釋、程式碼格式化、新增 toString 方法等。本文將講解如何使用這些介面。 本文內容大致如下,由於篇幅較長,可選擇閱讀: 1. 如何使用 MBG 生成程式碼; 2. 詳解 MBG 的配置,將配置使用自定義註釋生成器、實體類中新增 toString/equals/hashCode方法等。 3. MyBatis3DynamicSql 風格(無 XML) API 的使用。 通過本文的學習,你將能夠通過簡單改造 MBG 來生成自己想要的程式碼,另外,我們也將認識強大的 MyBatis3DynamicSql 風格(它提供的條件類使用 Lambda 解耦,全註解,支援單表查詢、多表查詢、分頁、排序、分組等等)。 # 關於 MBG 生成程式碼的風格 MBG 支援生成**不同風格**、不同語言的程式碼,例如,MBG 能夠生成 Java 或 Kotlin 程式碼。另外,MBG 支援生成舊版的 MyBatis3 風格(**我們常用的 xml 配置屬於 MyBatis3 風格,官方認為這種風格已經過時**),也支援新版的 MyBatis3DynamicSql 的風格(**MyBatis3DynamicSql 風格為官方推薦**)。幾種風格的對比如下: | 程式碼風格 | 描述 | | ------------------ | ------------------------------------------------------------ | | MyBatis3DynamicSql | 預設風格,官方推薦
Java程式碼
全註解,不生成 XML 檔案
生成的高階條件查詢靈活性較大,使用 lambda 表示式避免條件物件滲透到上一層
一個表生成一個實體類
| | MyBatis3Kotlin | Kotlin 程式碼,本文不涉及 | | MyBatis3 | 早期風格
Java程式碼
能夠生成 MyBatis3 相容的 xml 或 全註解
生成的高階條件查詢靈活性較小,條件類滲透到上一層,而且 sql 和程式碼耦合度較高
一個表除了生成基本類,可能還會生成主鍵類和BLOB類(如果指定的話)
| | MyBatis3Simple | MyBatis3 的簡易版
Java程式碼
能夠生成 MyBatis3 相容的 xml 或 全註解
不生成 "by example" 或 "selective" 的方法
一個表生成一個實體類
| 由於 MyBatis3 風格生成的 Example 類存在的問題,**實際專案中建議使用 MyBatis3Simple 風格或官方推薦的 MyBatis3DynamicSql 風格**。 # 關於 MBG 檔案覆蓋的問題 當我們在迭代開發環境中使用 MBG,需要注意檔案覆蓋的問題,預設情況下,檔案覆蓋規則如下: 1. 如果 XML 已經存在,MBG 會採用檔案合併的方式。 它不會修改你自定義的節點,但是會更新原來生成的 CRUD 節點(如果表發生變化)。**檔案合併有個前提,就是原來生成的 CRUD 節點必須包含 @mbg.generated 的預設註釋**。否則,當再次執行 MBG 時,它將無法識別哪些是它生成過的節點,於是會出現下圖的情況,即 CRUD 節點被重複插入。 ![https://img2020.cnblogs.com/blog/1731892/202005/1731892-20200502235440091-1666766703.png) 2. 如果 Java 或 Kotlin 檔案已經存在,MBG 可以覆蓋現有檔案或使用其他唯一名稱儲存新生成的檔案,這取決於你如何配置`false
`。 那麼,下面開始詳細介紹如何使用 MBG。 # 專案環境的說明 ## 工程環境 JDK:1.8.0_231(要求 JDK8 及以上) maven:3.6.1 IDE:Spring Tool Suites4 for Eclipse 4.12 mysql:5.7.28 ## 資料庫指令碼 具體的 sql 指令碼也提供好了([指令碼路徑]( https://github.com/ZhangZiSheng001/mybatis-projects/sql))。 # maven配置 ## pom.xml配置 MBG 支援使用**Java 程式碼、maven 外掛、Eclipse 外掛等**方式執行,本文使用 maven 外掛方式,所以需要在 build/plugins 節點引入 MBG 外掛,並加入其它依賴項,例如 mybatis、mysql 驅動等。另外,因為本文也需要用到 Java 程式來執行 MBG(當使用自定義類時),所以把外掛的依賴項從 build/plugins/plugin 節點中單獨取出來。 ```xml org.mybatis.generator
mybatis-generator-core 1.4.0
org.mybatis mybatis 3.5.4 org.mybatis.dynamic-sql mybatis-dynamic-sql 1.1.4 mysql mysql-connector-java 8.0.15 ch.qos.logback logback-core 1.2.3 jar ch.qos.logback logback-classic 1.2.3 jar
org.mybatis.generator mybatis-generator-maven-plugin 1.4.0 Generate MyBatis Artifacts package generate true default false ${basedir}/src/main/resources/generatorConfig.xml true ``` ## 外掛引數詳解 plugin/configuration 節點可以配置影響 MBG 行為的引數,如下: | 引數 | 表示式 | 型別 | 描述 | | --------------------------------------------------- | ----------------------------------------------- | ---------------- | ------------------------------------------------------------ | | configurationFile | ${mybatis.generator.configurationFile} | java.io.File | 配置檔案路徑。
預設為${basedir}/src/main/resources/generatorConfig.xml | | contexts | ${mybatis.generator.contexts} | java.lang.String | 指定使用配置檔案中的哪個context
多個用逗號隔開 | | jdbcDriver | ${mybatis.generator.jdbcDriver} | java.lang.String | JDBC 驅動 | | jdbcPassword | ${mybatis.generator.jdbcPassword} | java.lang.String | JDBC 密碼 | | jdbcURL | ${mybatis.generator.jdbcURL} | java.lang.String | JDBC URL | | jdbcUserId | ${mybatis.generator.jdbcUserId} | java.lang.String | JDBC 使用者名稱 | | outputDirectory | ${mybatis.generator.outputDirectory} | java.io.File | MBG 檔案輸出路徑。只有在配置檔案中配置targetProject="MAVEN"(區分大小寫),才會使用這個路徑。
預設為${project.build.directory}/generated-sources/mybatis-generator | | overwrite | ${mybatis.generator.overwrite} | boolean | 是否覆蓋已經存在的同名Java檔案。
如果為true,Java檔案將被覆蓋。 如果為false,MBG會將新生成唯一名稱的Java檔案(例如MyClass.java.1,MyClass.java.2)
預設為false | | sqlScript | ${mybatis.generator.sqlScript} | java.lang.String | 生成程式碼之前需要執行的SQL指令碼路徑。
如果指定,則必須提供jdbcDriver,jdbcURL、jdbcUserId、jdbcPassword。 | | tableNames | ${mybatis.generator.tableNames} | java.lang.String | 需要生成程式碼的表
多個用逗號隔開 | | verbose | ${mybatis.generator.verbose} | boolean | 是否列印日誌
預設為false | | includeCompileDependencies | ${mybatis.generator.includeCompileDependencies} | boolean | 如果為true,則作用域為“ compile”,“ provided”和“ system”的依賴將新增到生成器的類路徑中。
預設為false | | includeAllDependencies | ${mybatis.generator.includeAllDependencies} | boolean | 如果為true,則所有作用域的依賴將新增到生成器的類路徑中。
預設為false | | skip | ${mybatis.generator.skip} | boolean | 專案啟動時跳過 MBG。
預設false | # 程式碼生成規則配置 使用 maven 外掛的方式不需要編寫程式碼,只要將規則配置到 generatorConfig.xml 檔案就行,配置內容主要為: 1. 如何連線到資料庫 2. 生成什麼物件,以及如何生成它們 3. 哪些表將用於物件生成 下面先給一個簡單版的,後面再具體講解這些引數的意義: ```xml
``` # 命令執行 ## maven 外掛的執行方式 maven build,輸入`mybatis-generator:generate`,生成成功。 ## Java程式的執行方式 通常情況下,我們都是使用 maven 外掛的方式,但是,當我們在 MBG 中指定了自定義的實現,使用 maven 外掛可能會報錯,這個時候就需要通過 Java 程式的方式執行 MBG,具體方法如下: ```java public static void main(String[] args) throws Exception { // LogFactory.forceSlf4jLogging(); // System.setProperty("user.name", "zzs"); // 這個集合記錄著生成、合併、覆蓋檔案的資訊 List warnings = new ArrayList(); InputStream in = MybatisGenerator.class.getClassLoader().getResourceAsStream("generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(in); // 不覆蓋 Java 檔案 boolean overwrite = false; DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); // 生成檔案 myBatisGenerator.generate(null); // 列印資訊 warnings.forEach(System.err::println); } ``` # 生成規則詳解 generatorConfig.xml 的頂層結構如下: - generatorConfiguration(配置) - classPathEntry(JDBC驅動路徑) - properties(properties檔案路徑) - context(生成物件的環境) - property(Context作用域引數) - jdbcConnection(JDBC連線) - connectionFactory(JDBC連線工廠) - commentGenerator(註釋生成器) - javaModelGenerator(實體物件生成器) - javaClientGenerator(Mapper 介面或實現類生成器) - sqlMapGenerator(xml 生成器) - table(用於生成物件的表) - javaTypeResolver(Java 型別處理器) - plugin(外掛) 下面選擇部分節點展開分析: ## context* ` `節點用於指定生成一系列物件的環境。我們可以在配置檔案中配置多個` `節點來實現從**不同資料來源**或採用不同生成引數生成物件。 ### 屬性 這裡最重要的屬性是**targetRuntime**,它直接決定該環境下生成的程式碼風格,常用的風格為 MyBatis3DynamicSql 和 MyBatis3Simple。 | 屬性 | 描述 | | ---------------------- | ------------------------------------------------------------ | | id | 用於唯一標識指定環境。必選屬性 | | defaultModelType | 指定實體物件的型別。包括三種:
**flat**:一個表生成一個實體類;
**conditional**:和 hierarchical 差不多,區別在於如果表只有一個主鍵,不會單獨去生成一個主鍵類;
**hierarchical**:除了生成基本類,如果表中包含主鍵或 BLOB 列,都會單獨再生成一個主鍵類或BLOB類
**預設為 conditional**,如果 targetRuntime 為 "MyBatis3Simple"、"MyBatis3DynamicSql"或"MyBatis3Kotlin",則該屬性忽略 | | **targetRuntime** | 用於指定生成程式碼的風格。預設為 MyBatis3DynamicSql | | introspectedColumnImpl | 指定`org.mybatis.generator.api.IntrospectedColumn`實現類。該類可以看成是某一列的所有資訊 | ### 子節點 ` `包含以下子節點: - `` (0..N) - `` (0..N) - `` (0 or 1) - `/` (1 Required) - `` (0 or 1) - `` (1 Required) - `` (0 or 1) - `` (0 or 1) - `` (1..N) 其中,``支援以下引數。其中,針對 mysql 資料庫,可以將定界符修改為反單引號。如果想要使用自定義的程式碼格式或 XML 格式,可以配置自定義實現。 | 引數名 | Property Values | | :------------------ | :----------------------------------------------------------- | | autoDelimitKeywords | 如果資料庫關鍵字被作為列名使用,MBG 是否需要對其進行定界。
預設為false | | beginningDelimiter | 指定定界符的開頭,預設為" | | endingDelimiter | 指定定界符的結尾,預設為" | | javaFileEncoding | 指定處理 Java 檔案使用的編碼 | | javaFormatter | 指定生成 Java 程式碼使用的格式化器。
如果自定義的話需要實現`org.mybatis.generator.api.JavaFormatter` 介面並提供無參構造,預設為`org.mybatis.generator.api.dom.DefaultJavaFormatter` | | targetJava8 | 指定生成 Java 程式碼使用的 JDK 版本 | | kotlinFileEncoding | 不涉及 | | kotlinFormatter | 不涉及 | | xmlFormatter | 指定生成 XML 檔案使用的格式化器。如果自定義的話需要實現`org.mybatis.generator.api.XmlFormatter` 介面並提供無參構造,預設為`org.mybatis.generator.api.dom.DefaultXmlFormatter` | ## jdbcConnection ` `節點用於指定 MBG 進行資料庫互動所用的 JDBC 連線。**注意,` `和` `節點只要一個就行了**。 ### 屬性 | 屬性 | 描述 | | :------------ | :------------------ | | driverClass | JDBC 驅動。必選屬性 | | connectionURL | JDBC URL。必選屬性 | | userId | 使用者名稱 | | password | 密碼 | ### 子節點 `` (0..N):用於定義 JDBC 驅動所需的一些引數,較少用到。 ## connectionFactory ` `節點用於指定和配置 MBG 進行資料庫互動時獲取 JDBC 連線的工廠。**注意,` `和` `節點只要一個就行了**。 ### 屬性 | 屬性 | 描述 | | :--- | :----------------------------------------------------------- | | type | 用於指定 連線工廠的類。必選屬性
如果自定義的話需要實現`org.mybatis.generator.api.ConnectionFactory` 介面並提供無參構造,預設為`org.mybatis.generator.internal.JDBCConnectionFactory` | ### 子節點 ` `的子節點為`` (0..N),引數如下表。如果是使用預設的連線工廠,這幾個引數必須按照下表的提供,但是,如果是自定義的連線工廠,需要提供什麼引數由你自己決定。 | 引數 | 描述 | | :------------ | :-------- | | driverClass | JDBC 驅動 | | connectionURL | JDBC URL | | userId | 使用者名稱 | | password | 密碼 | ### 如何使用HikariCP作為 MBG 的連線工廠 這裡我簡單的實現了一個連線工廠: ```java public class HikariConnectionFactory implements ConnectionFactory { private DataSource dataSource; public HikariConnectionFactory() { super(); HikariConfig config = new HikariConfig("/hikari.properties"); dataSource = new HikariDataSource(config); } @Override public Connection getConnection() throws SQLException { return dataSource.getConnection(); } @Override public void addConfigurationProperties(Properties properties) { // do nothing } } ``` 將它配置到 XML 檔案中,這時我們不需要新增任何的``子節點。 ```xml ``` 使用 Java 程式執行 MBG,可以看到程式碼可以正常生成。 ## commentGenerator* ` `節點用於指定和配置 Java 程式碼或 XML 檔案中使用的註釋生成器。**預設的註釋生成器比較雞肋,一般我們都會考慮自己實現**。 ### 屬性 | 屬性 | 描述 | | :--- | :----------------------------------------------------------- | | type | 用於指定註釋生成器的類。
如果自定義的話需要實現`org.mybatis.generator.api.CommentGenerator`介面並提供無參構造,預設為`org.mybatis.generator.internal.DefaultCommentGenerator` | ### 子節點 ` `的子節點為`` (0..N),引數如下表。注意,這些引數是針對預設註釋生成器的,如果是自定義的,需要提供什麼引數由你自己決定。 | Property Name | Property Values | | :------------------ | :----------------------------------------------------------- | | suppressAllComments | 是否不生成任何註解。
預設為false。注意,前面提到過,MBG 通過註釋中的`@mbg.generated`來判斷某個元素是不是通過 MBG 生成,如果不生成註解的話,XML 的檔案覆蓋功能會受到影響。 | | suppressDate | 是否在註釋中不包含時間。
預設為false。 | | addRemarkComments | 是否在註釋中包含列的註釋
預設為false | | dateFormat | 指定時間格式
例如:yyyy-MM-dd HH:mm:ss | ### 自定義註釋生成器 想要自定義註釋生成器需要實現`org.mybatis.generator.api.CommentGenerator`介面並提供無參構造,在本專案中,我在`DefaultCommentGenerator`的基礎上改造了一個註釋生成器,感興趣的可以移步到[專案原始碼](https://github.com/ZhangZiSheng001/mybatis-projects/tree/master/mybatis-generator/src/main/java/MyCommentGenerator.java)。 注意,**編寫自定義註解生成器時應該考慮在xml節點的註釋中加入@mbg.generated來維持 MBG 檔案合併的功能**。 下面簡單舉個例子,MBG 生成的實體類屬性的註解是這樣的: ```java /** * Database Column Remarks: * 員工id * * This field was generated by MyBatis Generator. * This field corresponds to the database column demo_employee.id * * @mbg.generated Sat May 02 12:52:28 CST 2020 */ private String id; ``` 但是,我不想要這種註釋,這時,我們可以改造以下方法: ```java @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { if (suppressAllComments) { return; } field.addJavaDocLine("/**"); // 獲取列註釋並加入到註解中 String remarks = introspectedColumn.getRemarks(); if (addRemarkComments && StringUtility.stringHasValue(remarks)) { String[] remarkLines = remarks.split(System.getProperty("line.separator")); for (String remarkLine : remarkLines) { field.addJavaDocLine(" *

" + remarkLine + "

"); } } field.addJavaDocLine(" */"); } ``` 並且在 XML 中進行如下配置: ```xml ``` 使用 Java 程式執行 MBG,可以看到實體類屬性的註釋變成我們想要的樣子。 ```java /** *

員工id

*/ private String id; ``` ## javaTypeResolver ` `節點用於指定和配置 Java 型別解析器。預設的解析器可能會將資料庫型別 decimal 或 numberic 解析為`Short`、`Integer`、`Long`等 Java 型別,如果我們不希望這樣解析,就需要使用到這個節點。 Java 型別解析器使用預設的就行,一般不會去重寫它。 ### 屬性 | Attribute | Description | | :-------- | :----------------------------------------------------------- | | type | 用於指定Java 型別解析器的類。
如果自定義的話需要實現`org.mybatis.generator.api.JavaTypeResolver`並提供無參構造,預設為`org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl`,它會將資料庫型別 decimal 或 numberic 解析為 Integer 的 Java 型別 | ### 子節點 ` `的子節點為`` (0..N),引數如下表。注意,這些引數是針對預設註釋生成器的,如果是自定義的,需要提供什麼引數由你自己決定。 | Property Name | Property Values | | :--------------- | :----------------------------------------------------------- | | forceBigDecimals | 是否強制將資料庫型別 decimal 或 numberic 解析為 BigDecimal 型別。
預設為false,會根據**資料的小數點位數和長度**來決定使用 Short、Integer、Long 或 BigDecimal。 | | useJSR310Types | 是否不強制將資料庫型別 date, time 和 timestamp 解析為 Date
預設為false,如果為true,解析規則將變成:date -> LocalDate,time -> LocalTime,timestamp -> LocalDateTime | ## javaModelGenerator ` `節點用於配置實體類生成器。實體類生成器不支援自定義。 ### 屬性 | Attribute | Description | | :------------ | :----------------------------------------------------------- | | targetPackage | 指定存放生成類的包路徑。必選屬性 | | targetProject | 指定 targetPackage 的原始檔夾。必選屬性
注意,如果該資料夾不存在,將會報錯 | ### 子節點 ` `的子節點為`` (0..N),引數如下表。用的比較多的是 rootClass 和 trimStrings。 | Property Name | Property Values | | :------------------- | :----------------------------------------------------------- | | constructorBased | 是否生成包含全部引數的構造方法。
預設為false。當為true時,除了生成指定構造,還會生成對應的 resultMap。 | | enableSubPackages | 是否在targetPackage基礎上生成子包。
預設為false。當為true時,會將表所在 schema 名作為子包名 | | exampleTargetPackage | 指定 Example 條件類的生成路徑
預設和 targetPackage 相同 | | exampleTargetProject | 指定 exampleTargetPackage 的原始檔夾
預設和 targetProject 相同 | | immutable | 如果為 true,生成的實體類將不包含 setter 方法,但會提供包含所有引數的構造。
預設為 false | | **rootClass** | 指定實體類需要繼承的父類。 | | **trimStrings** | 在setter方法中是否對傳入字串進行 trim 操作
預設為 false。 | ## javaClientGenerator ``節點用於指定和配置客戶端類生成器。這個節點是可選的,如果不指定,則不會生成客戶端類。客戶端類一般指的是 Mapper 介面及 Mapper 介面的一些輔助類,例如`SqlProvider` 。 ### 屬性 下面的 type 屬性僅針對 MyBatis3Simple 和 MyBatis3 風格生效,而且 MyBatis3Simple 風格不支援 MIXEDMAPPER。 | 屬性 | 描述 | | :------------ | :----------------------------------------------------------- | | type | 用於指定使用客戶端類生成器的類。
如果自定義的話需要實現`org.mybatis.generator.codegen.AbstractJavaClientGenerator`並提供無參構造,MBG 為我們提供了以下幾種:
1. **ANNOTATEDMAPPER**:包含 Mapper 介面和 SqlProvider 輔助類,全註解,不包含 XML 檔案;
2. **XMLMAPPER**:包含 Mapper 介面和 XML 檔案,不包含註解;
3. **MIXEDMAPPER**:包含 Mapper 介面和 XML 檔案,簡單的 CRUD 使用註解,高階條件查詢使用 XML 檔案。 | | targetPackage | 指定存放生成類的包路徑。必選屬性 | | targetProject | 指定存放生成類的包路徑。必選屬性 | ### 子節點 ` `的子節點為`` (0..N),引數如下表。注意,這些引數是針對預設註釋生成器的,如果是自定義的,需要提供什麼引數由你自己決定。 | Property Name | Property Values | | :---------------- | :----------------------------------------------------------- | | enableSubPackages | 是否在 targetPackage 基礎上生成子包。
預設為 false。當為 true 時,會將表所在 schema 名作為子包名 | | rootInterface | 指定 Mapper 介面需要實現的父介面。 | | useLegacyBuilder | 是否使用過時的`SqlBuilder`來構造動態語句。
預設為 false | ## sqlMapGenerator ` `節點用於配置 XML 生成器,不支援自定義。 ### 屬性 | Attribute | Description | | :------------ | :---------------------------------- | | targetPackage | 指定存放生成 XML 的包路徑。必選屬性 | | targetProject | 指定存放生成 XML 的包路徑。必選屬性 | ### 子節點 ` `的子節點為`` (0..N),引數如下表。 | Property Name | Property Values | | :---------------- | :----------------------------------------------------------- | | enableSubPackages | 是否在targetPackage基礎上生成子包。
預設為false。當為true時,會將表所在 schema 名作為子包名 | ## table* `
`節點用於指定需要用於生成物件的表以及配置某些生成規則。這個節點相比前面提到的,要更加複雜一些。 ### 屬性 `
`節點支援的屬性很多,一般保持預設就可以了。 | Attribute | Description | | :----------------------------------------------------------- | :----------------------------------------------------------- | | **tableName** | 需要用於生成物件的表名。必選屬性
允許使用 SQL 萬用字元,例如:demo_% | | schema | 指定資料庫 schema
允許使用 SQL 萬用字元 | | catalog | 指定資料庫 catalog | | alias | 指定查詢時欄位別名字首。
如果指定,生成的 select 語句將使用alias_actualColumnName的別名 | | **domainObjectName** | 指定實體類的類名。
預設情況下使用駝峰命名規則 | | mapperName | 指定 Mapper 介面名
預設為實體類名+Mapper | | sqlProviderName | 指定 SqlProvider 介面名
預設為實體類名+SqlProvider | | enableInsert
enableSelectByPrimaryKey
enableSelectByExample
enableUpdateByPrimaryKey
enableDeleteByPrimaryKey
enableDeleteByExample
enableCountByExample
enableUpdateByExample
| 是否生成指定語句
預設為true | | selectByPrimaryKeyQueryId
selectByExampleQueryId | 如果指定,在select 語句中將新增 'value' as QUERYID | | modelType | 指定實體物件的型別。context節點中已介紹過了 | | escapeWildcards | 當 schema 或 tableName 包含 SQL 萬用字元時,在搜素列時是否對其進行轉義 | | delimitIdentifiers | 是否在 SQL 中對錶名使用定界符並且使用確定的表名大小寫
預設為false | | delimitAllColumns | 是否在 SQL 中對所有列名都新增定界符
預設為false | ### 子節點 `
`的子節點如下: `` (0..N) `` (0 or 1) `` (0 or 1) `` (0 or 1) `` (0..N) `` (0..N) `` (0..N) 這幾個子節點中,常用到的是``,其他的用的比較少。下面挑幾個來分析下: #### property ``配置的大部分引數都是為了覆蓋全域性的配置,並不常用。 | Property Name | Property Values | | :------------------------ | :----------------------------------------------------------- | | constructorBased | 是否生成包含全部引數的構造方法。
預設為false。當為true時,除了生成指定構造,還會生成對應的 resultMap。 | | ignoreQualifiersAtRuntime | 在生成的 SQL 中,表名前是否不新增 schema 或 catalog
預設為 false | | immutable | 如果為 true,生成的實體類將不包含 setter 方法,但會提供包含所有引數的構造。
預設為 false | | modelOnly | 是否只生成實體類
預設為 false | | rootClass | 指定實體類需要繼承的父類。 | | rootInterface | 指定 Mapper 介面需要實現的父介面。 | | runtimeCatalog | 指定 SQL 中使用的 catalog | | runtimeSchema | 指定 SQL 中使用的 schema | | runtimeTableName | 指定 SQL 中使用的 tableName | | selectAllOrderByClause | 指定`selectAll`方法中加入order by 'value' | | trimStrings | 在實體類的 setter 方法中是否對傳入字串進行 trim 操作
預設為 false。 | | useActualColumnNames | 是否直接使用表名作為實體類類名。
預設為false | | useColumnIndexes | 是否在 resultMap 中使用索引而不使用列名進行對映 | | useCompoundPropertyNames | 是否將“列名+列註釋”作為實體類的屬性名 | #### domainObjectRenamingRule/columnRenamingRule ``節點一般用於重新命名實體類類名。 例如,在沒有指定 domainObjectName 的情況下,demo_employee 的表將生成實體類 DemoEmloyee,但我希望去掉前面的 Demo 字首,則可以這樣處理: ```xml
``` 另一個子節點` `也是相同的用法。 ```xml
``` #### ignoreColumnsByRegex/ignoreColumn ``和``節點用於告訴 MBG 生成程式碼時忽略某些列。使用方法如下。 ```xml
``` ## plugin* ``節點用於定義和配置外掛。這個節點只有一個 type 屬性,用於指定使用哪個外掛,並通過子節點 property 來為這個外掛設定引數。 如果自定義的話需要實現`org.mybatis.generator.api.Plugin`介面,並提供無參構造。MBG 為我們提供了許多好用的外掛,如下: | 外掛 | 描述 | | --------------------------------------------------------- | ------------------------------------------------------------ | | org.mybatis.generator.plugins.SerializablePlugin | 用於在實體類中實現`java.io.Serializable`介面 | | **org.mybatis.generator.plugins.ToStringPlugin** | 用於在實體類中新增 toString 方法 | | **org.mybatis.generator.plugins.EqualsHashCodePlugin** | 用於在實體類中新增 equals 和 hashCode 方法。 | | org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin | 用於指定不合並 XML 檔案,這時 MBG 將 採用處理 Java 檔案的方式來處理 XML 檔案 | | org.mybatis.generator.plugins.CachePlugin | 用於在 xml 檔案中加入cache節點 | | org.mybatis.generator.plugins.CaseInsensitiveLikePlugin | 用於在 Example 類中生成不區分大小寫的Like | | org.mybatis.generator.plugins.dsql.DisableDeletePlugin | 禁用 MyBatisDynamicSQLV2 風格的所有刪除方法 | | org.mybatis.generator.plugins.dsql.DisableInsertPlugin | 禁用 MyBatisDynamicSQLV2 風格的所有插入方法 | | org.mybatis.generator.plugins.dsql.DisableUpdatePlugin | 禁用 MyBatisDynamicSQLV2 風格的所有更新方法 | | org.mybatis.generator.plugins.FluentBuilderMethodsPlugin | 用於在實體類中新增`MyDomainClass withValue(Object v)`方法。通過它可以實現如下賦值方式:
`new Employee().withAddress("北京").withDeleted(false).withName("zzs001");` | | **org.mybatis.generator.plugins.MapperAnnotationPlugin** | 用於在 Mapper 介面中新增`@Mapper`介面 | | org.mybatis.generator.plugins.MapperConfigPlugin | 用於生成 Mybatis 的主配置檔案 MapperConfig | | org.mybatis.generator.plugins.RenameExampleClassPlugin | 用於重新命名 Example 類 | | org.mybatis.generator.plugins.RowBoundsPlugin | 用於在 Mapper 介面的 selectByExample 方法引數中加入 RowBounds 引數,用於支援分頁 | | org.mybatis.generator.plugins.VirtualPrimaryKeyPlugin | 用於指定表的主鍵 | 外掛的配置方式非常簡單,如下: ```xml ``` 執行 Java 程式,可以看到實體類中生成類 toString 、hashCode 和 equals 方法。 以上,基本講完 MBG 的使用方法,涉及到的內容可以滿足實際使用需求。 # MyBatis3DynamicSql 風格 API 的使用 在研究 MBG 之前,其實我並沒有聽說過 MyBatis3DynamicSql 風格,因為專案裡一直使用的是 Mybatis3Simple,網上也很少人提起。 Mybatis3Simple 可以生成簡單的 CRUD,但是針對高階條件查詢就無能為力了,實際專案中,我們有時必須手動地去編寫高階查詢的程式碼,當然,我們也可以自定義程式碼生成器來生成,但是這也只能針對單表,涉及到多表時,就不盡人意了。 MyBatis3DynamicSql 風格丟棄了 XML 檔案,使用全註解形式並搭配幾個條件輔助類,剛接觸時,我還是比較抗拒,因為前面**MyBatis3 中也嘗試過全註解和條件類,當遇到某些複雜場景時,還是需要 XML,而且生成器提供的條件類會滲透到服務層**。 直到開始使用 MyBatis3DynamicSql,我才發現它的強大。它可以做到: 1. **單表高階查詢**。包括 Equal/NotEqual、Like/NotLike、In/NotIn、Between/NotBetween、IsNull/IsNotNull 等等,而且還可以判空設定條件。 2. **聯表查詢**。你可以像給單表一樣給關聯表設定條件。 3. **分組、排序、分頁**。 4. **只返回你要的欄位**。 下面這個例子,涉及到了關聯查詢、排序、分頁,而 MyBatis3DynamicSql 都能幫我們處理,並且**它利用 Lambda表示式來解耦條件類**。 ```java @Test public void testSelect() { // 注意,當查詢結果多於1時會報錯 List lsit = baseMapper.select(c -> c.leftJoin(DepartmentDynamicSqlSupport.department) .on(departmentId, new EqualTo(DepartmentDynamicSqlSupport.id)) .where(name, isLikeWhenPresent("zzs%"), or(name, isLikeWhenPresent("zzf%"))) .and(status, isEqualTo((byte)1)) .and(address, isIn("北京", "廣東")) .and(DepartmentDynamicSqlSupport.name, isEqualToWhenPresent("質控部")) .orderBy(gmtCreate.descending()) .limit(3) .offset(1) ); lsit.forEach(System.err::println); } ``` 我相信,MyBatis3DynamicSql 風格會被更多開發者使用,這裡就不長篇大論的講解如何使用它,因為它的 API 並不難操作。感興趣的朋友可以移步到專案原始碼閱讀:[測試例子](https://github.com/ZhangZiSheng001/mybatis-projects/tree/master/mybatis-generator/src/test/java/cn/zzs/mybatis/mapper) # 參考資料 [MyBatis Generator官方文件](http://mybatis.org/generator/index.html) > 相關原始碼請移步:[mybatis--generator](https://github.com/ZhangZiSheng001/mybatis-projects/tree/master/mybatis-generator) > 本文為原創文章,轉載請附上原文出處連結:[https://www.cnblogs.com/ZhangZiSheng001/p/12820344.html](https://www.cnblogs.com/ZhangZiSheng001/p/1282034