MyBatis的全局配置文件
概述
MyBatis的全局配置文件可以配置的屬性如下
- properties 屬性
- settings 設(shè)置
- typeAliases 類型別名
- typeHandlers 類型處理器
- objectFactory 對(duì)象工廠
- plugins 插件
- environments 環(huán)境
- environment 環(huán)境變量
- transactionManager 事務(wù)管理器
- dataSource 數(shù)據(jù)源
- environment 環(huán)境變量
- databaseIdProvider 數(shù)據(jù)庫(kù)廠商標(biāo)識(shí)
- mappers 映射器
properties屬性
MyBatis使用properties來(lái)引入外部properties配置文件的內(nèi)容系草,resource:引入類路徑下的資源碍论,url引入網(wǎng)絡(luò)路徑或者磁盤(pán)路徑下的資源《ㄒ常可以用于將數(shù)據(jù)源連接信息放在properties文件中踢械,與Spring整合后就寫(xiě)在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 | 全局開(kāi)啟或關(guān)閉配置文件中的所有映射器任何緩存 | true | false | true |
lazyLoadingEnabled | 延遲加載的全局開(kāi)關(guān) | true | false | false |
aggressive<br />LazyLoading | 開(kāi)啟德绿,任何方法的調(diào)用都會(huì)加載該對(duì)象的所有屬性荷荤。<br />否則,每個(gè)屬性會(huì)按需加載 | true | false | false |
multipleResult<br />SetsEnabled | 是否允許單一語(yǔ)句返回多結(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)映射沒(méi)有定義嵌套結(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ù)處理語(yǔ)句(prepared statements); BATCH 執(zhí)行器將重用語(yǔ)句并執(zhí)行批量更新稻薇。 | SIMPLE REUSE BATCH | SIMPLE |
default<br />StatementTimeout | 設(shè)置超時(shí)時(shí)間嫂冻,它決定驅(qū)動(dòng)等待數(shù)據(jù)庫(kù)響應(yīng)的秒數(shù)。 | 任意正整數(shù) | |
defaultFetchSize | 為驅(qū)動(dòng)的結(jié)果集獲取數(shù)量(fetchSize)設(shè)置一個(gè)提示值塞椎。此參數(shù)只可以在查詢?cè)O(shè)置中被覆蓋桨仿。 | 任意正整數(shù) | |
safeRow<br />BoundsEnabled | 允許在嵌套語(yǔ)句中使用分頁(yè)(RowBounds)。如果允許使用則設(shè)置為false案狠。 | true | false | False |
safeResult<br />HandlerEnabled | 允許在嵌套語(yǔ)句中使用分頁(yè)(ResultHandler)服傍。如果允許使用則設(shè)置為false。 | true | false | True |
mapUnderscore<br />ToCamelCase | 是否開(kāi)啟自動(dòng)駝峰命名規(guī)則(camel case)映射骂铁,即從經(jīng)典數(shù)據(jù)庫(kù)列名 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ì)話僅用在語(yǔ)句執(zhí)行上钞支,對(duì)相同 SqlSession 的不同調(diào)用將不會(huì)共享數(shù)據(jù)茫蛹。 | SESSION | STATEMENT |
SESSION |
jdbcTypeForNull | 當(dāng)沒(méi)有為參數(shù)提供特定的 JDBC 類型時(shí),為空值指定 JDBC 類型伸辟。 某些驅(qū)動(dòng)需要指定列的 JDBC 類型麻惶,多數(shù)情況直接用一般類型即可,比如 NULL信夫、VARCHAR 或 OTHER窃蹋。 | OTHER | |
lazyLoadTrigger<br />Methods | 指定哪個(gè)對(duì)象的方法觸發(fā)一次延遲加載。 | ||
defaultScripting<br />Language | 指定動(dòng)態(tài) SQL 生成的默認(rèn)語(yǔ)言静稻。 | ||
defaultEnum<br />TypeHandler | 指定 Enum 使用的默認(rèn) TypeHandler 警没。 (從3.4.5開(kāi)始) |
||
callSettersOnNulls | 指定當(dāng)結(jié)果集中值為 null 的時(shí)候是否調(diào)用映射對(duì)象的 setter(map 對(duì)象時(shí)為 put)方法,這對(duì)于有 Map.keySet() 依賴或 null 值初始化的時(shí)候是有用的振湾。注意基本類型(int杀迹、boolean等)是不能設(shè)置成 null 的。 | true | false | false |
returnInstance<br />ForEmptyRow | 當(dāng)返回行的所有列都是空時(shí)押搪,MyBatis默認(rèn)返回null 树酪。 當(dāng)開(kāi)啟這個(gè)設(shè)置時(shí),MyBatis會(huì)返回一個(gè)空實(shí)例大州。 請(qǐng)注意续语,它也適用于嵌套的結(jié)果集 (i.e. collectioin and association)。(從3.4.2開(kāi)始) |
true | false | false |
logPrefix | 指定 MyBatis 增加到日志名稱的前綴厦画。 | 任何字符串 | |
logImpl | 指定 MyBatis 所用日志的具體實(shí)現(xiàn)疮茄,未指定時(shí)將自動(dòng)查找滥朱。 | ||
proxyFactory | 指定 Mybatis 創(chuàng)建具有延遲加載能力的對(duì)象用到的代理工具。 | CGLIB | JAVASSIST |
常用的Setting設(shè)置
設(shè)置參數(shù) | 描述 | 默認(rèn)值 |
---|---|---|
mapUnderscoreToCamelCase | 是否開(kāi)啟駝峰命名規(guī)則映射A_COLUNM到aColumn | false |
defaultStatementTimeout | 設(shè)置超時(shí)時(shí)間力试,它決定驅(qū)動(dòng)等待數(shù)據(jù)庫(kù)響應(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),存在的意義僅在于用來(lái)減少類完全限定名的冗余,但是往往我們不會(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)的別名(類名小寫(xiě))
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
每一個(gè)在包 domain.blog
中的 Java Bean民鼓,在沒(méi)有注解的情況下,會(huì)使用 Bean 的首字母小寫(xiě)的非限定類名來(lái)作為它的別名蓬抄。 比如 domain.blog.Author
的別名為 author
;若有注解夯到,則別名為其注解值嚷缭。
@Alias("author")
public class Author {}
typeHandlers 類型處理器
無(wú)論是 MyBatis 在預(yù)處理語(yǔ)句(PreparedStatement)中設(shè)置一個(gè)參數(shù)時(shí),還是從結(jié)果集中取出一個(gè)值時(shí)耍贾, 都會(huì)用類型處理器將獲取的值以合適的方式轉(zhuǎn)換成 Java 類型阅爽。下表描述了一些默認(rèn)的類型處理器。
類型處理器 | Java類型 | JDBC類型 |
---|---|---|
BooleanTypeHandler |
java.lang.Boolean , boolean
|
數(shù)據(jù)庫(kù)兼容的 BOOLEAN
|
ByteTypeHandler |
java.lang.Byte , byte
|
數(shù)據(jù)庫(kù)兼容的 NUMERIC 或 BYTE
|
ShortTypeHandler |
java.lang.Short , short
|
數(shù)據(jù)庫(kù)兼容的 NUMERIC 或 SHORT INTEGER
|
IntegerTypeHandler |
java.lang.Integer , int
|
數(shù)據(jù)庫(kù)兼容的 NUMERIC 或 INTEGER
|
LongTypeHandler |
java.lang.Long , long
|
數(shù)據(jù)庫(kù)兼容的 NUMERIC 或 LONG INTEGER
|
FloatTypeHandler |
java.lang.Float , float
|
數(shù)據(jù)庫(kù)兼容的 NUMERIC 或 FLOAT
|
DoubleTypeHandler |
java.lang.Double , double
|
數(shù)據(jù)庫(kù)兼容的 NUMERIC 或 DOUBLE
|
BigDecimalTypeHandler |
java.math.BigDecimal |
數(shù)據(jù)庫(kù)兼容的 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ù)庫(kù)兼容的字節(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 允許你在已映射語(yǔ)句執(zhí)行過(guò)程中的某一點(diǎn)進(jìn)行攔截調(diào)用晃听。默認(rèn)情況下百侧,MyBatis 允許使用插件來(lái)攔截的方法調(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ù)庫(kù),就需要?jiǎng)?chuàng)建兩個(gè) SqlSessionFactory 實(shí)例见秤,每個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)砂竖。而如果是三個(gè)數(shù)據(jù)庫(kù),就需要三個(gè)實(shí)例 鹃答。每個(gè)數(shù)據(jù)庫(kù)對(duì)應(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)境配置說(shuō)明
- 默認(rèn)的環(huán)境 ID(比如:default="development")乎澄。
- 每個(gè) environment 元素定義的環(huán)境 ID(比如:id="development")。
- 事務(wù)管理器的配置(比如:type="JDBC")挣跋。
- 數(shù)據(jù)源的配置(比如:type="POOLED")三圆。