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