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使用。此外在配置文件中,也可以使用這些屬性,用來對配置項實現動態(tài)配置。比如:
- <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里屬性值的優(yōu)先級高于property子節(jié)點里配置的值,也就是說resource的同名屬性將會覆蓋于property子節(jié)點里的值。
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節(jié)點里配置的值會直接改寫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已經有了若干個類型處理器了,編寫自己的類型處理器時勿重新發(fā)明輪子。
類型處理器
|
Java類型?
|
JDBC類型?
|
BooleanTypeHandler
|
Boolean,boolean
|
任何兼容的布爾值
|
ByteTypeHandler
|
Byte,byte
|
任何兼容的數字或字節(jié)類型
|
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[]
|
任何兼容的字節(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-任何兼容的字符串類型,作為代碼存儲(而不是索引)
|
5. objectFactory對象工廠
略(不常用)
6. plugins插件
1) 配置示例
- <plugins>
- <plugin interceptor="org.mybatis.example.ExamplePlugin">
- <property name="someProperty" value="100"/>
- </plugin>
- </plugins>
2) 用途
插件可以改變某些類的執(zhí)行, 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都不能正常工作。本系列的后面會有專門的章節(jié)介紹插件機制以及兩個有用的插件,歡迎持續(xù)關注。
7. environments環(huán)境
environments里可以配置多個environment,每個environment對應一個數據庫環(huán)境。一個完整的定義如下:
- <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屬性表示默認的數據庫環(huán)境,與某個environment的id相對應。
1) environment環(huán)境變量
environment通過id屬性與其他數據庫環(huán)境區(qū)別。它有兩個子節(jié)點:
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實現的簡單的數據庫連接池類型,它使得數據庫連接可被復用,不必在每次請求時都去創(chuàng)建一個物理的連接。
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映射文件在后續(xù)的章節(jié)里會進一步詳細描述,歡迎持續(xù)關注。
如何構建configuration
前面介紹了Configuration的各個屬性以及在文件里配置他們的方法。這一節(jié)介紹如何從文件里解析這些配置項以及簡化配置的方法。Configuration在SqlSessionFactoryBuilder創(chuàng)建SqlSessionFactory時創(chuàng)建,通過XMLConfigBuilder的parse方法創(chuàng)建。下面一個個的介紹:
1. properties屬性
通過XMLConfigBuilder的propertiesElement方法解析,解析后的結果存放在Configuration的variables變量里。解析順序,先解析子節(jié)點里的屬性值,再解析resource屬性指定的配置文件里的值。后者會覆蓋前者的值。
2. settings設置
通過XMLConfigBuilder的settingsElement方法解析,解析前校驗屬性是否是可配置的,只要有一個不可配置,整個mybatis就會異常退出,所以配置這些屬性務必小心。
3. typeAliases類型命名
通過XMLConfigBuilder的typeAliasesElement方法解析,在該方法內部調用TypeAliasRegistry的registerAlias方法完成注冊,并將注冊的別名存入本地緩存中。XMLConfigBuilder調用的registerAlias方法并沒有什么特別的地方,但TypeAliasRegistry卻提供了批量注冊別名的方法,該方法只需要一個包名參數。該方法會在指定的包路徑下掃描可注冊的類(接口和內部類除外),并以類的簡單名為key完整名為value注冊別名。這個方法極大的簡化了配置,后續(xù)章節(jié)將要介紹的spring與mybatis的整合模塊里就使用了這個方法使得配置量大大減少。
4. typeHandlers類型處理器
通過XMLConfigBuilder的typeHandlerElement方法解析,在該方法內部調用TypeHandlerRegistry的register方法完成注冊,并將注冊的類型處理器存入本地緩存中。同typeAliases一樣,TypeHandlerRegistry也提供了批量注冊的方法,該方法同樣只需要一個包名參數。該方法會在指定的包路徑下掃描可注冊的類(接口、抽象類和內部類除外),不過只注冊那些配置了MappedTypes注解的類。這個方法極大的簡化了配置,后續(xù)章節(jié)將要介紹的spring與mybatis的整合模塊里就使用了這個方法使得配置量大大減少。
5. objectFactory對象工廠
略(不常用)
6. plugins插件
通過XMLConfigBuilder的pluginElement方法解析,在該方法內部實例化插件對象后存入Configuration的interceptorChain變量里。
7. environments環(huán)境
通過XMLConfigBuilder的environmentsElement方法解析,在該方法內,先判斷默認是否指定了環(huán)境ID,沒有的話就使用默認的環(huán)境ID嗎,然后在各個環(huán)境里取ID對應的項。也就是說一個Configuration只會保存一個數據庫環(huán)境,如果要配置多數據庫環(huán)境的話需要創(chuàng)建多個Configuration對象。在改方法內先解析事務工廠、再解析數據源、然后再解析數據庫環(huán)境,在解析數據庫環(huán)境的過程中會訪問一次數據庫,以取得數據庫類型信息。
8. mapper映射器
通過XMLConfigBuilder的mapperElement方法解析,在該方法內部通過調用XMLMapperBuilder的parse方法完成。mapper的解析是mybatis的核心功能,涉及的流程較復雜,在下一章將專門分析,敬請期待。
|