深入Mybatis配置文件
Configuration是幹嘛的
Configuration就像是Mybatis的總管,Mybatis的所有配置信息都存放在這裏,此外,它還提供了設置這些配置信息的方法。Configuration可以從配置文件裏獲取屬性值,也可以通過程序直接設置。Configuration裏可供配置的屬性有:
1. properties屬性
1) 配置示例
<properties resource="org/mybatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="password" value="F2Fa3!33TYyg"/> </properties>
2) 用途
properties裏配置的屬性將被存放在Configuration的variables變量裏,供Mybatis使用。此外在配置文件中,也可以使用這些屬性,用來對配置項實現動態配置。比如:
<dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource>
3) 註意事項
resource裏也可指定屬性值,並且resource裏屬性值的優先級高於property子節點裏配置的值,也就是說resource的同名屬性將會覆蓋於property子節點裏的值。
2. settings設置
1) 配置示例
<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="enhancementEnabled" value="false"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25000"/> </settings>
2) 用途
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) 配置示例
<typeAliases> <typeAlias alias="Author" type="domain.blog.Author"/> <typeAlias alias="Blog" type="domain.blog.Blog"/> <typeAlias alias="Comment" type="domain.blog.Comment"/> <typeAlias alias="Post" type="domain.blog.Post"/> <typeAlias alias="Section" type="domain.blog.Section"/> <typeAlias alias="Tag" type="domain.blog.Tag"/> </typeAliases>
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) 配置示例
<typeHandlers> <typeHandler javaType="String" jdbcType="VARCHAR" handler="org.mybatis.example.ExampleTypeHandler"/> </typeHandlers>
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) 配置示例
<plugins> <plugin interceptor="org.mybatis.example.ExamplePlugin"> <property name="someProperty" value="100"/> </plugin> </plugins>
2) 用途
插件可以改變某些類的執行, MyBatis允許被插件來攔截的類有:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
3) 註意事項
插件可以改變MyBatis底層的行為,因此功能非常強大。但在對MyBatis深入理解前不要急著編寫自己的插件,因為若插件編寫不當,將導致整個MyBatis都不能正常工作。本系列的後面會有專門的章節介紹插件機制以及兩個有用的插件,歡迎持續關註。
7. environments環境
environments裏可以配置多個environment,每個environment對應一個數據庫環境。一個完整的定義如下:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
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) 配置示例
<mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers>
2) 用途
Mappers用於告訴Mybatis去哪裏尋找sql映射文件。sql映射文件是Mybatis最靈活的地方。sql映射文件在後續的章節裏會進一步詳細描述,歡迎持續關註。
如何構建configuration
前面介紹了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方法完成。
深入Mybatis配置文件