MyBatis的全局配置文件
概述
MyBatis的全局配置文件可以配置的屬性如下
- properties 屬性
- settings 設(shè)置
- typeAliases 類型別名
- typeHandlers 類型處理器
- objectFactory 對象工廠
- plugins 插件
- environments 環(huán)境
- environment 環(huán)境變量
- transactionManager 事務(wù)管理器
- dataSource 數(shù)據(jù)源
- environment 環(huán)境變量
- databaseIdProvider 數(shù)據(jù)庫廠商標(biāo)識
- mappers 映射器
properties屬性
MyBatis使用properties來引入外部properties配置文件的內(nèi)容,resource:引入類路徑下的資源,url引入網(wǎng)絡(luò)路徑或者磁盤路徑下的資源??梢杂糜趯?shù)據(jù)源連接信息放在properties文件中,與Spring整合后就寫在Spring的配置文件中。
引入外部properties文件
<properties resource="org/mybatis/example/config.properties"></properties>
使用引入的properties文件
<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>
settings運(yùn)行時(shí)設(shè)置
這是 MyBatis 中極為重要的調(diào)整設(shè)置,它們會(huì)改變 MyBatis 的運(yùn)行時(shí)行為。下表描述了設(shè)置中各項(xiàng)的意圖、默認(rèn)值等。
| 設(shè)置參數(shù) | 描述 | 有效值 | 默認(rèn)值 |
|---|---|---|---|
| cacheEnabled | 全局開啟或關(guān)閉配置文件中的所有映射器任何緩存 | true | false | true |
| lazyLoadingEnabled | 延遲加載的全局開關(guān) | true | false | false |
| aggressive<br />LazyLoading | 開啟,任何方法的調(diào)用都會(huì)加載該對象的所有屬性。<br />否則,每個(gè)屬性會(huì)按需加載 | true | false | false |
| multipleResult<br />SetsEnabled | 是否允許單一語句返回多結(jié)果集 | true | false | true |
| useColumnLabel | 使用列標(biāo)簽代替列名。 | true | false | true |
| useGeneratedKeys | 允許 JDBC 支持自動(dòng)生成主鍵<br /> 如果設(shè)置為 true 則這個(gè)設(shè)置強(qiáng)制使用自動(dòng)生成主鍵 | true | false | False |
| autoMappingBehavior | 指定 MyBatis 應(yīng)如何自動(dòng)映射列到字段或?qū)傩浴?lt;br /> NONE 表示取消自動(dòng)映射;<br />PARTIAL 只會(huì)自動(dòng)映射沒有定義嵌套結(jié)果集映射的結(jié)果集。<br /> FULL 會(huì)自動(dòng)映射任意復(fù)雜的結(jié)果集 | NONE, PARTIAL, FULL |
PARTIAL |
| autoMapping<br />Unknown<br />ColumnBehavior | 指定發(fā)現(xiàn)自動(dòng)映射目標(biāo)未知列(或者未知屬性類型)的行為。<br />NONE: 不做任何反應(yīng)<br />WARNING: 輸出提醒 |
NONE, WARNING, FAILING | NONE |
| defaultExecutorType | 配置默認(rèn)的執(zhí)行器。SIMPLE 就是普通的執(zhí)行器;REUSE 執(zhí)行器會(huì)重用預(yù)處理語句(prepared statements); BATCH 執(zhí)行器將重用語句并執(zhí)行批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
| default<br />StatementTimeout | 設(shè)置超時(shí)時(shí)間,它決定驅(qū)動(dòng)等待數(shù)據(jù)庫響應(yīng)的秒數(shù)。 | 任意正整數(shù) | |
| defaultFetchSize | 為驅(qū)動(dòng)的結(jié)果集獲取數(shù)量(fetchSize)設(shè)置一個(gè)提示值。此參數(shù)只可以在查詢設(shè)置中被覆蓋。 | 任意正整數(shù) | |
| safeRow<br />BoundsEnabled | 允許在嵌套語句中使用分頁(RowBounds)。如果允許使用則設(shè)置為false。 | true | false | False |
| safeResult<br />HandlerEnabled | 允許在嵌套語句中使用分頁(ResultHandler)。如果允許使用則設(shè)置為false。 | true | false | True |
| mapUnderscore<br />ToCamelCase | 是否開啟自動(dòng)駝峰命名規(guī)則(camel case)映射,即從經(jīng)典數(shù)據(jù)庫列名 A_COLUMN 到經(jīng)典 Java 屬性名 aColumn 的類似映射。 | true | false | False |
| localCacheScope | MyBatis 利用本地緩存機(jī)制(Local Cache)防止循環(huán)引用(circular references)和加速重復(fù)嵌套查詢。 默認(rèn)值為 SESSION,這種情況下會(huì)緩存一個(gè)會(huì)話中執(zhí)行的所有查詢。 若設(shè)置值為 STATEMENT,本地會(huì)話僅用在語句執(zhí)行上,對相同 SqlSession 的不同調(diào)用將不會(huì)共享數(shù)據(jù)。 | SESSION | STATEMENT |
SESSION |
| jdbcTypeForNull | 當(dāng)沒有為參數(shù)提供特定的 JDBC 類型時(shí),為空值指定 JDBC 類型。 某些驅(qū)動(dòng)需要指定列的 JDBC 類型,多數(shù)情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 | OTHER | |
| lazyLoadTrigger<br />Methods | 指定哪個(gè)對象的方法觸發(fā)一次延遲加載。 | ||
| defaultScripting<br />Language | 指定動(dòng)態(tài) SQL 生成的默認(rèn)語言。 | ||
| defaultEnum<br />TypeHandler | 指定 Enum 使用的默認(rèn) TypeHandler 。 (從3.4.5開始) |
||
| callSettersOnNulls | 指定當(dāng)結(jié)果集中值為 null 的時(shí)候是否調(diào)用映射對象的 setter(map 對象時(shí)為 put)方法,這對于有 Map.keySet() 依賴或 null 值初始化的時(shí)候是有用的。注意基本類型(int、boolean等)是不能設(shè)置成 null 的。 | true | false | false |
| returnInstance<br />ForEmptyRow | 當(dāng)返回行的所有列都是空時(shí),MyBatis默認(rèn)返回null。 當(dāng)開啟這個(gè)設(shè)置時(shí),MyBatis會(huì)返回一個(gè)空實(shí)例。 請注意,它也適用于嵌套的結(jié)果集 (i.e. collectioin and association)。(從3.4.2開始) |
true | false | false |
| logPrefix | 指定 MyBatis 增加到日志名稱的前綴。 | 任何字符串 | |
| logImpl | 指定 MyBatis 所用日志的具體實(shí)現(xiàn),未指定時(shí)將自動(dòng)查找。 | ||
| proxyFactory | 指定 Mybatis 創(chuàng)建具有延遲加載能力的對象用到的代理工具。 | CGLIB | JAVASSIST |
常用的Setting設(shè)置
| 設(shè)置參數(shù) | 描述 | 默認(rèn)值 |
|---|---|---|
| mapUnderscoreToCamelCase | 是否開啟駝峰命名規(guī)則映射A_COLUNM到aColumn | false |
| defaultStatementTimeout | 設(shè)置超時(shí)時(shí)間,它決定驅(qū)動(dòng)等待數(shù)據(jù)庫響應(yīng)的秒數(shù) |
Settings設(shè)置示例
<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="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
typeAliases別名
類型別名是為 Java 類型設(shè)置一個(gè)短的名字。它只和 XML 配置有關(guān),存在的意義僅在于用來減少類完全限定名的冗余,但是往往我們不會(huì)使用別名,是為了方便查看代碼。
<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>
指定一個(gè)包名,MyBatis 會(huì)在包名下面搜索需要的 Java Bean,給包和子包下的所有類起一個(gè)默認(rèn)的別名(類名小寫)
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
每一個(gè)在包 domain.blog 中的 Java Bean,在沒有注解的情況下,會(huì)使用 Bean 的首字母小寫的非限定類名來作為它的別名。 比如 domain.blog.Author 的別名為 author;若有注解,則別名為其注解值。
@Alias("author")
public class Author {}
typeHandlers 類型處理器
無論是 MyBatis 在預(yù)處理語句(PreparedStatement)中設(shè)置一個(gè)參數(shù)時(shí),還是從結(jié)果集中取出一個(gè)值時(shí), 都會(huì)用類型處理器將獲取的值以合適的方式轉(zhuǎn)換成 Java 類型。下表描述了一些默認(rèn)的類型處理器。
| 類型處理器 | Java類型 | JDBC類型 |
|---|---|---|
| BooleanTypeHandler |
java.lang.Boolean, boolean
|
數(shù)據(jù)庫兼容的 BOOLEAN
|
ByteTypeHandler |
java.lang.Byte, byte
|
數(shù)據(jù)庫兼容的 NUMERIC 或 BYTE
|
ShortTypeHandler |
java.lang.Short, short
|
數(shù)據(jù)庫兼容的 NUMERIC 或 SHORT INTEGER
|
IntegerTypeHandler |
java.lang.Integer, int
|
數(shù)據(jù)庫兼容的 NUMERIC 或 INTEGER
|
LongTypeHandler |
java.lang.Long, long
|
數(shù)據(jù)庫兼容的 NUMERIC 或 LONG INTEGER
|
FloatTypeHandler |
java.lang.Float, float
|
數(shù)據(jù)庫兼容的 NUMERIC 或 FLOAT
|
DoubleTypeHandler |
java.lang.Double, double
|
數(shù)據(jù)庫兼容的 NUMERIC 或 DOUBLE
|
BigDecimalTypeHandler |
java.math.BigDecimal |
數(shù)據(jù)庫兼容的 NUMERIC 或 DECIMAL
|
StringTypeHandler |
java.lang.String |
CHAR, VARCHAR
|
ClobReaderTypeHandler |
java.io.Reader |
- |
ClobTypeHandler |
java.lang.String |
CLOB, LONGVARCHAR
|
NStringTypeHandler |
java.lang.String |
NVARCHAR, NCHAR
|
NClobTypeHandler |
java.lang.String |
NCLOB |
BlobInputStreamTypeHandler |
java.io.InputStream |
- |
ByteArrayTypeHandler |
byte[] |
數(shù)據(jù)庫兼容的字節(jié)流類型 |
BlobTypeHandler |
byte[] |
BLOB, LONGVARBINARY
|
DateTypeHandler |
java.util.Date |
TIMESTAMP |
DateOnlyTypeHandler |
java.util.Date |
DATE |
TimeOnlyTypeHandler |
java.util.Date |
TIME |
SqlTimestampTypeHandler |
java.sql.Timestamp |
TIMESTAMP |
SqlDateTypeHandler |
java.sql.Date |
DATE |
SqlTimeTypeHandler |
java.sql.Time |
TIME |
ObjectTypeHandler |
Any |
OTHER 或未指定類型 |
EnumTypeHandler |
Enumeration Type | VARCHAR-任何兼容的字符串類型,存儲(chǔ)枚舉的名稱(而不是索引) |
EnumOrdinalTypeHandler |
Enumeration Type | 任何兼容的 NUMERIC 或 DOUBLE 類型,存儲(chǔ)枚舉的索引(而不是名稱)。 |
InstantTypeHandler |
java.time.Instant |
TIMESTAMP |
LocalDateTimeTypeHandler |
java.time.LocalDateTime |
TIMESTAMP |
LocalDateTypeHandler |
java.time.LocalDate |
DATE |
LocalTimeTypeHandler |
java.time.LocalTime |
TIME |
OffsetDateTimeTypeHandler |
java.time.OffsetDateTime |
TIMESTAMP |
OffsetTimeTypeHandler |
java.time.OffsetTime |
TIME |
ZonedDateTimeTypeHandler |
java.time.ZonedDateTime |
TIMESTAMP |
YearTypeHandler |
java.time.Year |
INTEGER |
MonthTypeHandler |
java.time.Month |
INTEGER |
YearMonthTypeHandler |
java.time.YearMonth |
VARCHAR or LONGVARCHAR
|
JapaneseDateTypeHandler |
java.time.chrono.JapaneseDate |
DATE |
plugins插件
MyBatis 允許你在已映射語句執(zhí)行過程中的某一點(diǎn)進(jìn)行攔截調(diào)用。默認(rèn)情況下,MyBatis 允許使用插件來攔截的方法調(diào)用
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
environments環(huán)境配置
MyBatis可以配置多種環(huán)境,default代表指定使用某種環(huán)境,這樣就可以快速切換環(huán)境,盡管可以配置多個(gè)環(huán)境,每個(gè) SqlSessionFactory 實(shí)例只能選擇其一 ,所以,如果你想連接兩個(gè)數(shù)據(jù)庫,就需要?jiǎng)?chuàng)建兩個(gè) SqlSessionFactory 實(shí)例,每個(gè)數(shù)據(jù)庫對應(yīng)一個(gè)。而如果是三個(gè)數(shù)據(jù)庫,就需要三個(gè)實(shí)例 。每個(gè)數(shù)據(jù)庫對應(yīng)一個(gè) SqlSessionFactory 實(shí)例
環(huán)境配置實(shí)例
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</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>
環(huán)境配置說明
- 默認(rèn)的環(huán)境 ID(比如:default="development")。
- 每個(gè) environment 元素定義的環(huán)境 ID(比如:id="development")。
- 事務(wù)管理器的配置(比如:type="JDBC")。
- 數(shù)據(jù)源的配置(比如:type="POOLED")。