1. 程式人生 > >深入Mybatis配置文件

深入Mybatis配置文件

myba 處理器 any behavior 校驗 session chain cep 測試

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配置文件