Mybatis 配置詳解

完整配置

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<properties resource="application.properties"/>

	<!-- 參數設置 -->
	<settings>
		<!-- 這個配置使全局的映射器啓用或禁用緩存 -->
		<setting name="cacheEnabled" value="true" />
		<!-- 全局啓用或禁用延遲加載。當禁用時,所有關聯對象都會即時加載 -->
		<setting name="lazyLoadingEnabled" value="true" />
		<!-- 當啓用時,有延遲加載屬性的對象在被調用時將會完全加載任意屬性。否則,每種屬性將會按需要加載 -->
		<setting name="aggressiveLazyLoading" value="true" />
		<!-- 允許或不允許多種結果集從一個單獨的語句中返回(需要適合的驅動) -->
		<setting name="multipleResultSetsEnabled" value="true" />
		<!-- 使用列標籤代替列名。不同的驅動在這方便表現不同。參考驅動文檔或充分測試兩種方法來決定所使用的驅動 -->
		<setting name="useColumnLabel" value="true" />
		<!-- 允許JDBC支持生成的鍵。需要適合的驅動。如果設置爲true則這個設置強制生成的鍵被使用,儘管一些驅動拒絕兼容但仍然有效(比如Derby) -->
		<setting name="useGeneratedKeys" value="true" />
		<!-- 指定MyBatis如何自動映射列到字段/屬性。PARTIAL只會自動映射簡單,沒有嵌套的結果。FULL會自動映射任意複雜的結果(嵌套的或其他情況) -->
		<setting name="autoMappingBehavior" value="PARTIAL" />
		<!--當檢測出未知列(或未知屬性)時,如何處理,默認情況下沒有任何提示,這在測試的時候很不方便,不容易找到錯誤。 NONE : 不做任何處理 
			(默認值) WARNING : 警告日誌形式的詳細信息 FAILING : 映射失敗,拋出異常和詳細信息 -->
		<setting name="autoMappingUnknownColumnBehavior" value="WARNING" />
		<!-- 配置默認的執行器。SIMPLE執行器沒有什麼特別之處。REUSE執行器重用預處理語句。BATCH執行器重用語句和批量更新 -->
		<setting name="defaultExecutorType" value="SIMPLE" />
		<!-- 設置超時時間,它決定驅動等待一個數據庫響應的時間 -->
		<setting name="defaultStatementTimeout" value="25000" />
		<!--設置查詢返回值數量,可以被查詢數值覆蓋 -->
		<setting name="defaultFetchSize" value="100" />
		<!-- 允許在嵌套語句中使用分頁 -->
		<setting name="safeRowBoundsEnabled" value="false" />
		<!--是否開啓自動駝峯命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 
			的類似映射。 -->
		<setting name="mapUnderscoreToCamelCase" value="false" />
		<!--MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重複嵌套查詢。 
			默認值爲 SESSION,這種情況下會緩存一個會話中執行的所有查詢。 若設置值爲 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 
			的不同調用將不會共享數據。 -->
		<setting name="localCacheScope" value="SESSION" />
		<!-- 當沒有爲參數提供特定的 JDBC 類型時,爲空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 
			NULL、VARCHAR OTHER。 -->
		<setting name="jdbcTypeForNull" value="OTHER" />
		<!-- 指定哪個對象的方法觸發一次延遲加載。 -->
		<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
	</settings>

	<!-- 別名定義 -->
	<!--<typeAliases>
		<typeAlias alias="pageAccessURL" type="com.lgm.mybatis.model.PageAccessURL" />
	</typeAliases>-->

	<!--自定義類型處理器 -->
	<typeHandlers>
		<!-- <typeHandler handler="com.xhm.util.BooleanTypeHandlder" /> -->
		<!--掃描整個包下的自定義類型處理器 -->
		<package name="com.xiaolyuh.util" />
	</typeHandlers>

	<!--plugins插件之 分頁攔截器 -->
<!--	<plugins>
		<plugin interceptor="com.xhm.util.PageInterceptor"></plugin>
	</plugins>-->

	<!--配置environment環境 -->
	<environments default="development1">
		<!-- 環境配置1,每個SqlSessionFactory對應一個環境 -->
		<environment id="development1">
			<!-- 事務配置 type= JDBC、MANAGED 1.JDBC:這個配置直接簡單使用了JDBC的提交和回滾設置。它依賴於從數據源得到的連接來管理事務範圍。 
				2.MANAGED:這個配置幾乎沒做什麼。它從來不提交或回滾一個連接。而它會讓容器來管理事務的整個生命週期(比如Spring或JEE應用服務器的上下文)。 
				默認情況下它會關閉連接。然而一些容器並不希望這樣,因此如果你需要從連接中停止它,將closeConnection屬性設置爲false -->
			<transactionManager type="JDBC" />
			<!-- <transactionManager type="MANAGED"> <property name="closeConnection" 
				value="false"/> </transactionManager> -->
			<!-- 數據源類型:type = UNPOOLED、POOLED、JNDI 1.UNPOOLED:這個數據源的實現是每次被請求時簡單打開和關閉連接。它有一點慢,這是對簡單應用程序的一個很好的選擇,因爲它不需要及時的可用連接。 
				不同的數據庫對這個的表現也是不一樣的,所以對某些數據庫來說配置數據源並不重要,這個配置也是閒置的 2.POOLED:這是JDBC連接對象的數據源連接池的實現,用來避免創建新的連接實例時必要的初始連接和認證時間。 
				這是一種當前Web應用程序用來快速響應請求很流行的方法。 3.JNDI:這個數據源的實現是爲了使用如Spring或應用服務器這類的容器,容器可以集中或在外部配置數據源,然後放置一個JNDI上下文的引用 -->
			<dataSource type="UNPOOLED">
				<property name="driver" value="${spring.datasource.driver-class-name}"/>
				<property name="url" value="${spring.datasource.url}"/>
				<property name="username" value="${spring.datasource.username}"/>
				<property name="password" value="${spring.datasource.password}"/>
				<!-- 默認連接事務隔離級別 <property name="defaultTransactionIsolationLevel" value="" 
					/> -->
			</dataSource>
		</environment>

		<!-- 環境配置2 -->
		<environment id="development2">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${spring.datasource.driver-class-name}"/>
				<property name="url" value="${spring.datasource.url}"/>
				<property name="username" value="${spring.datasource.username}"/>
				<property name="password" value="${spring.datasource.password}"/>
				<!-- 在任意時間存在的活動(也就是正在使用)連接的數量 -->
				<property name="poolMaximumActiveConnections" value="10" />
				<!-- 任意時間存在的空閒連接數 -->
				<property name="poolMaximumIdleConnections" value="5" />
				<!-- 在被強制返回之前,池中連接被檢查的時間 -->
				<property name="poolMaximumCheckoutTime" value="20000" />
				<!-- 這是給連接池一個打印日誌狀態機會的低層次設置,還有重新嘗試獲得連接,這些情況下往往需要很長時間(爲了避免連接池沒有配置時靜默失敗) -->
				<property name="poolTimeToWait" value="20000" />
				<!-- 發送到數據的偵測查詢,用來驗證連接是否正常工作,並且準備接受請求。 -->
				<property name="poolPingQuery" value="NO PING QUERY SET" />
				<!-- 這是開啓或禁用偵測查詢。如果開啓,你必須用一個合法的SQL語句(最好是很快速的)設置poolPingQuery屬性 -->
				<property name="poolPingEnabled" value="false" />
				<!-- 這是用來配置poolPingQuery多次時間被用一次。這可以被設置匹配標準的數據庫連接超時時間,來避免不必要的偵測 -->
				<property name="poolPingConnectionsNotUsedFor" value="0" />
			</dataSource>
		</environment>

		<!-- 環境配置3 -->
		<environment id="development3">
			<transactionManager type="JDBC" />
			<dataSource type="JNDI">
				<property name="data_source" value="java:comp/env/jndi/mybatis" />
				<property name="env.encoding" value="UTF8" />
				<!-- <property name="initial_context" value=""/> <property name="env.encoding" 
					value="UTF8"/> -->
			</dataSource>
		</environment>
	</environments>

	<!-- 映射文件,mapper的配置文件 -->
	<mappers>
		<!--直接映射到相應的mapper文件 -->
		<mapper resource="mybaits/PersonMapper.xml" />
		<!--掃描包路徑下所有xxMapper.java文件 -->
		<package name="com.xiaolyuh.domain.mapper.*Mapper" />
	</mappers>

</configuration>  

一級配置

屬性名 說明 備註
properties 引入外部的properties文件,配置的屬性可以在整個配置文件中其他位置進行引用; 重要,主要作用是解耦
settings 用於指定MyBatis的一些全局配置屬性,這些屬性非常重要,它們會改變MyBatis的運行時行爲; 重要
typeAliases 別名,爲Java類型設置一個短的名字,映射時方便使用;分爲系統定義別名和自定義別名; 可以通過xml和註解配置
typeHandlers 用於jdbcType與javaType之間的轉換,如枚舉; 無特殊需求不需要調整;
ObjectFactory MyBatis每次創建結果對象的新實例時,它都會使用對象工廠(ObjectFactory)去構建POJO 大部分場景下無需修改
plugins 插件配置,MyBatis允許你在已映射的語句執行過程中的某一點進行攔截調用;
environments 用於配置多個數據源,每個數據源分爲數據庫源和事務的配置; 在多數據源環境使用
databaseIdProvider MyBatis可以根據不同的數據庫廠商執行不同的語句,用於一個系統內多廠商數據源支持。 大部分場景下無需修改
mappers 配置引入映射器的方法。可以使用相對於類路徑的資源引用、或完全限定資源定位符(包括file:///的URL),或類名和包名等等 後面會專題說明

setting

這是 MyBatis 中極爲重要的調整設置,它們會改變 MyBatis 的運行時行爲。 下表描述了設置中各項的意圖、默認值等。

設置名 描述 有效值 默認值
cacheEnabled 全局地開啓或關閉配置文件中的所有映射器已經配置的任何緩存。 true、false true
lazyLoadingEnabled 延遲加載的全局開關。當開啓時,所有關聯對象都會延遲加載。 特定關聯關係中可通過設置 fetchType 屬性來覆蓋該項的開關狀態。 true、false false
aggressiveLazyLoading 當開啓時,任何方法的調用都會加載該對象的所有屬性。 否則,每個屬性會按需加載(參考 lazyLoadTriggerMethods)。 true、false false (在 3.4.1 及之前的版本默認值爲 true)
multipleResultSetsEnabled 是否允許單一語句返回多結果集(需要驅動支持)。 true、false true
useColumnLabel 使用列標籤代替列名。不同的驅動在這方面會有不同的表現,具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果。 true、false true
useGeneratedKeys 允許 JDBC 支持自動生成主鍵,需要驅動支持。 如果設置爲 true 則這個設置強制使用自動生成主鍵,儘管一些驅動不能支持但仍可正常工作(比如 Derby)。 true、false False
autoMappingBehavior 指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意複雜的結果集(無論是否嵌套)。 NONE, PARTIAL, FULL PARTIAL
autoMappingUnknownColumnBehavior 指定發現自動映射目標未知列(或者未知屬性類型)的行爲。NONE: 不做任何反應;WARNING: 輸出提醒日誌;(‘org.apache.ibatis.session.AutoMappingUnknownColumnBehavior’ 的日誌等級必須設置爲 WARN);FAILING: 映射失敗 (拋出 SqlSessionException) NONE, WARNING, FAILING NONE
defaultExecutorType 配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新。 SIMPLE、REUSE、BATCH SIMPLE
defaultStatementTimeout 設置超時時間,它決定驅動等待數據庫響應的秒數。 任意正整數 未設置 (null)
defaultFetchSize 爲驅動的結果集獲取數量(fetchSize)設置一個提示值。此參數只可以在查詢設置中被覆蓋。 任意正整數 未設置 (null)
defaultResultSetType Specifies a scroll strategy when omit it per statement settings. (Since: 3.5.2) FORWARD_ONLY、SCROLL_SENSITIVE 、SCROLL_INSENSITIVE、DEFAULT(same behavior with ‘Not Set’) Not Set (null)
safeRowBoundsEnabled 允許在嵌套語句中使用分頁(RowBounds)。如果允許使用則設置爲 false。 true、false False
safeResultHandlerEnabled 允許在嵌套語句中使用分頁(ResultHandler)。如果允許使用則設置爲 false。 true、false True
mapUnderscoreToCamelCase 是否開啓自動駝峯命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。 true、false False
localCacheScope MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重複嵌套查詢。 默認值爲 SESSION,這種情況下會緩存一個會話中執行的所有查詢。 若設置值爲 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據。 SESSION、STATEMENT SESSION
jdbcTypeForNull 當沒有爲參數提供特定的 JDBC 類型時,爲空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 JdbcType 常量,常用值:NULL, VARCHAR 或 OTHER。 OTHER
lazyLoadTriggerMethods 指定哪個對象的方法觸發一次延遲加載。 用逗號分隔的方法列表。 equals,clone,hashCode,toString
defaultScriptingLanguage 指定動態 SQL 生成的默認語言。 一個類型別名或完全限定類名。 org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
defaultEnumTypeHandler 指定 Enum 使用的默認 TypeHandler 。(新增於 3.4.5) 一個類型別名或完全限定類名。 org.apache.ibatis.type.EnumTypeHandler
callSettersOnNulls 指定當結果集中值爲 null 的時候是否調用映射對象的 setter(map 對象時爲 put)方法,這在依賴於 Map.keySet() 或 null 值初始化的時候比較有用。注意基本類型(int、boolean 等)是不能設置成 null 的。 true、false false
returnInstanceForEmptyRow 當返回行的所有列都是空時,MyBatis默認返回 null。 當開啓這個設置時,MyBatis會返回一個空實例。 請注意,它也適用於嵌套的結果集 (如集合或關聯)。(新增於 3.4.2) true、false false
logPrefix 指定 MyBatis 增加到日誌名稱的前綴。 任何字符串 未設置
logImpl 指定 MyBatis 所用日誌的具體實現,未指定時將自動查找。 SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING 未設置
proxyFactory 指定 Mybatis 創建具有延遲加載能力的對象所用到的代理工具。 CGLIB、JAVASSIST JAVASSIST (MyBatis 3.3 以上)
vfsImpl 指定 VFS 的實現 自定義 VFS 的實現的類全限定名,以逗號分隔。 未設置
useActualParamName 允許使用方法簽名中的名稱作爲語句參數名稱。 爲了使用該特性,你的項目必須採用 Java 8 編譯,並且加上 -parameters 選項。(新增於 3.4.1) true、false true
configurationFactory 指定一個提供 Configuration 實例的類。 這個被返回的 Configuration 實例用來加載被反序列化對象的延遲加載屬性值。 這個類必須包含一個簽名爲static Configuration getConfiguration() 的方法。(新增於 3.2.3) 類型別名或者全類名. 未設置

environment

environment 元素是配置一個數據源的開始,屬性id是它的唯一標識

transactionManager

transactionManager 元素配置數據庫事務,其中type屬性有三種配置方式:

  • jdbc,採用jdbc的方式管理事務;
  • managed,採用容器的方式管理事務,在JNDI數據源中使用;
  • 自定義,自定義數據庫事務管理辦法;

dataSource

dataSource 元素配置數據源連接信息,type屬性是連接數據庫的方式配置,有四種配置方式:

  • UNPOOLED 非連接池方式連接
  • POOLED 使用連接池連接
  • JNDI 使用JNDI數據源
  • 自定義數據源

mappers

既然 MyBatis 的行爲已經由上述元素配置完了,我們現在就要定義 SQL 映射語句了。 但是首先我們需要告訴 MyBatis 到哪裏去找到這些語句。 Java 在自動查找這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪裏去找映射文件。 你可以使用相對於類路徑的資源引用, 或完全限定資源定位符(包括 file:/// 的 URL),或類名和包名等。例如:

用classPath下資源引用

<!-- 使用相對於類路徑的資源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定資源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口實現類的完全限定類名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 將包內的映射器接口實現全部註冊爲映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

參考

https://mybatis.org/mybatis-3/zh/configuration.html#mappers

源碼

https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases

spring-boot-student-mybatis工程

發佈了204 篇原創文章 · 獲贊 153 · 訪問量 86萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章