深刻淺出MyBatis-Configuration 原文連接http://blog.csdn.net/hupanfeng/article/details/9080545

Configuration是幹嗎的

Configuration就像是Mybatis的總管,Mybatis的全部配置信息都存放在這裏,此外,它還提供了設置這些配置信息的方法。 Configuration能夠從配置文件裏獲取屬性值,也能夠經過程序直接設置。Configuration裏可供配置的屬性有:html

1.       properties屬性java

1)       配置示例spring

[html] view plain copy
  1. <properties resource="org/mybatis/example/config.properties">   
  2. <property name="username" value="dev_user"/>   
  3. <property name="password" value="F2Fa3!33TYyg"/>   
  4. </properties>  

2)       用途sql

properties裏配置的屬性將被存放在Configuration的variables變量裏,供Mybatis使用。此外在配置文件中,也可使用這些屬性,用來對配置項實現動態配置。好比:數據庫

[html] view plain copy
  1. <dataSource type="POOLED">   
  2. <property name="driver" value="${driver}"/>   
  3. <property name="url" value="${url}"/>   
  4. <property name="username" value="${username}"/>   
  5. <property name="password" value="${password}"/>   
  6. </dataSource>  

3)       注意事項緩存

resource裏也可指定屬性值,而且resource裏屬性值的優先級高於property子節點裏配置的值,也就是說resource的同名屬性將會覆蓋於property子節點裏的值。tomcat

2.        settings設置服務器

1)       配置示例mybatis

[html] view plain copy
  1. <settings>   
  2. <setting name="cacheEnabled" value="true"/>   
  3. <setting name="lazyLoadingEnabled" value="true"/>   
  4. <setting name="multipleResultSetsEnabled" value="true"/>   
  5. <setting name="useColumnLabel" value="true"/>   
  6. <setting name="useGeneratedKeys" value="false"/>   
  7. <setting name="enhancementEnabled" value="false"/>   
  8. <setting name="defaultExecutorType" value="SIMPLE"/>   
  9. <setting name="defaultStatementTimeout" value="25000"/>   
  10. </settings>  

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)       配置示例

[html] view plain copy
  1. <typeAliases>   
  2. <typeAlias alias="Author" type="domain.blog.Author"/>   
  3. <typeAlias alias="Blog" type="domain.blog.Blog"/>   
  4. <typeAlias alias="Comment" type="domain.blog.Comment"/>   
  5. <typeAlias alias="Post" type="domain.blog.Post"/>   
  6. <typeAlias alias="Section" type="domain.blog.Section"/>   
  7. <typeAlias alias="Tag" type="domain.blog.Tag"/>   
  8. </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)       配置示例

[html] view plain copy
  1. <typeHandlers>   
  2. <typeHandler javaType="String" jdbcType="VARCHAR" handler="org.mybatis.example.ExampleTypeHandler"/>   
  3. </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)       配置示例

[html] view plain copy
  1. <plugins>   
  2. <plugin interceptor="org.mybatis.example.ExamplePlugin">   
  3. <property name="someProperty" value="100"/>   
  4. </plugin>   
  5. </plugins>  

2)       用途

插件能夠改變某些類的執行, MyBatis容許被插件來攔截的類有:

 

[java] view plain copy
  1. Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)   
  2. ParameterHandler (getParameterObject, setParameters)   
  3. ResultSetHandler (handleResultSets, handleOutputParameters)   
  4. StatementHandler (prepare, parameterize, batch, update, query)  

3)       注意事項

插件能夠改變MyBatis底層的行爲,所以功能很是強大。但在對MyBatis深刻理解前不要急着編寫本身的插件,由於若插件編寫不當,將致使整個MyBatis都不能正常工做。本系列的後面會有專門的章節介紹插件機制以及兩個有用的插件,歡迎持續關注。

7.       environments環境

environments裏能夠配置多個environment,每一個environment對應一個數據庫環境。一個完整的定義以下:

[html] view plain copy
  1. <environments default="development">   
  2. <environment id="development">   
  3. <transactionManager type="JDBC">   
  4. </transactionManager>   
  5. <dataSource type="POOLED">   
  6. <property name="driver" value="${driver}"/>   
  7. <property name="url" value="${url}"/>   
  8. <property name="username" value="${username}"/>   
  9. <property name="password" value="${password}"/>   
  10. </dataSource>   
  11. </environment>   
  12. </environments>  

environments裏的default屬性表示默認的數據庫環境,與某個environment的id相對應。

1)       environment環境變量

environment經過id屬性與其餘數據庫環境區別。它有兩個子節點:

a)       transactionManager事務管理器

MyBatis中有兩種事務管理器類型(也就是type=」[JDBC|MANAGED]」):

l JDBC這個配置直接簡單使用了JDBC的提交和回滾設置。它依賴於從數據源獲得的鏈接來管理事務範圍。

l MANAGED這個配置幾乎沒作什麼。它歷來不提交或回滾一個鏈接。而它會讓容器來管理事務的整個生命週期(好比SpringJEE應用服務器的上下文)

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)       配置示例

[html] view plain copy
  1. <mappers>   
  2. <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>   
  3. <mapper resource="org/mybatis/builder/BlogMapper.xml"/>   
  4. <mapper resource="org/mybatis/builder/PostMapper.xml"/>   
  5. </mappers>  

2)       用途

Mappers用於告訴Mybatis去哪裏尋找sql映射文件。sql映射文件是Mybatis最靈活的地方。sql映射文件在後續的章節裏會進一步詳細描述,歡迎持續關注。

如何構建configuration

前面介紹了Configuration的各個屬性以及在文件裏配置他們的方法。這一節介紹如何從文件裏解析這些配置項以及簡化配置的方法。 Configuration在SqlSessionFactoryBuilder建立SqlSessionFactory時建立,經過 XMLConfigBuilder的parse方法建立。下面一個個的介紹:

1.       properties屬性

經過XMLConfigBuilder的propertiesElement方法解析,解析後的結果存放在Configuration的variables變量裏。解析順序,先解析子節點裏的屬性值,再解析resource屬性指定的配置文件裏的值。後者會覆蓋前者的值。

2.        settings設置

經過XMLConfigBuildersettingsElement方法解析,解析前校驗屬性是不是可配置的,只要有一個不可配置,整個mybatis就會異常退出,因此配置這些屬性務必當心

3.       typeAliases類型命名

經過XMLConfigBuildertypeAliasesElement方法解析,在該方法內部調用TypeAliasRegistryregisterAlias方法完成註冊,並將註冊的別名存入本地緩存中。XMLConfigBuilder調用的registerAlias方法並無什麼特別的地方,但TypeAliasRegistry卻提供了批量註冊別名的方法,該方法只須要一個包名參數。該方法會在指定的包路徑下掃描可註冊的類(接口和內部類除外),並以類的簡單名爲key完整名爲value註冊別名。這個方法極大的簡化了配置,後續章節將要介紹的springmybatis的整合模塊裏就使用了這個方法使得配置量大大減小。

4.       typeHandlers類型處理器

經過XMLConfigBuildertypeHandlerElement方法解析,在該方法內部調用TypeHandlerRegistryregister方法完成註冊,並將註冊的類型處理器存入本地緩存中。同typeAliases同樣,TypeHandlerRegistry也提供了批量註冊的方法,該方法一樣只須要一個包名參數。該方法會在指定的包路徑下掃描可註冊的類(接口、抽象類和內部類除外),不過只註冊那些配置了MappedTypes註解的類。這個方法極大的簡化了配置,後續章節將要介紹的springmybatis的整合模塊裏就使用了這個方法使得配置量大大減小。

5.       objectFactory對象工廠

略(不經常使用)

6.       plugins插件

經過XMLConfigBuilder的pluginElement方法解析,在該方法內部實例化插件對象後存入Configuration的interceptorChain變量裏。

7.       environments環境

經過XMLConfigBuilderenvironmentsElement方 法解析,在該方法內,先判斷默認是否指定了環境ID,沒有的話就使用默認的環境ID嗎,而後在各個環境裏取ID對應的項。也就是說一個 Configuration只會保存一個數據庫環境,若是要配置多數據庫環境的話須要建立多個Configuration對象。在改方法內先解析事務工 廠、再解析數據源、而後再解析數據庫環境,在解析數據庫環境的過程當中會訪問一次數據庫,以取得數據庫類型信息。

8.        mapper映射器

經過XMLConfigBuilder的mapperElement方法解析,在該方法內部經過調用XMLMapperBuilder的parse方法完成。

相關文章
相關標籤/搜索