MyBatis-19MyBatis代码生成器-XML配置详解
- 概述
- XML文件頭
- 根節點generatorConfiguration及三個子元素(properties、classPathEntry、context)
- properties子元素 (0…1)
- classPathEntry子元素 (0…N)
- context子元素 (1…N)
- 深入了解context元素
- context 可選屬性
- context 子元素
- property (0..N)
- plugin (0..N)
- commentGenerator (0 or 1)
- jdbcConnection (1 Required)
- javaTypeResolver (0 or 1)
- javaModelGenerator (1 Required)
- sqlMapGenerator (0 or 1)
- javaClientGenerator (0 or 1)
- table (1..N)
- 使用心得
- demo
概述
MyBatis-17MyBatis代碼生成器(逆向工程)MBG使用
MyBatis-18MyBatis代碼生成器-Example講解
通過前兩篇的實踐后,我們來梳理下理論知識。
MBG擁有豐富的配置,以XML形式的標簽和屬性來實現。
XML文件頭
首先按照MBG的要求添加XML的文件頭
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">這個文件頭中的mybatis-generator-config_1_0.dtd用于定義該配置文件中所有標簽和屬性的用法及限制。
根節點generatorConfiguration及三個子元素(properties、classPathEntry、context)
<generatorConfiguration><!-- 配置內容 --> </generatorConfiguration>文件頭以及根節點是MBG必備的基本信息,中間是MBG的自定義配置部分。
根元素為<generatorConfiguration>,包含子元素(按照嚴格的順序):<properties>(0或一個),<classPathEntry>(0或多個),<context>(1或多個);
properties子元素 (0…1)
<properties>,指定外部的屬性文件,然后在配置中就可以通過${property}來引用屬性文件中的屬性值了. 一般配置數據庫連接較為常見。
屬性可以通過resource或者url來指定,只能使用其中一個屬性來執行,同時使用會報錯。
resource:指定classpath下的屬性文件, 類似com/artisan/db.properties這樣的屬性值
url:指定文件系統上的特定位置,一般通過file協議來加載指定路徑位置的屬性文件,如:<properties url="file:///xxx/jdbc.properties"/>
classPathEntry子元素 (0…N)
classPathEntry元素,可以配置多個,也可以不配。 一般來指定驅動路徑.屬性location,來指定jdbc驅動包的位置.如果將jar包放入了classpath中,就不用設置這個屬性了.
這個標簽還可以用在javaModelgenerator,通過使用這種方式指定rootClass屬性配置類所在的jar包
context子元素 (1…N)
context元素:用于指定一組對象的環境.子元素用于指定連接到的數據庫,要生成的對象的類型和要處理的數據庫中的表.該元素只有一個必選屬性id,來進行唯一標識.
深入了解context元素
context 可選屬性
- id 唯一標識
- defaultModelType:設置MBG如何生成實體類.
conditional 默認值,不會生成單獨的Blob實體類,但是如果有聯合主鍵,會生成一個主鍵實體類. 和hierarchical類似,如果一個表的主鍵只有一個字段,那么不回位該字段生成單獨的實體類,而是會將該字段合并到基本實體類中。
2. flat,該模型只為每張表生成一個實體類,這個實體類包含表中所有的字段,這種模型最簡單,推薦使用
hierarchical,如果有聯合主鍵,會生成單獨的主鍵實體類,如果有Blob字段,會生成單獨的Blob實體類,然后為所有的其他字段另外生成一個單獨的實體類,MBG會在所有生成的實體類之間維護一個繼承關系。
- targetRuntime :這個屬性用于指定生成代碼的運行時目標
context 子元素
這些子標簽有嚴格的配置順序
1. property(0個或者多個)
2. plugin(0個或者多個)
3. commentGenerator(0個或者1個)
4. jdbcConnection(1個)
5. javaTypeResolver(0個或者1個)
6. javaModelGenerator(1個)
7. sqlMapGenerator(0個或者1個)
8. javaClientGenerator(0個或者1個)
9. table(1個或者多個)
property (0..N)
<property> (0..N) ,property以name,和value的形式來設置,支持的屬性有
- autoDelimitKeywords :自動識別數據庫關鍵字,默認為false,設置為true后,如果遇到數據庫關鍵字,用<columnOverride>替換.
- beginnginDelimiter , endingDelimiter : 用作分隔符的符號,oracle中是”,而mysql中是`
- javaFileEncoding : 設置Java文件的編碼集,如果沒有指定,則會使用系統默認編碼.
- javaFormatter :使用該屬性來指定生成的java文件的用戶指定的formater的完整的類名稱,用于格式化java代碼,這個類必須繼承org.mybatis.generator.api.JavaFormatter,而且提供一個默認不含參數的構造方法.每個context持有一個單獨的javaFormatter實例,默認的是org.mybatis.generator.api.dom.DefaultJavaFormatter
- xmlFormatter : 格式化xml文件,與上述javaFormatter類似.
plugin (0..N)
用來定義一個插件,插件用于修改MBG生成的代碼.類繼承于 org.mybatis.generator.api.Plugin .
下面介紹緩存插件,全限定名為org.mybatis.generator.plugins.CachePlugin
這個插件可以在生成的SQL XML映射文件中增加一個cache標簽,只有當targetRuntime為MyBatis3時,該插件才有效。
該插件的可選屬性
- cache_eviction
- cache_flushInterval
- cache_readOnly
- cache_size
- cache_type
配置方法
<plugin type="org.mybatis.generator.plugins.CachePlugin"><property name="cache_eviction" value="LRU"><property name="cache_size" value="1024"> </plugin>增加這個屬性后,生成的Mapper.xml文件會增加如下的緩存配置
<cache eviction="LRU" size="1024"> </cache>commentGenerator (0 or 1)
用于定義注釋生成器的屬性.注釋生成器用來給由MBG生成的多種元素,Java自動,java方法,XML元素等等 生成注釋. 默認的注釋生成器將JavaDoc注釋添加到所有生成的Java元素上,也會添加到每個生成的XML元素上.注釋的目的是告訴用戶這個元素是生成的,并且有可能重新生成,也就是說不應該修改這些地方.
可選屬性 type,用來指定注釋生成器類型.自定義的類要繼承于 org.mybatis.generator.api.CommentGenerator.
使用子元素來設置屬性:
- suppressAllComments :用來指定MBG所生成的代碼是否包含任何注釋.默認為false,即都會生成注釋.為true是,所有代碼都不會生成注釋,且代碼不會并合并.
- suppressDate : 用來指定生成的注釋中是否包含生成的日期.默認為false. 設置為true,不會添加時間戳.
- addRemarkComments: 注釋是否添加數據庫表的備注信息,默認false
jdbcConnection (1 Required)
設置數據庫連接的屬性.每個必須含有一個元素.
必選屬性:
- driverClass : 訪問數據庫的JDBC驅動程序的完全名稱.
- connectionURL : 用于訪問數據的JDBC連接URL.
可選屬性:
- userId : 訪問數據庫的用戶ID
- password : 訪問數據庫的密碼
可以設置子元素<property>指定的屬性都會被添加到JDBC驅動程序的屬性中.
javaTypeResolver (0 or 1)
java類型處理器,處理數據庫中類型到Java中的類型.使用屬性type來設置,默認使用JavaTypeResolverDefaultImpl來處理類型.
子元素property支持一個屬性:
- forceBigDecimals : 是否強制將DECIMAL和NUMERIC的類型轉換為BigDecimal類型,默認是false.
默認情況下的轉換規則為:
1. 如果精度>0或者長度>18,使用BigDecimal.
2. 如果精度=0且10<=長度<=18,則使用Long
3. 如果精度=0且5<=長度<=9,則使用Integer
4. 如果精度=0且長度<5 ,則使用Short.
javaModelGenerator (1 Required)
該元素用于控制生成的實體類.有兩個必選屬性:
- targetPackage : 生成實體類所在的包名.會為目標包名生成pacakge.
- targetProject : 指定目標項目,運行于Eclipse或者IDEA等IDE時,這個屬性是來指定項目的source root,一般就是 src/main/java這樣的路徑.不會為這個路徑創建文件夾.
通過子元素來設置屬性:
- constructorBased : 是否為每個類生成一個使用所有字段的構造函數.只對MyBatis3有效,默認為false. 如果屬性immutable被設置了,則這個屬性會被忽略.可以在<table>中對具體的一個表進行設置.
- enableSubPackages : 是否根據表的 catalog 和 schema 來生成一個子包,默認是false
- immutable : 這個屬性用于選擇這些類是否是可變的,如果設置true,則這些類是不可變的,所有沒有setter方法,且會忽略constructorBased屬性,來默認提供一個含有所有參數的構造函數.默認是false.
- rootClass : 這個屬性用來指定所有生成的Java Model的基類,需要使用 fully qualified class name 如 com.xxx.xxx.RootClass. 如果生成對象生成的類型或者getter和setter方法在RootClass中存在,則不會自動生成和覆蓋rootClass中的內容.
- trimStrings : 這個屬性用來設置對從數據庫取回的字符串進行trim操作,默認為false.
sqlMapGenerator (0 or 1)
定義SQL映射生成器(Mapper.xml)的屬性,SQL映射生成器會為每個表生成Mybatis使用的XML文件.如果沒有指定這個元素,不會生成SQL映射的XML文件.如果使用MyBatis3,且設置了javaClientGenerator需要XML時,這個屬性才是必選子元素.
可選屬性:
- targetPackage : 包所在位置
- targetProject : 指定目標項目
可以通過子元素 來設置一個屬性 :enableSubPackages:是否通過目錄和schema來生成子包.
javaClientGenerator (0 or 1)
用于定義Java客戶端代碼生成器的屬性.會生成Java的接口和類,可以簡單的使用生成的Java Model和XML映射文件.在MyBatis中,會生成Mapper接口形式的代碼.
必選屬性:
type : 用戶選擇一個默認的生成器,或者使用用戶自定義的DAO生成器.自定義需要繼承與 org.mybatis.generator.codegen.AbstractJavaClientGenerator類.
如果當前targetRuntime是 MyBatis3,有以下三個選項:
- targetPackage和targetProject
可選屬性 :
- implementationPackage : 如果指定了該屬性,實現類就會生成在這個包中.
通過子元素 來設置屬性:
- enableSubPackages : 是否根據 catolog和scheme來生成不同的包.
- exampleMethodVisibility :設置byExample方法是否可見,默認是public,可見,且在接口中聲明方法.可以設置的屬性有: public,private,protected,default,但是在MyBatis3中,忽略該屬性.
- methodNameCalculator : 屬性用于為DAO方法提供不同的名稱.被Mybatis3忽略.
- rootInterface : 指定是否所有生成的接口都繼承與一個父接口.使用 fully qualified class name.
- useLegacyBuilder :默認是false.設置為true,會使用SqlBuilder為MyBatis生成動態SQL,在MyBatis3.2和以后被棄用.如果為false,則使用新的SQL生成器來生成客戶端代碼.
table (1..N)
從數據庫中選擇一個表,來生成對象.
必選屬性:
- tableName : 數據庫表的名稱,不包含 catalog和schema,可以指定SQL通配符,如”%”來匹配所有的表.名稱的匹配的邏輯:如果名稱中有空格,則以指定大小寫來查找表,如果數據庫標識為大寫,則用大寫,如果數據庫標識為小寫則用小寫,否則,自行定義.在創建數據庫時,如果使用”“來指定大小寫了,即使數據庫標識符是大寫,也需要設置
delimitIdentifiers = "true"來保留大小寫格式.
可選屬性:
- schema : 可以指定通配符
- catalog : 可以指定通配符
- alias : 如果指定,則設置的別名會用在select查詢上.
- domainObjectName : 生成的對象的基本名稱,如果沒有指定,則會以表名來命名.由于帶domain,所以可以生成到指定包中,如abc.Model,對象名是Model,添加到包abc中. enableInsert : 是否生成Insert語句,默認為true.
- enableSelectByPrimaryKey :是否生成根據主鍵查詢語句,默認為true.如果不存在主鍵,這不會生成根據主鍵查詢的語句.
- enableSelectByExample : 是否通過 Example進行動態查詢.默認為true.
- enableUpdateByPrimaryKey : 是否通過主鍵根據.默認為true
- enableDeleteByPrimaryKey : 是否通過主鍵刪除語句.默認為true.
- enableUpdateByExample : 是否生成通過Example更新語句.默認為true.
- enableDeleteByExample : 是否生成通過Example刪除語句,默認為true.
- enableCountByExample : 是否生成根據Example查詢總數的語句,默認為true.
- selectByPrimaryKeyQueryId : 這個值會以 <value> as QUERYID的形式被添加到主鍵查詢語句的select列中.這樣,可以對生成的每一個查詢指定一個唯一的ID.
- selectByExampleQueryId : 對每一次查詢設置一個唯一id.
- modelType : 可以用來重寫默認的模型類型,即conditional,flat,和hierarchical三個屬性.
- escapeWildcards : 這個屬性表示當查詢列時,是否對schema和表名中的SQL通配符(如_和%)進行轉義.默認是false.
- delimitIdentifiers : 這個屬性當查詢表并且在生成的SQL中分割標識符時,是否使用指定的確切值.默認為false.如果catalog,schema或者tableName包含空白時,應該為true.
- delimitAllColumns : 指示是否給生成SQL中所有的列名添加分割符.默認為false.
子元素有 :
- <property> (0 .. N) : 通過property可以設置以下屬性:
construtorBased : 是否產生一個含有所有字段的構造函數.默認為false
ignoreQualifiersAtRuntime: 生成的SQL的表名將不會包含schema和catalog的前綴.默認為false.
immutable :與<javaModelGenerator>中含義相同. modelOnly : 是否值生成模型類,而不生成CRUD方法.默認是false.
rootClass : 與<javaModelGenerator>中含義相同
rootInterface :與<javaModelGenerator>中含義相同.
runtimeCatalog :指定生成SQL語句中的catalog,生成代碼的catalog會與運行時的catalog不同.
runtimeSchema : 運行時schema
runtimeTableName : 運行時表名.
selectAllOrderByClause :在MyBatis3SseColimple中,將這個屬性以 oder by的形式添加到selectAll方法中.
useActualColumnNames : 默認為false.設置為true時,將從數據庫元數據獲取的列名作為實體類的屬性名.false時,會將名稱轉換為駝峰形式.如果被<columnOverride>元素指定,則會忽略這個屬性. 如START_DATE屬性會變成 startDate屬性.
useColumnIndexes :默認為false.且Mybatis3中不支持這個屬性.如果為true,會在生成resultMaps時使用索引.
useCompoundPropertyNames : 默認為false. 如果為true,在生成屬性名時,會將列名和備注連接起來.
- <generatedKey> (0 or 1) :
用于指定自動生成主鍵的屬性.如果指定該元素,MBG會在生成insert的SQL映射文件中插入一個合適的<selectKey>元素.簡單來說,就是可以用來做自增主鍵的設置.
必選屬性:
- column : 生成列 的列名.
- sqlStatement : 返回新值的SQL語句.一些特殊值為 :MySql,轉化為`SELECT LAST_INSERT_ID() . JDBC在MyBatis3中,生成正確的代碼,且脫離數據庫的限制.
可選屬性:
- identity : 默認為false.如果為true,被標記為identity列,且<selectKey>元素后被插入在insert后面.如果為false,則會被插入在insert之前.
- type : 為selectKey元素指定類型, pre或post.指定類型后,selectKey永遠在insert語句之前.
理解這個序列的意思,和插入前后的意思.序列表示表是一個序列,插入之前要先查詢表,就需要知道當前指向的位置即主鍵.而自增主鍵要在插入之后,才能知道自己的大小.
<columnRenamingRule> (0 or 1)
列的重命名規則.MBG使用正則表達式來進行重命名規則的實現,如果有<columnOverride>,則忽略<columnRenamingRule>屬性.先使用這個重命名規則后,獲得的結果再去使用useActualColumnNames規則來判斷是非需要再次更新屬性名.
必選屬性:
- searchString : 定義將被替換的子字符串的正則表達式.
可選屬性:
- replaceString : 替換匹配的字符串.如果沒有設置,則用空字符串替換.
- <columnOverride> (0 … N)
將默認得到的列進行修改,來設置指定的類型,名稱等.
必選屬性:
- column : 列名
可選屬性:
- property : 要使用的Java名稱.
- javaType : 完全指定的Java類型.這里有必要來處理奇怪的數據庫類型,如mysql中的unsigned
bigint需要被映射為java.lang.Object. - jdbcType : 該列的JDBC類型(INTEGER,DECIMAL等等)
- typeHandler : 用戶定義的需要用來處理該列的類型處理器.
- delimitedColumnName : 是否需要分割列名,指的是列名可能是帶空格或者保留字,所以是否需要添加分隔符.默認為false.
- <ignoreColumn> (0 … N)
忽略的列.
可選屬性:
- delimitedColunmnName : 當匹配對從數據庫返回列時,是否區分大小寫.默認為false.
使用心得
- 可以考慮實體類類型defaultModelType為 flat,即只有一個對象,這樣管理起來更加方便.
- 注釋的時間戳suppressDate一般都會關閉,因為每次重新生成都會修改時間戳,SVN都要重新提交,不利于多人開發.
- 將jdbc驅動放在項目的classPath下,而不是使用<classPathEntry>來引入jar包.
- 對于字符串類型,一般都設置trimStrings來去除空格.
- 在<table>中配置<generatedKey>,來實現自增主鍵.
- 在Mysql中,支持無符號數,但是java中的數據類型都是有符號的,所以要用<columnOverride>來解決這個問題,先將類型轉換成java.lang.Object,然后在使用時,將返回值強制轉換為適當的類型.
demo
在JDBC配置文件db.properties中,對項目文件夾布局進行指定:
# 包路徑 model.package=com.artisan.mybatis.pojo dao.package=com.artisan.mybatis.dao xml.mapper.package=com.artisan.mybatis.mapping target.project=src/main/java編寫配置文件generatorConfig.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!-- 引用外部配置文件 --><properties resource="db.properties" /><context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat"><!--關閉時間注釋 --><commentGenerator><property name="suppressDate" value="true"/></commentGenerator><!--數據庫連接信息 --><jdbcConnection driverClass="${jdbc.driver}"connectionURL="${jdbc.url}"userId="${jdbc.username}"password="${jdbc.password}"></jdbcConnection><!--生成的model 包路徑 --><javaModelGenerator targetPackage="${model.package}" targetProject="${target.project}"><property name="enableSubPackages" value="ture"/><property name="trimStrings" value="true"/></javaModelGenerator><!--生成xml mapper文件 路徑 --><sqlMapGenerator targetPackage="${xml.mapper.package}" targetProject="${target.project}"><property name="enableSubPackages" value="ture"/></sqlMapGenerator><!-- 生成的Dao接口 的包路徑 --><javaClientGenerator type="XMLMAPPER" targetPackage="${dao.package}" targetProject="${target.project}"><property name="enableSubPackages" value="ture"/></javaClientGenerator><!--對應數據庫表名 --><table tableName="%"><generatedKey column="id" sqlStatement="Mysql"/></table></context> </generatorConfiguration>總結
以上是生活随笔為你收集整理的MyBatis-19MyBatis代码生成器-XML配置详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis-17MyBatis代码生
- 下一篇: MyBatis-20MyBatis高级结