Configuration就像是Mybatis的總管,Mybatis的全部配置信息都存放在這裏,此外,它還提供了設置這些配置信息的方法。 Configuration能夠從配置文件裏獲取屬性值,也能夠經過程序直接設置。Configuration裏可供配置的屬性有:html
1. properties屬性java
1) 配置示例spring
2) 用途sql
properties裏配置的屬性將被存放在Configuration的variables變量裏,供Mybatis使用。此外在配置文件中,也可使用這些屬性,用來對配置項實現動態配置。好比:數據庫
3) 注意事項緩存
resource裏也可指定屬性值,而且resource裏屬性值的優先級高於property子節點裏配置的值,也就是說resource的同名屬性將會覆蓋於property子節點裏的值。tomcat
2. settings設置服務器
1) 配置示例mybatis
2) 用途app
setting節點裏配置的值會直接改寫Configuration對應的變量值,這些變量描述的是Mybatis的全局運行方式,若是對這些屬性的含義不熟悉的話建議不要配置,使用默認值便可。下面這個表格描述了各個配置項的含義和默認值:
設置參數 |
描述 |
有效值 |
默認值 |
cacheEnabled |
這個配置使全局的映射器啓用或禁用緩存。 |
true | false |
true |
lazyLoadingEnabled |
全局啓用或禁用延遲加載。當禁用時,全部關聯對象都會即時加載。 |
true | false |
true |
aggressiveLazyLoading |
當啓用時,有延遲加載屬性的對象在被調用時將會徹底加載任意屬性。不然,每種屬性將會按須要加載。 |
true | false |
true |
multipleResultSetsEnabled |
容許或不容許多種結果集從一個單獨的語句中返回(須要適合的驅動)。 |
true | false |
true |
useColumnLabel |
使用列標籤代替列名。不一樣的驅動在這方便表現不一樣。參考驅動文檔或充分測試兩種方法來決定所使用的驅動。 |
true | false |
true |
useGeneratedKeys |
容許JDBC支持生成的鍵。須要適合的驅動。若是設置爲true則這個設置強制生成的鍵被使用,儘管一些驅動拒絕兼容但仍然有效(好比Derby)。 |
true | false |
false |
autoMappingBehavior |
指定MyBatis如何自動映射列到字段/屬性。PARTIAL只會自動映射簡單,沒有嵌套的結果。FULL會自動映射任意複雜的結果(嵌套的或其餘狀況)。 |
NONE, PARTIAL, FULL |
PARTIAL |
3) 注意事項
謹慎修改這些配置值。
3. typeAliases類型命名
1) 配置示例
2) 用途
別名是爲Java類型命名一個短的名字。它只用在XML配置文件裏,用來減小類徹底限定名的多餘部分。例如在配置文件裏須要使用domain.blog.Author的地方能夠簡單的使用Author替換。
3) 注意事項
Mybatis裏有一些默認的別名,不要覆蓋這些別名:
別名 |
映射的類型 |
_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在預處理語句中設置一個參數,仍是從結果集中取出一個值時,類型處理器被用來將獲取的值以合適的方式轉換成Java類型。
3) 注意事項
Mybatis已經有了若干個類型處理器了,編寫本身的類型處理器時勿從新發明輪子。
類型處理器 |
Java類型 |
JDBC類型 |
BooleanTypeHandler |
Boolean,boolean |
任何兼容的布爾值 |
ByteTypeHandler |
Byte,byte |
任何兼容的數字或字節類型 |
ShortTypeHandler |
Short,short |
任何兼容的數字或短整型 |
IntegerTypeHandler |
Integer,int |
任何兼容的數字和整型 |
LongTypeHandler |
Long,long |
任何兼容的數字或長整型 |
FloatTypeHandler |
Float,float |
任何兼容的數字或單精度浮點型 |
DoubleTypeHandler |
Double,double |
任何兼容的數字或雙精度浮點型 |
BigDecimalTypeHandler |
BigDecimal |
任何兼容的數字或十進制小數類型 |
StringTypeHandler |
String |
CHAR和VARCHAR類型 |
ClobTypeHandler |
String |
CLOB和LONGVARCHAR類型 |
NStringTypeHandler |
String |
NVARCHAR和NCHAR類型 |
NClobTypeHandler |
String |
NCLOB類型 |
ByteArrayTypeHandler |
byte[] |
任何兼容的字節流類型 |
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-任何兼容的字符串類型,做爲代碼存儲(而不是索引) |
5. objectFactory對象工廠
略(不經常使用)
6. plugins插件
1) 配置示例
2) 用途
插件能夠改變某些類的執行, MyBatis容許被插件來攔截的類有:
3) 注意事項
插件能夠改變MyBatis底層的行爲,所以功能很是強大。但在對MyBatis深刻理解前不要急着編寫本身的插件,由於若插件編寫不當,將致使整個MyBatis都不能正常工做。本系列的後面會有專門的章節介紹插件機制以及兩個有用的插件,歡迎持續關注。
7. environments環境
environments裏能夠配置多個environment,每一個environment對應一個數據庫環境。一個完整的定義以下:
environments裏的default屬性表示默認的數據庫環境,與某個environment的id相對應。
1) environment環境變量
environment經過id屬性與其餘數據庫環境區別。它有兩個子節點:
a) transactionManager事務管理器
在MyBatis中有兩種事務管理器類型(也就是type=」[JDBC|MANAGED]」):
l JDBC–這個配置直接簡單使用了JDBC的提交和回滾設置。它依賴於從數據源獲得的鏈接來管理事務範圍。
l MANAGED–這個配置幾乎沒作什麼。它歷來不提交或回滾一個鏈接。而它會讓容器來管理事務的整個生命週期(好比Spring或JEE應用服務器的上下文)
b) dataSource數據源
在MyBatis中有三種數據源類型(也就是type=」[UNPOOLED | POOLED| JNDI]」):
l UNPOOLED –這個數據源的實現是每次被請求時簡單打開和關閉鏈接,須要配置的屬性:
driver – 這是JDBC驅動的Java類的徹底限定名
url – 這是數據庫的JDBC URL地址。
username – 登陸數據庫的用戶名。
password – 登陸數據庫的密碼。
defaultTransactionIsolationLevel – 默認的鏈接事務隔離級別。
l POOLED –mybatis實現的簡單的數據庫鏈接池類型,它使得數據庫鏈接可被複用,沒必要在每次請求時都去建立一個物理的鏈接。
l JNDI – 經過jndi從tomcat之類的容器裏獲取數據源。
8. mapper映射器
1) 配置示例
2) 用途
Mappers用於告訴Mybatis去哪裏尋找sql映射文件。sql映射文件是Mybatis最靈活的地方。sql映射文件在後續的章節裏會進一步詳細描述,歡迎持續關注。
前面介紹了Configuration的各個屬性以及在文件裏配置他們的方法。這一節介紹如何從文件裏解析這些配置項以及簡化配置的方法。 Configuration在SqlSessionFactoryBuilder建立SqlSessionFactory時建立,經過 XMLConfigBuilder的parse方法建立。下面一個個的介紹:
1. properties屬性
經過XMLConfigBuilder的propertiesElement方法解析,解析後的結果存放在Configuration的variables變量裏。解析順序,先解析子節點裏的屬性值,再解析resource屬性指定的配置文件裏的值。後者會覆蓋前者的值。
2. settings設置
經過XMLConfigBuilder的settingsElement方法解析,解析前校驗屬性是不是可配置的,只要有一個不可配置,整個mybatis就會異常退出,因此配置這些屬性務必當心。
3. typeAliases類型命名
經過XMLConfigBuilder的typeAliasesElement方法解析,在該方法內部調用TypeAliasRegistry的registerAlias方法完成註冊,並將註冊的別名存入本地緩存中。XMLConfigBuilder調用的registerAlias方法並無什麼特別的地方,但TypeAliasRegistry卻提供了批量註冊別名的方法,該方法只須要一個包名參數。該方法會在指定的包路徑下掃描可註冊的類(接口和內部類除外),並以類的簡單名爲key完整名爲value註冊別名。這個方法極大的簡化了配置,後續章節將要介紹的spring與mybatis的整合模塊裏就使用了這個方法使得配置量大大減小。
4. typeHandlers類型處理器
經過XMLConfigBuilder的typeHandlerElement方法解析,在該方法內部調用TypeHandlerRegistry的register方法完成註冊,並將註冊的類型處理器存入本地緩存中。同typeAliases同樣,TypeHandlerRegistry也提供了批量註冊的方法,該方法一樣只須要一個包名參數。該方法會在指定的包路徑下掃描可註冊的類(接口、抽象類和內部類除外),不過只註冊那些配置了MappedTypes註解的類。這個方法極大的簡化了配置,後續章節將要介紹的spring與mybatis的整合模塊裏就使用了這個方法使得配置量大大減小。
5. objectFactory對象工廠
略(不經常使用)
6. plugins插件
經過XMLConfigBuilder的pluginElement方法解析,在該方法內部實例化插件對象後存入Configuration的interceptorChain變量裏。
7. environments環境
經過XMLConfigBuilder的environmentsElement方 法解析,在該方法內,先判斷默認是否指定了環境ID,沒有的話就使用默認的環境ID嗎,而後在各個環境裏取ID對應的項。也就是說一個 Configuration只會保存一個數據庫環境,若是要配置多數據庫環境的話須要建立多個Configuration對象。在改方法內先解析事務工 廠、再解析數據源、而後再解析數據庫環境,在解析數據庫環境的過程當中會訪問一次數據庫,以取得數據庫類型信息。
8. mapper映射器
經過XMLConfigBuilder的mapperElement方法解析,在該方法內部經過調用XMLMapperBuilder的parse方法完成。