【MyBatis Generator】程式碼自動生成工具 generatorConfig.xml配置檔案詳解
MyBatis Generator官網地址:http://www.mybatis.org/generator/index.html
MyBaris Generator中文地址:http://mbg.cndocs.ml/
在MBG中,最主要也最重要的,就是generatorConfig.xml配置檔案了,本篇主要就是詳細介紹該配置檔案內的內容。
【1.檔案頭】配置檔案頭:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
【2.根節點<generatorConfiguration>】<generatorConfiguration>為根節點,沒有任何屬性;如下:
<generatorConfiguration>
<!-- 配置具體內容 -->
</generatorConfiguration>
【3.<generatorConfiguration>子元素】<generatorConfiguration>主要有3個子元素,有嚴格的順序;
1:<properties>(0個或多個)
2:<classPathEntry>(0個或多個)
3:<context>(1個或多個)
【3.1.<properties>元素】這個元素主要用來指定外部的屬性元素,不是必須的元素。
<properties>元素用於指定一個需要在配置中解析使用的外部屬性檔案,引入屬性檔案後,可以再配置中使用${property}的方式進行屬性引用,通過這種方式引用屬性檔案中的屬性值。比如常規的配置“jdbc”資訊的引用:${url}, ${username}等
這個元素有兩個屬性resurce和url,分別為兩種引入方式,兩個屬性只能使用其中一個,同時出現會報錯。
-
resource:指定**classpath**下的屬性檔案,使用類似com/myproject/generatorConfig.properties這樣的屬性值
-
url:可以指定檔案系統上的特定位置,例如:file:///C:/myfloder/generatorConfig.properties
<!-- 引入配置檔案 -->
<properties resource="mybatis\config\init.properties" />
【3.2.<classPathEntry>元素】這個元素可以1個或多個,不受限制。
這個屬性是引入需要依賴的jar路徑,最常用的用法就是指定驅動程式的路徑,例如:
<!-- 資料庫驅動jar路徑 -->
<classPathEntry location="${driverClassPath}" />
注意:classPathEntry只有在下面這兩種情況下才有效:
1:當載入JDBC驅動內省資料庫時;
2:當載入根類中的javaModelGenerator檢查重寫的方法時;
【3.3.<context>元素】在MBG的配置中,至少需要一個<context>元素;
<context>元素用於指定一組物件的環境。在執行MBG的時候可以指定要執行的<context>
該元素只有一個“必選屬性”id,用來唯一確定一個<context>元素,該id屬性可以再執行MBG時使用。
此外還有幾個“可選屬性”:
- defaultModelType:這個屬性用來設定生成物件型別的預設值。 物件型別定義了MBG如何生成實體類。 對某些物件型別,MBG會給每一個表生成一個單獨的實體類。 對另外一些物件型別,MBG會根據表結構生成不同的類。
這個屬性有以下可選值:
1:conditional:*這是預設值*,這個模型和hierarchical類似,除了如果那個單獨的類將只包含一個欄位,將不會生成一個單獨的類。 因此,如果一個表的主鍵只有一個欄位,那麼不會為該欄位生成單獨的實體類,會將該欄位合併到基本實體類中。
2:flat:該模型為每一張表只生成一個實體類。這個實體類包含表中的所有欄位。
3:hierarchical:如果表有主鍵,那麼該模型會產生一個單獨的主鍵實體類,如果表還有BLOB欄位, 則會為表生成一個包含所有BLOB欄位的單獨的實體類,然後為所有其他的欄位生成一個單獨的實體類。 MBG會在所有生成的實體類之間維護一個繼承關係(注:BLOB類 繼承 其他欄位類 繼承 主鍵類)。
- targetRuntime:此屬性用於指定生成的程式碼的執行時目標。
該屬性支援這些特殊的值:
1:MyBatis3:這是預設值 ,使用這值的時候,MBG會生成相容MyBatis 3.0或更高版本, 相容JSE 5.0或更高版本的物件(例如Java模型類和Mapper介面會使用泛型)。 這些生成物件中的"by example"方法將支援幾乎不受限制的動態的where子句。 另外,這些生成器生成的Java物件支援JSE 5.0特性,包含泛型和註解。
2:MyBatis3Simple:使用這值的時候,和上面的MyBatis3類似,但是不會有"by example"一類的方法,只有少量的動態SQL。
3:Ibatis2Java2:使用這值的時候,MBG會生成相容iBATIS 2.2.0或更高版本(除了iBATIS 3),還有Java2的所有層次。 這些生成物件中的"by example"方法將支援幾乎不受限制的動態的where子句。 這些生成的物件不能100%和原生的Abator或其他的程式碼生成器相容。
4:Ibatis2Java5:使用這值的時候,MBG會生成相容iBATIS 2.2.0或更高版本(除了iBATIS 3), 相容JSE 5.0或更高版本的物件(例如Java模型類和Dao類會使用泛型)。 這些生成物件中的"by example"方法將支援幾乎不受限制的動態的where子句。 另外,這些生成器生成的Java物件支援JSE 5.0特性,包含泛型和註解。 這些生成的物件不能100%和原生的Abator或其他的程式碼生成器相容。
如果您想建立一個完全不同的程式碼生成器, 使用一個繼承了org.mybatis.generator.api.IntrospectedTable類的許可權定類名替換該值。 通過這個值,您可以建立您自己的程式碼生成器,然後插入到程式碼生成器引擎中。
- introspectedColumnImpl:使用這個值去指定一個繼承了org.mybatis.generator.api.IntrospectedColumn類的許可權定名稱。 這可以修改程式碼生成器計算列資訊時候的行為。
一般情況下,我們使用如下的配置即可:
<context id="mySql" defaultModelType="flat">
如果你希望不生成和Example
查詢有關的內容,那麼可以按照如下進行配置:
<context id="mySql" defaultModelType="flat" targetRuntime="MyBatis3Simple">
MBG配置中的其他幾個元素,基本上都是<context>
的子元素,這些子元素(有嚴格的配置順序)包括:
- <property>(0個或多個)
- <plugin>(0個或多個)
- <commentGenerator>(0個或1個)
- <jdbcConnection>(1個)
- <javaTypeResolver>(0個或1個)
- <javaModelGenerator>(1個)
- <sqlMapGenerator>(0個或1個)
- <javaClientGenerator>(0個或1個)
- <table>(1個或多個)
【3.3.2.<plugin>元素】:plugin顧名思義,外掛,可以用來定義一個外掛,可以配置0個或多個,不受限制,用於擴充套件或修改通過MyBatis Generator(MBG)程式碼生成器生成的程式碼。外掛按照在配置檔案中的順序執行。
MyBatis Generator自帶的外掛在org.mybatis.generator.plugins包下面:
反編譯外掛原始碼,會發現所有外掛的公共父類PluginAdapter為一個抽象類
因此,我們可以通過繼承PluginAdapter開發我們自己的MBG外掛,此處不再贅述。
此處列出常用的幾個外掛配置:
<!-- 外掛1: 為生成的javaModel建立一個toString的方法-->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<!-- 外掛2: 為生成的javaModel生成equals和hashCode方法 -->
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"></plugin>
<!-- 外掛3: 讓生成的類實現Serializable介面,並生成序列化標記 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
有關外掛的詳細資訊我們可以參考官方文件中的開發外掛和提供的外掛瞭解更多。
【3.3.3.<commentGenerator>元素】該元素最多可以配置1個。
這個元素非常有用,是用來定義註釋生成器的屬性。 註釋生成器用來給由 MyBatis Generator (MBG) 生成的多種元素(Java自動,Java方法,XML元素等等)生成註釋。
預設的實現類是 org.mybatis.generator.internal.DefaultCommentGenerator。 如果您只想修改某些行為,預設的實現類專門為擴充套件進行設計。
支援的屬性:
- suppressAllComments:這個屬性用來指定MBG生成的程式碼中是否包含任何註釋。 這個屬性有以下可選值:
1:false:預設值;當這個屬性是false或者沒有指定時,所有生成的元素都會包含用來說明這是生成元素的註釋。
2:true:當這個屬性是true時,不會往生成的元素中新增任何註釋。
警告: 如果您將這個值設為true,那麼所有的程式碼合併都會被禁用。
- suppressDate:這個元素用來指定生成的註釋中是否包含生成的日期。 這個屬性有以下可選值:
1:false:預設值;當這個屬性是false或者沒有指定時,所有元素生成註釋時都會帶著生成時間。
2:true:當這個屬性是true時,註釋中不會新增時間戳。
<!-- 1:註釋構建;type-可通過實現CommentGenerator介面構建自定義的註釋構建類 -->
<commentGenerator>
<!-- 是否去除自動生成的註釋;true:是;false:否 -->
<property name="suppressAllComments" value="false" />
<!-- 個用來指定生成的註釋中是否包含生成的日期 -->
<property name="suppressDate" value="true"/>
</commentGenerator>
可以通過實現org.mybatis.generator.api.CommentGenerator介面來自定義建立註釋生成器;
一般情況下由於MBG生成的註釋資訊沒有任何價值,而且有時間戳的情況下每次生成的註釋都不一樣,使用**版本控制**的時候每次都會提交,因而一般情況下我們都會建立自定義的註釋生成器,接下來我們簡單舉例實現生成包含表字段註釋資訊的註釋:
因為系統提供了一個預設的實現類,所以對我們來說,自己實現一個會很容易,最簡單的方法就是複製預設實現類程式碼到一個新的檔案中,修改類名如MyCommentGenerator
,在你自己的實現類中,你可以選擇是否繼續支援上面的兩個屬性,你還可以增加對其他屬性的支援。
我們通過下面一個方法的修改來了解,其他幾個方法請自行修改(寫本章的時候我也沒有完全實現該類,所以不提供完整原始碼了):
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
if (introspectedColumn.getRemarks() != null && !introspectedColumn.getRemarks().equals("")) {
field.addJavaDocLine("/**");
field.addJavaDocLine(" * " + introspectedColumn.getRemarks());
addJavadocTag(field, false);
field.addJavaDocLine(" */");
}
}
這個方法是給欄位添加註釋資訊的,其中IntrospectedColumn
包含了欄位的完整資訊,通過getRemarks
方法可以獲取欄位的註釋資訊。上面這個方法修改起來還是很容易的。除了欄位的註釋外還有Getter
和Setter
,以及類的註釋。此外還有生成XML的註釋,大家可以根據預設的實現進行修改。
完成我們自己的實現類後,我們還需要做如下配置:
<commentGenerator type="com.mybatis.generator.MyCommentGenerator">
<!-- 是否去除自動生成的註釋;true:是;false:否 -->
<property name="suppressAllComments" value="false" />
<!-- 個用來指定生成的註釋中是否包含生成的日期 -->
<property name="suppressDate" value="true"/>
</commentGenerator>
因為JDK預設編碼方式為GBK,所以我們要設定編碼方式為UTF-8,這樣就可以生成中文註釋了:
<-- 指定生成的java檔案的編碼方式,因為jdk自帶編碼方式為GBK,此處不設定,生成的java檔案會出現中文亂碼問題 -->
<property name="javaFileEncoding" value="UTF-8" />
效果如圖:
【3.3.4.<jdbcConnection>元素】該元素用於指定資料庫的連線資訊,該元素必選,並且只能有一個。
配置該元素時需要注意,如果JDBC驅動程式不在**classpath**下,就需要通過<classPathEntry>元素引入jar包;
該元素有兩個必選屬性:
- driverClass:訪問資料庫的JDBC驅動程式的完全限定類名
- connectionURL:訪問資料庫的JDBC連線
該元素還有兩個可選屬性:
- userId:訪問資料庫的使用者的id
- password:訪問資料庫的密碼
該元素還可以接受多個<property>子元素,在這裡配置的<property>屬性都會新增到JDBC驅動的屬性中去。
這個元素配置起來相對最容易,例:
<!-- 2:資料庫連線資訊 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="${jdbcurl}" userId="${username}" password="${password}">
</jdbcConnection>
【<table>元素】該元素至少要配置一個,可以配置多個。
該元素用來配置要通過內省的表,只有配置的才會生成實體類和其他檔案。
該元素有一個必選屬性:
- tableName :指定要生成的表名,可以使用SQL萬用字元匹配多個表。
例如要生成全部的表,可以如下配置:
<!-- 指定要生成的表資訊 -->
<table tableName="%"></table>
。。。