本篇會摘錄mybatis全局配置文件中比較常見常用的一些配置進行說明,其實
官方文檔已經寫得足夠清晰了(關鍵是還有中文版完全不慌),此處記錄重要還是作為個人的鞏固記錄。
1、properties
在全局配置文件中,屬性的值是可以由外部配置進行動態替換的,這也就使我們把諸如 “數據庫連接信息放到單獨的文件” 成為可能,這里有兩種方式:
- 配置信息放在常見的 .properties 文件中,通過 resource 屬性來引入
- 直接通過 property 屬性進行定義
如下有 .properties 文件:
jdbc.username=root
jdbc.password=dev
2
1
jdbc.username=root
2
jdbc.password=dev
則我們在配置文件中配置數據庫連接信息可以這樣:
<configuration>
<properties resource="db.properties">
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/dbgirl" />
</properties>
<environments default="development">
<environment id="development">
<!-- 使用jdbc事務管理 -->
<transactionManager type="JDBC"/>
<!-- 數據庫連接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sqlmapper/GirlMapper.xml"/>
</mappers>
</configuration>
23
1
<configuration>
2
<properties resource="db.properties">
3
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
4
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/dbgirl" />
5
</properties>
6
7
<environments default="development">
8
<environment id="development">
9
<!-- 使用jdbc事務管理 -->
10
<transactionManager type="JDBC"/>
11
<!-- 數據庫連接池 -->
12
<dataSource type="POOLED">
13
<property name="driver" value="${jdbc.driver}"/>
14
<property name="url" value="${jdbc.url}"/>
15
<property name="username" value="${jdbc.username}"/>
16
<property name="password" value="${jdbc.password}"/>
17
</dataSource>
18
</environment>
19
</environments>
20
<mappers>
21
<mapper resource="sqlmapper/GirlMapper.xml"/>
22
</mappers>
23
</configuration>
屬性值通過表達式
${ } 來讀取,如上例中 driver 和 url 將從 properties 的元素 <property> 中讀取,而 username 和 url 則可以從 db.properties 中讀取。當然,更多情況下我們還是統一寫在 .properties 中。需要注意的是,properties 元素體內的屬性會優先讀取,這意味着如果你在兩個地方分別定義了同名的屬性,那么最終讀取到的值會以 .properties 文件中的為准。
2、environments
2.1 environment
如上例中我們的數據庫連接配置是放置在 <environments> 中的 <environment> 標簽中,這是MyBatis提供的多環境適應機制,例如開發、測試、生產環境都需要有不同的配置,這意味着假如你有生產環境和開發環境兩種配置,你可以這樣寫:
<environments default="development">
<!--開發環境-->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="root"/>
<property name="password" value="dev"/>
</dataSource>
</environment>
<!--生產環境-->
<environment id="produce">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
24
1
<environments default="development">
2
<!--開發環境-->
3
<environment id="development">
4
<transactionManager type="JDBC"/>
5
<dataSource type="POOLED">
6
<property name="driver" value="${jdbc.driver}"/>
7
<property name="url" value="${jdbc.url}"/>
8
<property name="username" value="root"/>
9
<property name="password" value="dev"/>
10
</dataSource>
11
</environment>
12
13
<!--生產環境-->
14
<environment id="produce">
15
<transactionManager type="JDBC"/>
16
<dataSource type="POOLED">
17
<property name="driver" value="${jdbc.driver}"/>
18
<property name="url" value="${jdbc.url}"/>
19
<property name="username" value="${jdbc.username}"/>
20
<property name="password" value="${jdbc.password}"/>
21
</dataSource>
22
</environment>
23
24
</environments>
- environment 的 id 屬性用來區分和定義不同的配置環境
- environments 的 default 用來確定默認使用的配置環境,值是某個 environment 的 id
需要注意的是,
盡管可以配置多個環境,但每個 SqlSessionFactory 實例只能選擇其一,如果想連接兩個數據庫,就需要創建兩個 SqlSessionFactory 實例,每個數據庫對應一個。
為了確定創建哪種環境,我們往往需要將其作為參數傳給 SqlSessionFactoryBuilder :
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
2
1
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
2
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
如果忽略將 environment 作為參數傳入,則會加載默認的環境:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
2
1
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
2
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
2.2 transactionManager
在 MyBatis 中有兩種類型的事務管理器:
- JDBC - 這個配置就是直接使用了 JDBC 的提交和回滾設置,它依賴於從數據源得到的連接來管理事務作用域
- MANAGED - 這個配置從來不提交或回滾一個連接,而是讓容器來管理事務的整個生命周期
注:
如果你在使用 Spring + MyBatis,則沒有必要配置事務管理器,因為 Spring 模塊會使用自帶的管理器來覆蓋前面的配置
2.3 dataSource
dataSource 元素使用標准的 JDBC 數據源接口來配置 JDBC 連接對象的資源,有三種內建的數據源類型
- UNPOOLED - 只是每次被請求時打開和關閉連接
- POOLED - 利用“池”的概念將 JDBC 連接對象組織起來,避免了創建新的連接實例時所必需的初始化和認證時間
- JNDI - 為了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數據源,然后放置一個 JNDI 上下文的引用
3、mappers
mappers是用來讓告訴MyBatis去哪找到那些執行的SQL語句,可以使用
相對於類路徑的資源引用, 或
完全限定資源定位符(包括 file:/// 的 URL),或
類名和
包名等:
<!-- 使用相對於類路徑的資源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定資源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口實現類的完全限定類名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 將包內的映射器接口實現全部注冊為映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
25
1
<!-- 使用相對於類路徑的資源引用 -->
2
<mappers>
3
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
4
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
5
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
6
</mappers>
7
8
<!-- 使用完全限定資源定位符(URL) -->
9
<mappers>
10
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
11
<mapper url="file:///var/mappers/BlogMapper.xml"/>
12
<mapper url="file:///var/mappers/PostMapper.xml"/>
13
</mappers>
14
15
<!-- 使用映射器接口實現類的完全限定類名 -->
16
<mappers>
17
<mapper class="org.mybatis.builder.AuthorMapper"/>
18
<mapper class="org.mybatis.builder.BlogMapper"/>
19
<mapper class="org.mybatis.builder.PostMapper"/>
20
</mappers>
21
22
<!-- 將包內的映射器接口實現全部注冊為映射器 -->
23
<mappers>
24
<package name="org.mybatis.builder"/>
25
</mappers>
4、settings
在標題1-3中是MyBatis最最基本需要我們改變的配置信息,而settings則是用來改變MyBatis運行時行為的重要調整設置,因為屬性較多此處不再細細展開,詳見
官方文檔,如下例為官方提供的部分示例,以在此處做簡要說明:
<settings>
<!--全局地開啟或關閉配置文件中的所有映射器已經配置的任何緩存-->
<setting name="cacheEnabled" value="true"/>
<!--延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。特定關聯關系中可通過設置fetchType屬性來覆蓋該項的開關狀態-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--是否允許單一語句返回多結果集(需要兼容驅動)-->
<setting name="multipleResultSetsEnabled" value="true"/>
<!--使用列標簽代替列名,不同的驅動在這方面會有不同的表現-->
<setting name="useColumnLabel" value="true"/>
<!--允許 JDBC 支持自動生成主鍵,需要驅動兼容-->
<setting name="useGeneratedKeys" value="false"/>
<!--指定 MyBatis 應如何自動映射列到字段或屬性-->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!--指定發現自動映射目標未知列(或者未知屬性類型)的行為-->
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<!--配置默認的執行器-->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!--設置超時時間,它決定驅動等待數據庫響應的秒數-->
<setting name="defaultStatementTimeout" value="25"/>
<!--為驅動的結果集獲取數量(fetchSize)設置一個提示值。此參數只可以在查詢設置中被覆蓋-->
<setting name="defaultFetchSize" value="100"/>
<!--允許在嵌套語句中使用分頁,如果允許使用則設置為false-->
<setting name="safeRowBoundsEnabled" value="false"/>
<!--是否開啟自動駝峰命名規則映射,即從經典數據庫列名A_COLUMN到經典Java屬性名aColumn的類似映射-->
<setting name="mapUnderscoreToCamelCase" value="false"/>
<!--利用本地緩存機制防止循環引用和加速重復嵌套查詢-->
<setting name="localCacheScope" value="SESSION"/>
<!--當沒有為參數提供特定的JDBC類型時,為空值指定哪種JDBC類型-->
<setting name="jdbcTypeForNull" value="OTHER"/>
<!--指定哪個對象的方法觸發一次延遲加載,用逗號分隔的方法列表-->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
32
1
<settings>
2
<!--全局地開啟或關閉配置文件中的所有映射器已經配置的任何緩存-->
3
<setting name="cacheEnabled" value="true"/>
4
<!--延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。特定關聯關系中可通過設置fetchType屬性來覆蓋該項的開關狀態-->
5
<setting name="lazyLoadingEnabled" value="true"/>
6
<!--是否允許單一語句返回多結果集(需要兼容驅動)-->
7
<setting name="multipleResultSetsEnabled" value="true"/>
8
<!--使用列標簽代替列名,不同的驅動在這方面會有不同的表現-->
9
<setting name="useColumnLabel" value="true"/>
10
<!--允許 JDBC 支持自動生成主鍵,需要驅動兼容-->
11
<setting name="useGeneratedKeys" value="false"/>
12
<!--指定 MyBatis 應如何自動映射列到字段或屬性-->
13
<setting name="autoMappingBehavior" value="PARTIAL"/>
14
<!--指定發現自動映射目標未知列(或者未知屬性類型)的行為-->
15
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
16
<!--配置默認的執行器-->
17
<setting name="defaultExecutorType" value="SIMPLE"/>
18
<!--設置超時時間,它決定驅動等待數據庫響應的秒數-->
19
<setting name="defaultStatementTimeout" value="25"/>
20
<!--為驅動的結果集獲取數量(fetchSize)設置一個提示值。此參數只可以在查詢設置中被覆蓋-->
21
<setting name="defaultFetchSize" value="100"/>
22
<!--允許在嵌套語句中使用分頁,如果允許使用則設置為false-->
23
<setting name="safeRowBoundsEnabled" value="false"/>
24
<!--是否開啟自動駝峰命名規則映射,即從經典數據庫列名A_COLUMN到經典Java屬性名aColumn的類似映射-->
25
<setting name="mapUnderscoreToCamelCase" value="false"/>
26
<!--利用本地緩存機制防止循環引用和加速重復嵌套查詢-->
27
<setting name="localCacheScope" value="SESSION"/>
28
<!--當沒有為參數提供特定的JDBC類型時,為空值指定哪種JDBC類型-->
29
<setting name="jdbcTypeForNull" value="OTHER"/>
30
<!--指定哪個對象的方法觸發一次延遲加載,用逗號分隔的方法列表-->
31
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
32
</settings>
5、typeAliases
類型別名是為 Java 類型設置一個短的名字。它只和 XML 配置有關,存在的意義僅在於用來減少類完全限定名的冗余,如下配置時 “Blog可以用在任何使用domain.blog.Blog的地方”:
<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>
8
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>
也可以指定一個包名,MyBatis會自動掃描包中的類,自動定義別名(別名即類名,且首字母大小寫均可):
<typeAliases>
<package name="domain.blog"/>
<package name="domain.article"/>
<!-- ... -->
</typeAliases>
5
1
<typeAliases>
2
<package name="domain.blog"/>
3
<package name="domain.article"/>
4
<!-- ... -->
5
</typeAliases>
這個配置往往使得我們在mapper.xml中指定輸入參數和輸出結果類型變得簡單方便。
MyBatis中也提供了一些默認支持的別名(默認別名的規則是基本數據類型是名稱前加下划線,引用數據類型是首字母小寫):
別名 | 映射的類型 | 別名 | 映射的類型 | |
_byte | byte | double |
Double |
|
_long | long | float |
Float |
|
_short | short | boolean | Boolean |
|
_int | int | date |
Date |
|
_integer | int | decimal |
BigDecimal |
|
_double | double | bigdecimal |
BigDecimal |
|
_float | float | object |
Object |
|
_boolean | boolean | map |
Map |
|
string | String | hashmap |
HashMap |
|
byte | Byte | list |
List |
|
long | Long | arraylist | ArrayList | |
short | Short | collection | Collection | |
int | Integer | iterator | Iterator | |
integer |
Integer |
6、typeHandlers
無論是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數時,還是從結果集中取出一個值時,都會用類型處理器將獲取的值以合適的方式轉換成 Java 類型,MyBatis 中已有一些默認的類型處理器,此處列舉一二僅供參考,詳情參考
官方文檔:
類型處理器 | Java類型 | JDBC類型 |
StringTypeHandler | java.lang.String | CHAR, VARCHAR |
DateTypeHandler | java.util.Date | TIMESTAMP |
IntegerTypeHandler | java.lang.Integer, int | 數據庫兼容的 NUMERIC 或 INTEGER |
FloatTypeHandler | java.lang.Float, float | 數據庫兼容的 NUMERIC 或 FLOAT |
... | ... | ... |
當然,你也可以選擇重寫類型處理器或創建你自己的類型處理器來處理不支持的或非標准的類型,具體實現 org.apache.ibatis.type.TypeHandler 接口,或繼承 org.apache.ibatis.type.BaseTypeHandler ,通常來說MyBatis提供的類型處理器已經足夠滿足日常的開發需要,不需要我們額外自定義。
<!-- mybatis-config.xml -->
<typeHandlers>
<typeHandler handler="org.mybatis.example.CustomTypeHandler"/>
</typeHandlers>
4
1
<!-- mybatis-config.xml -->
2
<typeHandlers>
3
<typeHandler handler="org.mybatis.example.CustomTypeHandler"/>
4
</typeHandlers>
注意:舉例來說,假如你自定義的類型處理器是用來處理Java的String和JDBC的VARCHAR類型轉換,則自定義處理器會覆蓋掉原來默認的處理器。