文章目錄
MyBatis 的配置文件包含了影響 MyBatis 行爲甚深的 設置(settings)和屬性(properties)信息。文檔的 頂層結構如下:
- configuration 配置
- properties 屬性
- settings 設置
- typeAliases 類型命名
- typeHandlers 類型處理器
- objectFactory 對象工廠
- plugins 插件
- environments 環境
- environment 環境變量
- transactionManager 事務管理器
- dataSource 數據源
- databaseIdProvider 數據庫廠商標識
- mappers 映射器
1. properties屬性
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
相比於上述在全局配置文件中寫死的方式,我們可以利用peoperties將數據庫配置信息提取出來
mybatis可以使用properties來引入外部properties配置文件的內容;
resource
:引入類路徑下的資源url
:引入網絡路徑或者磁盤路徑下的資源
<properties resource="dbconfig.properties"></properties>
在 conf 文件夾下建立 dbconfig.properties 文件,將數據庫配置信息寫在此處
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
如果屬性在不只一個地方進行了配置,那麼 MyBatis 將按 照下面的順序來加載:
- 在 properties 元素體內指定的屬性首先被讀取。
- 然後根據 properties 元素中的 resource 屬性讀取類路徑下屬性文件或根 據 url 屬性指定的路徑讀取屬性文件,並覆蓋已讀取的同名屬性。
- 最後讀取作爲方法參數傳遞的屬性,並覆蓋已讀取的同名屬性
2. settings 設置
這是 MyBatis 中極爲重要的調整設置,它們會改變 MyBatis 的運行時行爲
在之後用到這些標籤的時候再詳細講解,此處我們先看 mapUnderscoreToCamelCase
參數.
把該參數設置爲true,則打開駝峯命名法,像我們在第一篇文章中,數據庫字段last_Name
,JavaBean字段 lastName
,開啓了該參數後,就不需要定義別名了,Myabtis 可以實現該字段的映射
<!--
settings包含很多重要的設置項
setting:用來設置每一個設置項
name:設置項名
value:設置項取值
-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
3. typeAliases 別名處理器
類型別名是爲 Java 類型設置一個短的名字,可以方便我們 引用某個類, 別名不區分大小寫
typeAlias
: 爲某個java類型起別名
type:指定要起別名的類型全類名;默認別名就是類名小寫;employee
alias:指定新的別名
<!-- typeAliases:別名處理器:可以爲我們的java類型起別名
別名不區分大小寫
-->
<typeAliases>
<!-- 1、typeAlias:爲某個java類型起別名
type:指定要起別名的類型全類名;默認別名就是類名小寫;employee
alias:指定新的別名
-->
<typeAlias type="com.atguigu.mybatis.bean.Employee" alias="emp"/>
</typeAliases>
- 類很多的情況下,可以批量設置別名這個包下的每一個類創建一個默認的別名,就是簡單類名小寫
<typeAliases>
<!-- 2、package:爲某個包下的所有類批量起別名
name:指定包名(爲當前包以及下面所有的後代包的每一個類都起一個默認別名(類名小寫),)
-->
<package name="com.atguigu.mybatis.bean"/>
</typeAliases>
- 批量起別名的情況下,使用
@Alias
註解爲某個類型指定新的別名
@Alias("emp")
public calss Employee{
值得注意的是,MyBatis已經爲許多常見的 Java 類型內建 了相應的類型別名。它們都是大小寫不敏感的,我們在起 別名的時候千萬不要佔用已有的別名
並不推薦用別名,使用全類名可以方便的 ctrl+左鍵 進入該類,不用到處找別名。
4. typeHandlers 類型處理器
無論是 MyBatis 在預處理語句(PreparedStatement)中 設置一個參數時,還是從結果集中取出一個值時, 都會 用類型處理器將獲取的值以合適的方式轉換成 Java 類型
日期類型的處理
-
日期和時間的處理,JDK1.8以前一直是個頭疼的 問題。我們通常使用JSR310規範領導者Stephen Colebourne創建的Joda-Time來操作。1.8已經實 現全部的JSR310規範了。
-
日期時間處理上,我們可以使用MyBatis基於 JSR310(Date and Time API)編寫的各種日期 時間類型處理器。
-
MyBatis3.4以前的版本需要我們手動註冊這些處 理器,以後的版本都是自動註冊
自定義類型處理器
我們可以重寫類型處理器或創建自己的類型處理 器來處理不支持的或非標準的類型。
步驟:
-
1)、
實現org.apache.ibatis.type.TypeHandler
接口或 者繼承org.apache.ibatis.type.BaseTypeHandler
-
2)、指定其映射某個JDBC類型(可選操作)
-
3)、在mybatis全局配置文件中註冊
5. plugins 插件
插件是MyBatis提供的一個非常強大的機制,我們 可以通過插件來修改MyBatis的一些核心行爲。插 件通過動態代理機制,可以介入四大對象的任何 一個方法的執行。後面會有專門的章節來介紹 mybatis 運行原理以及插件
先來熟悉以下四大對象
- 執行器:
Executor
(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) - 參數處理器:
ParameterHandler
(getParameterObject, setParameters) - 結果集處理器:
ResultSetHandler
(handleResultSets, handleOutputParameters) - sql 語句處理器:
StatementHandler
(prepare, parameterize, batch, update, query)
6. environments 環境
MyBatis可以配置多種環境,比如開發、測試和生 產環境需要有不同的配置。
- 每種環境使用一個environment標籤進行配置並指 定唯一標識符
- 可以通過environments標籤中的
default
屬性指定 一個環境的標識符來快速的切換環境
<environments default="dev_mysql">
<environment id="dev_mysql">
<transactionManager type="JDBC"></transactionManager>
<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>
<environment id="dev_oracle">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${orcl.driver}" />
<property name="url" value="${orcl.url}" />
<property name="username" value="${orcl.username}" />
<property name="password" value="${orcl.password}" />
</dataSource>
</environment>
</environments>
- id:指定當前環境的唯一標識
- transactionManager、和dataSource都必須有
transactionManager
type: JDBC | MANAGED | 自定義
-
JDBC:使用了 JDBC 的提交和回滾設置,依賴於從數 據源得到的連接來管理事務範圍。 JdbcTransactionFactory
-
MANAGED:不提交或回滾一個連接、讓容器來管理 事務的整個生命週期(比如 JEE 應用服務器的上下 文)。 ManagedTransactionFactory
-
自定義:實現TransactionFactory接口,type=全類名/ 別名
dataSource
type: UNPOOLED | POOLED | JNDI | 自定義
- UNPOOLED:不使用連接池, UnpooledDataSourceFactory
- POOLED:使用連接池, PooledDataSourceFactory
- JNDI: 在EJB 或應用服務器這類容器中查找指定的數據源
- 自定義:實現DataSourceFactory接口,定義數據源的 獲取方式。
實際開發中我們使用Spring管理數據源,並進行 事務控制的配置來覆蓋上述配置
7. databaseIdProvider 環境
MyBatis 可以根據不同的數據庫廠商執行不同的語句。
databaseIdProvider:支持多數據庫廠商的;
type="DB_VENDOR"
:VendorDatabaseIdProvider
作用就是得到數據庫廠商的標識 (驅動getDatabaseProductName()),mybatis就能根據數據庫廠商標識來執行不同的sql;
- MySQL
- Oracle
- SQL Server
- 。。。。。。
<databaseIdProvider type="DB_VENDOR">
<!-- 爲不同的數據庫廠商起別名 -->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
select * from tbl_employee where id = #{id}
</select>
<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"
databaseId="mysql">
select * from tbl_employee where id = #{id}
</select>
<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"
databaseId="oracle">
select EMPLOYEE_ID id,LAST_NAME lastName,EMAIL email
from employees where EMPLOYEE_ID=#{id}
</select>
MyBatis匹配規則如下:
-
1、如果沒有配置databaseIdProvider標籤,那麼databaseId=null
-
2、如果配置了databaseIdProvider標籤,使用標籤配置的name去匹 配數據庫信息,匹配上設置databaseId=配置指定的值,否則依舊爲 null
-
3、如果databaseId不爲null,他只會找到配置databaseId的sql語句
-
4、MyBatis 會加載不帶 databaseId 屬性和帶有匹配當前數據庫 databaseId 屬性的所有語句。如果同時找到帶有 databaseId 和不帶 databaseId 的相同語句,則後者會被捨棄。
8. mapper 映射
- mapper逐個註冊SQL映射文件
<!-- mappers:將sql映射註冊到全局配置中 -->
<mappers>
<!--
mapper:註冊一個sql映射
註冊配置文件
resource:引用類路徑下的sql映射文件
mybatis/mapper/EmployeeMapper.xml
url:引用網路路徑或者磁盤路徑下的sql映射文件
file:///var/mappers/AuthorMapper.xml
-->
<mapper resource="mybatis/mapper/EmployeeMapper.xml"/>
</mappers>
- 也可以採用 註冊接口 的方法
class
:引用(註冊)接口,
- 有sql映射文件,映射文件名必須和接口同名,並且放在與接口同一目錄下;
<mapper class="com.atguigu.mybatis.dao.EmployeeMapperAnnotation"/>
- 沒有sql映射文件,所有的sql都是利用註解寫在接口上;
@Select("select * from tbl_employee where id = #{id}")
public Employee getEmeById(Integer id){}
推薦:
- 比較重要的,複雜的Dao接口我們來寫sql映射文件
- 不重要,簡單的Dao接口爲了開發快速可以使用註解;
- 批量註冊
這種方式要求SQL映射文件名必須和接口名相同並且在同一目錄下
<mappers>
<!-- 批量註冊: -->
<package name="com.smallbeef.mybatis.dao"/>
<mappers>
👉 👉 👉 My Blog - 小牛肉的個人博客,歡迎來訪~👈 👈 👈