【Mybatis學習筆記】—— 【二】全局配置文件


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 映射

  1. 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>
  1. 也可以採用 註冊接口 的方法

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接口爲了開發快速可以使用註解;
  1. 批量註冊

這種方式要求SQL映射文件名必須和接口名相同並且在同一目錄下

<mappers>
<!-- 批量註冊: -->
	<package name="com.smallbeef.mybatis.dao"/>
<mappers>


👉 👉 👉 My Blog - 小牛肉的個人博客,歡迎來訪~👈 👈 👈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章