MyBatis框架 第3章 MyBatis全局配置文件

?

第3章 MyBatis全局配置文件

3.1 MyBatis全局配置文件簡(jiǎn)介

? 1)? The MyBatis configuration contains settings and properties that have a dramatic effect on how MyBatis behaves.

MyBatis 的配置文件包含了影響 MyBatis 行為甚深的設(shè)置(settings)和屬性(properties)信息。

? 2)? 文件結(jié)構(gòu)如下:

configuration 配置

properties 屬性

settings 設(shè)置

typeAliases?類型命名

typeHandlers?類型處理器

objectFactory?對(duì)象工廠

plugins 插件

environments 環(huán)境?

environment 環(huán)境變量

transactionManager 事務(wù)管理器

dataSource 數(shù)據(jù)源

databaseIdProvider?數(shù)據(jù)庫(kù)廠商標(biāo)識(shí)

mappers 映射器

3.2 properties屬性

? 1)? 可外部配置且可動(dòng)態(tài)替換的,既可以在典型的 Java 屬性文件中配置,亦可通過(guò) properties 元素的子元素來(lái)配置? 2)? 然而properties的作用并不單單是這樣,你可以創(chuàng)建一個(gè)資源文件,名為properties的文件,將四個(gè)連接字符串的數(shù)據(jù)在資源文件中通過(guò)鍵值 對(duì)(key=value)的方式放置,不要任何符號(hào),一條占一行

3)在environment元素的dataSource元素中為其動(dòng)態(tài)設(shè)置

3.3 settings設(shè)置

? 1)? 這是 MyBatis 中極為重要的調(diào)整設(shè)置,它們會(huì)改變 MyBatis 的運(yùn)行時(shí)行為。

? 2)? 包含如下的setting設(shè)置:

3.4 typeAliases 別名處理

? 1)? 類型別名是為 Java 類型設(shè)置一個(gè)短的名字,可以方便我們引用某個(gè)類。? 2)? 類很多的情況下,可以批量設(shè)置別名這個(gè)包下的每一個(gè)類創(chuàng)建一個(gè)默認(rèn)的別名,就是簡(jiǎn)單類名小寫? 3) MyBatis已經(jīng)取好的別名

3.5 typeHandlers 類型處理器

? 1)? 無(wú)論是 MyBatis 在預(yù)處理語(yǔ)句(PreparedStatement)中設(shè)置一個(gè)參數(shù)時(shí),還是從結(jié)果集中取出一個(gè)值時(shí), 都會(huì)用類型處理器將獲取的值以合適的方式轉(zhuǎn)換成 Java 類型

? 2)? MyBatis中提供的類型處理器:

? 3) MyBatis.3. 4以前的版本需要我們手動(dòng)注冊(cè)這些處理器,以后的版本都是自動(dòng)注冊(cè)的,如需注冊(cè),需要下載mybatistypehandlers-jsr310,并通過(guò)如下方式注冊(cè)

? 4) 自定義類型轉(zhuǎn)換器

  • 我們可以重寫類型處理器或創(chuàng)建自己的類型處理器來(lái)處理不支持的或非標(biāo)準(zhǔn)的類 型
  • 步驟
  • 實(shí)現(xiàn)apache.ibatis.type.TypeHandler接口或者繼承org.apache.ibatis.type.BaseTypeHandler
  • 指定其映射某個(gè)JDBC類型(可選操作)
  • 在mybatis全局配置文件中注冊(cè)

    ?

3.6 plugins 插件機(jī)制

? 1)? 插件是MyBatis提供的一個(gè)非常強(qiáng)大的機(jī)制,我們可以通過(guò)插件來(lái)修改MyBatis的一些核心行為。插件通過(guò)動(dòng)態(tài)代理機(jī)制,可以介入四大對(duì)象的任何一個(gè)方法的執(zhí)行

? 2)? 四大對(duì)象:

Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

 

ParameterHandler (getParameterObject, setParameters)

 

ResultSetHandler (handleResultSets, handleOutputParameters)

 

StatementHandler (prepare, parameterize, batch, update, query)

3.7 environments 環(huán)境配置

? 1)? MyBatis可以配置多種環(huán)境,比如開(kāi)發(fā)、測(cè)試和生產(chǎn)環(huán)境需要有不同的配置

? 2)? 每種環(huán)境使用一個(gè)environment標(biāo)簽進(jìn)行配置并指定唯一標(biāo)識(shí)符

? 3)? 可以通過(guò)environments標(biāo)簽中的default屬性指定一個(gè)環(huán)境的標(biāo)識(shí)符來(lái)快速的切換環(huán)境

? 4)? environment-指定具體環(huán)境

id:指定當(dāng)前環(huán)境的唯一標(biāo)識(shí)

transactionManager、和dataSource都必須有? ?5)? ?transactionManager

type: ?JDBC | MANAGED | 自定義

JDBC:使用了 JDBC 的提交和回滾設(shè)置,依賴于從數(shù)據(jù)源得到的連接來(lái)管理事務(wù)范 ??圍。 JdbcTransactionFactory

MANAGED:不提交或回滾一個(gè)連接、讓容器來(lái)管理事務(wù)的整個(gè)生命周期(比如 JEE ??應(yīng)用服務(wù)器的上下文)。 ManagedTransactionFactory

自定義:實(shí)現(xiàn)TransactionFactory接口,type=全類名/別名

? 6)? dataSource

type: ?UNPOOLED | POOLED | JNDI | 自定義

UNPOOLED:不使用連接池, UnpooledDataSourceFactory

POOLED:使用連接池, PooledDataSourceFactory

JNDI: 在EJB 或應(yīng)用服務(wù)器這類容器中查找指定的數(shù)據(jù)源

自定義:實(shí)現(xiàn)DataSourceFactory接口,定義數(shù)據(jù)源的獲取方式。

? 7)? 實(shí)際開(kāi)發(fā)中我們使用Spring管理數(shù)據(jù)源,并進(jìn)行事務(wù)控制的配置來(lái)覆蓋上述配置

3.8 databaseIdProvider數(shù)據(jù)庫(kù)廠商標(biāo)識(shí)

? 1)? MyBatis 可以根據(jù)不同的數(shù)據(jù)庫(kù)廠商執(zhí)行不同的語(yǔ)句

? 2)? Type: DB_VENDOR,使用MyBatis提供的VendorDatabaseIdProvider解析數(shù)據(jù)庫(kù)廠商標(biāo)識(shí)。也可以實(shí)現(xiàn)DatabaseIdProvider接口來(lái)自定義.

會(huì)通過(guò) DatabaseMetaData#getDatabaseProductName() 返回的字符串進(jìn)行設(shè)置。由于通常情況下這個(gè)字符串都非常長(zhǎng)而且相同產(chǎn)品的不同版本會(huì)返回不同的值,所以最好通過(guò)設(shè)置屬性別名來(lái)使其變短.

Property-name:數(shù)據(jù)庫(kù)廠商標(biāo)識(shí)

Property-value:為標(biāo)識(shí)起一個(gè)別名,方便SQL語(yǔ)句使用databaseId屬性引用

? ?3)? 配置了databaseIdProvider后,在SQL映射文件中的增刪改查標(biāo)簽中使用databaseId

來(lái)指定數(shù)據(jù)庫(kù)標(biāo)識(shí)的別名

? 4)? MyBatis匹配規(guī)則如下:

  • 如果沒(méi)有配置databaseIdProvider標(biāo)簽,那么databaseId=null
  • 如果配置了databaseIdProvider標(biāo)簽,使用標(biāo)簽配置的name去匹配數(shù)據(jù)庫(kù)信息,匹配上設(shè)置databaseId=配置指定的值,否則依舊為null
  • 如果databaseId不為null,他只會(huì)找到配置databaseId的sql語(yǔ)句
  • MyBatis 會(huì)加載不帶 databaseId 屬性和帶有匹配當(dāng)前數(shù)據(jù)庫(kù)databaseId 屬性的所有語(yǔ)句。如果同時(shí)找到帶有 databaseId 和不帶databaseId 的相同語(yǔ)句,則后者會(huì)被舍棄。

    3.9 mappers 映射器

? 1)? 用來(lái)在mybatis初始化的時(shí)候,告訴mybatis需要引入哪些Mapper映射文件

? 2)? mapper逐個(gè)注冊(cè)SQL映射文件

resource : 引入類路徑下的文件

url : ?????引入網(wǎng)絡(luò)路徑或者是磁盤路徑下的文件

class : ???引入Mapper接口.

有SQL映射文件 , 要求Mapper接口與 SQL映射文件同名同位置.

沒(méi)有SQL映射文件 , 使用注解在接口的方法上寫SQL語(yǔ)句.? 3)? 使用批量注冊(cè),這種方式要求SQL映射文件名必須和接口名相同并且在同一目錄下