Configuration就像是Mybatis的總管,Mybatis的所有配置信息都存放在這里,此外,它還提供了設(shè)置這些配置信息的方法。Configuration可以從配置文件里獲取屬性值,也可以通過程序直接設(shè)置。Configuration里可供配置的屬性有:
1. properties屬性
1) 配置示例
2) 用途
properties里配置的屬性將被存放在Configuration的variables變量里,供Mybatis使用。此外在配置文件中,也可以使用這些屬性,用來對(duì)配置項(xiàng)實(shí)現(xiàn)動(dòng)態(tài)配置。比如:
3) 注意事項(xiàng)
resource里也可指定屬性值,并且resource里屬性值的優(yōu)先級(jí)高于property子節(jié)點(diǎn)里配置的值,也就是說resource的同名屬性將會(huì)覆蓋于property子節(jié)點(diǎn)里的值。
2. settings設(shè)置
1) 配置示例
2) 用途
setting節(jié)點(diǎn)里配置的值會(huì)直接改寫Configuration對(duì)應(yīng)的變量值,這些變量描述的是Mybatis的全局運(yùn)行方式,如果對(duì)這些屬性的含義不熟悉的話建議不要配置,使用默認(rèn)值即可。下面這個(gè)表格描述了各個(gè)配置項(xiàng)的含義和默認(rèn)值:
設(shè)置參數(shù) | 描述 | 有效值 | 默認(rèn)值 |
cacheEnabled | 這個(gè)配置使全局的映射器啟用或禁用緩存。 | true | false | true |
lazyLoadingEnabled | 全局啟用或禁用延遲加載。當(dāng)禁用時(shí),所有關(guān)聯(lián)對(duì)象都會(huì)即時(shí)加載。 | true | false | true |
aggressiveLazyLoading | 當(dāng)啟用時(shí),有延遲加載屬性的對(duì)象在被調(diào)用時(shí)將會(huì)完全加載任意屬性。否則,每種屬性將會(huì)按需要加載。 | true | false | true |
multipleResultSetsEnabled | 允許或不允許多種結(jié)果集從一個(gè)單獨(dú)的語句中返回(需要適合的驅(qū)動(dòng))。 | true | false | true |
useColumnLabel | 使用列標(biāo)簽代替列名。不同的驅(qū)動(dòng)在這方便表現(xiàn)不同。參考驅(qū)動(dòng)文檔或充分測(cè)試兩種方法來決定所使用的驅(qū)動(dòng)。 | true | false | true |
useGeneratedKeys | 允許JDBC支持生成的鍵。需要適合的驅(qū)動(dòng)。如果設(shè)置為true則這個(gè)設(shè)置強(qiáng)制生成的鍵被使用,盡管一些驅(qū)動(dòng)拒絕兼容但仍然有效(比如Derby)。 | true | false | false |
autoMappingBehavior | 指定MyBatis如何自動(dòng)映射列到字段/屬性。PARTIAL只會(huì)自動(dòng)映射簡(jiǎn)單,沒有嵌套的結(jié)果。FULL會(huì)自動(dòng)映射任意復(fù)雜的結(jié)果(嵌套的或其他情況)。 | NONE, PARTIAL, FULL | PARTIAL |
3) 注意事項(xiàng)
謹(jǐn)慎修改這些配置值。
3. typeAliases類型命名
1) 配置示例
2) 用途
別名是為Java類型命名一個(gè)短的名字。它只用在XML配置文件里,用來減少類完全限定名的多余部分。例如在配置文件里需要使用domain.blog.Author的地方可以簡(jiǎn)單的使用Author替換。
3) 注意事項(xiàng)
Mybatis里有一些默認(rèn)的別名,不要覆蓋這些別名:
別名 | 映射的類型 |
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
4. typeHandlers類型處理器
1) 配置示例
2) 用途
無論是MyBatis在預(yù)處理語句中設(shè)置一個(gè)參數(shù),還是從結(jié)果集中取出一個(gè)值時(shí),類型處理器被用來將獲取的值以合適的方式轉(zhuǎn)換成Java類型。
3) 注意事項(xiàng)
Mybatis已經(jīng)有了若干個(gè)類型處理器了,編寫自己的類型處理器時(shí)勿重新發(fā)明輪子。
類型處理器 | Java類型? | JDBC類型? |
BooleanTypeHandler | Boolean,boolean | 任何兼容的布爾值 |
ByteTypeHandler | Byte,byte | 任何兼容的數(shù)字或字節(jié)類型 |
ShortTypeHandler | Short,short | 任何兼容的數(shù)字或短整型 |
IntegerTypeHandler | Integer,int | 任何兼容的數(shù)字和整型 |
LongTypeHandler | Long,long | 任何兼容的數(shù)字或長(zhǎng)整型 |
FloatTypeHandler | Float,float | 任何兼容的數(shù)字或單精度浮點(diǎn)型 |
DoubleTypeHandler | Double,double | 任何兼容的數(shù)字或雙精度浮點(diǎn)型 |
BigDecimalTypeHandler | BigDecimal | 任何兼容的數(shù)字或十進(jìn)制小數(shù)類型 |
StringTypeHandler | String | CHAR和VARCHAR類型? |
ClobTypeHandler | String | CLOB和LONGVARCHAR類型? |
NStringTypeHandler | String | NVARCHAR和NCHAR類型? |
NClobTypeHandler | String | NCLOB類型? |
ByteArrayTypeHandler | byte[] | 任何兼容的字節(jié)流類型 |
BlobTypeHandler | byte[] | BLOB和LONGVARBINARY類型 |
DateTypeHandler | Date(java.util)? | TIMESTAMP類型? |
DateOnlyTypeHandler | Date(java.util)? | DATE類型? |
TimeOnlyTypeHandler | Date(java.util)? | TIME類型? |
SqlTimestampTypeHandler | Timestamp(java.sql) | TIMESTAMP類型? |
SqlDateTypeHandler | Date(java.sql)? | DATE類型? |
SqlTimeTypeHandler | Time(java.sql)? | TIME類型? |
ObjectTypeHandler | Any | 其他或未指定類型 |
EnumTypeHandler | Enumeration類型 | VARCHAR-任何兼容的字符串類型,作為代碼存儲(chǔ)(而不是索引) |
5. objectFactory對(duì)象工廠
略(不常用)
6. plugins插件
1) 配置示例
2) 用途
插件可以改變某些類的執(zhí)行, MyBatis允許被插件來攔截的類有:
3) 注意事項(xiàng)
插件可以改變MyBatis底層的行為,因此功能非常強(qiáng)大。但在對(duì)MyBatis深入理解前不要急著編寫自己的插件,因?yàn)槿舨寮帉懖划?dāng),將導(dǎo)致整個(gè)MyBatis都不能正常工作。本系列的后面會(huì)有專門的章節(jié)介紹插件機(jī)制以及兩個(gè)有用的插件,歡迎持續(xù)關(guān)注。
7. environments環(huán)境
environments里可以配置多個(gè)environment,每個(gè)environment對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)環(huán)境。一個(gè)完整的定義如下:
environments里的default屬性表示默認(rèn)的數(shù)據(jù)庫(kù)環(huán)境,與某個(gè)environment的id相對(duì)應(yīng)。
1) environment環(huán)境變量
environment通過id屬性與其他數(shù)據(jù)庫(kù)環(huán)境區(qū)別。它有兩個(gè)子節(jié)點(diǎn):
a) transactionManager事務(wù)管理器
在MyBatis中有兩種事務(wù)管理器類型(也就是type=”[JDBC|MANAGED]”):
l JDBC–這個(gè)配置直接簡(jiǎn)單使用了JDBC的提交和回滾設(shè)置。它依賴于從數(shù)據(jù)源得到的連接來管理事務(wù)范圍。
l MANAGED–這個(gè)配置幾乎沒做什么。它從來不提交或回滾一個(gè)連接。而它會(huì)讓容器來管理事務(wù)的整個(gè)生命周期(比如Spring或JEE應(yīng)用服務(wù)器的上下文)
b) dataSource數(shù)據(jù)源
在MyBatis中有三種數(shù)據(jù)源類型(也就是type=”[UNPOOLED | POOLED| JNDI]”):
l UNPOOLED –這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)是每次被請(qǐng)求時(shí)簡(jiǎn)單打開和關(guān)閉連接,需要配置的屬性:
driver – 這是JDBC驅(qū)動(dòng)的Java類的完全限定名
url – 這是數(shù)據(jù)庫(kù)的JDBC URL地址。
username – 登錄數(shù)據(jù)庫(kù)的用戶名。
password – 登錄數(shù)據(jù)庫(kù)的密碼。
defaultTransactionIsolationLevel – 默認(rèn)的連接事務(wù)隔離級(jí)別。
l POOLED –mybatis實(shí)現(xiàn)的簡(jiǎn)單的數(shù)據(jù)庫(kù)連接池類型,它使得數(shù)據(jù)庫(kù)連接可被復(fù)用,不必在每次請(qǐng)求時(shí)都去創(chuàng)建一個(gè)物理的連接。
l JNDI – 通過jndi從tomcat之類的容器里獲取數(shù)據(jù)源。
8. mapper映射器
1) 配置示例
2) 用途
Mappers用于告訴Mybatis去哪里尋找sql映射文件。sql映射文件是Mybatis最靈活的地方。sql映射文件在后續(xù)的章節(jié)里會(huì)進(jìn)一步詳細(xì)描述,歡迎持續(xù)關(guān)注。
前面介紹了Configuration的各個(gè)屬性以及在文件里配置他們的方法。這一節(jié)介紹如何從文件里解析這些配置項(xiàng)以及簡(jiǎn)化配置的方法。Configuration在SqlSessionFactoryBuilder創(chuàng)建SqlSessionFactory時(shí)創(chuàng)建,通過XMLConfigBuilder的parse方法創(chuàng)建。下面一個(gè)個(gè)的介紹:
1. properties屬性
通過XMLConfigBuilder的propertiesElement方法解析,解析后的結(jié)果存放在Configuration的variables變量里。解析順序,先解析子節(jié)點(diǎn)里的屬性值,再解析resource屬性指定的配置文件里的值。后者會(huì)覆蓋前者的值。
2. settings設(shè)置
通過XMLConfigBuilder的settingsElement方法解析,解析前校驗(yàn)屬性是否是可配置的,只要有一個(gè)不可配置,整個(gè)mybatis就會(huì)異常退出,所以配置這些屬性務(wù)必小心。
3. typeAliases類型命名
通過XMLConfigBuilder的typeAliasesElement方法解析,在該方法內(nèi)部調(diào)用TypeAliasRegistry的registerAlias方法完成注冊(cè),并將注冊(cè)的別名存入本地緩存中。XMLConfigBuilder調(diào)用的registerAlias方法并沒有什么特別的地方,但TypeAliasRegistry卻提供了批量注冊(cè)別名的方法,該方法只需要一個(gè)包名參數(shù)。該方法會(huì)在指定的包路徑下掃描可注冊(cè)的類(接口和內(nèi)部類除外),并以類的簡(jiǎn)單名為key完整名為value注冊(cè)別名。這個(gè)方法極大的簡(jiǎn)化了配置,后續(xù)章節(jié)將要介紹的spring與mybatis的整合模塊里就使用了這個(gè)方法使得配置量大大減少。
4. typeHandlers類型處理器
通過XMLConfigBuilder的typeHandlerElement方法解析,在該方法內(nèi)部調(diào)用TypeHandlerRegistry的register方法完成注冊(cè),并將注冊(cè)的類型處理器存入本地緩存中。同typeAliases一樣,TypeHandlerRegistry也提供了批量注冊(cè)的方法,該方法同樣只需要一個(gè)包名參數(shù)。該方法會(huì)在指定的包路徑下掃描可注冊(cè)的類(接口、抽象類和內(nèi)部類除外),不過只注冊(cè)那些配置了MappedTypes注解的類。這個(gè)方法極大的簡(jiǎn)化了配置,后續(xù)章節(jié)將要介紹的spring與mybatis的整合模塊里就使用了這個(gè)方法使得配置量大大減少。
5. objectFactory對(duì)象工廠
略(不常用)
6. plugins插件
通過XMLConfigBuilder的pluginElement方法解析,在該方法內(nèi)部實(shí)例化插件對(duì)象后存入Configuration的interceptorChain變量里。
7. environments環(huán)境
通過XMLConfigBuilder的environmentsElement方法解析,在該方法內(nèi),先判斷默認(rèn)是否指定了環(huán)境ID,沒有的話就使用默認(rèn)的環(huán)境ID嗎,然后在各個(gè)環(huán)境里取ID對(duì)應(yīng)的項(xiàng)。也就是說一個(gè)Configuration只會(huì)保存一個(gè)數(shù)據(jù)庫(kù)環(huán)境,如果要配置多數(shù)據(jù)庫(kù)環(huán)境的話需要?jiǎng)?chuàng)建多個(gè)Configuration對(duì)象。在改方法內(nèi)先解析事務(wù)工廠、再解析數(shù)據(jù)源、然后再解析數(shù)據(jù)庫(kù)環(huán)境,在解析數(shù)據(jù)庫(kù)環(huán)境的過程中會(huì)訪問一次數(shù)據(jù)庫(kù),以取得數(shù)據(jù)庫(kù)類型信息。
8. mapper映射器
通過XMLConfigBuilder的mapperElement方法解析,在該方法內(nèi)部通過調(diào)用XMLMapperBuilder的parse方法完成。mapper的解析是mybatis的核心功能,涉及的流程較復(fù)雜,在下一章將專門分析,敬請(qǐng)期待。
聯(lián)系客服