詳解mybatis配置檔案
在前面兩篇文章中,大致與大家分享了基於Java的ORM框架,Mybatis基本架構和Mybatis實現CRUD的基本原理與流程,在本篇文章中,繼續與大家分享Mybatis配置檔案。
通過研究Mybatis官網配置檔案,不難得出如下兩個結論:
結論一:Mybatis配置檔案結構是固定的
結論二:Mybatis配置檔案有九大類全域性配置節點,且它們之間存在先後順序關係
本篇文章重點,也是為了解決如上兩個結論問題。
一 Mybatis九大類全域性配置節點
(一)properties
properties為屬性配置檔案,它為上下文提供相關的資源,properties有三種配置資源的方式:
方式一:通過properties子元素配置
通過properties子元素property配置username和password變數,然後在properties下文environment節點中引用這些變數
<properties> <property name="username" value="root"/> <property name="password" value="root"/> </properties>
在environments節點中引用username和password變數
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <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>
方式二:通過properise的屬性配置
<properties resource="demo/mybatis/resources/jdbc.properties"/>
方式三:通過屬性引數傳遞配置
即把屬性傳遞到SqlSessionFactoryBuilder.build()中
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props); // ... or ... SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);
Tip:當在mybatis配置檔案中同時存在三種方式時,優先順序順序如下:
(1)首先讀取properties子元素屬性
(2)其次讀取properties元素的屬性(resource和url)
(3)最後讀取作為方法引數傳遞的屬性,並覆蓋以讀取的同名屬性
三種方式,存在優先順序,且排在後面的配置覆蓋排在前面同名屬性的配置,鑑於此,建議在配置時,不要使用混合方式。
(二)settings
settings決定mybatis執行時行為,均有很多可配置的行為,如下為一個較完整的settings配置
<settings> <!--全域性全域性地開啟或關閉配置檔案中的所有對映器已經配置的任何快取,預設為true--> <setting name="cacheEnabled" value="true"/> <!--延遲載入的全域性開關。當開啟時,所有關聯物件都會延遲載入。 特定關聯關係中可通過設定 fetchType屬性來覆蓋該項的開關狀態。預設值為false --> <setting name="lazyLoadingEnabled" value="false"/> <!--當開啟時,任何方法的呼叫都會載入該物件的所有屬性。否則,每個屬性會按需載入,預設值false--> <setting name="aggressiveLazyLoading" value="false"/> <!--是否允許單一語句返回多結果集,預設值為true --> <setting name="multipleResultSetsEnabled" value="true"/> <!--使用列標籤代替列名,預設值為true --> <setting name="useColumnLabel" value="true"/> <!--允許 JDBC 支援自動生成主鍵,需要驅動相容,預設值為false --> <setting name="useGeneratedKeys" value="false"/> <!--指定 MyBatis 應如何自動對映列到欄位或屬性。 NONE 表示取消自動對映;PARTIAL 只會自動對映沒有定義巢狀結果集對映的結果集。 FULL 會自動對映任意複雜的結果集 (無論是否巢狀),預設值為PARTIAL--> <setting name="autoMappingBehavior" value="PARTIAL"/> <!--指定發現自動對映目標未知列(或者未知屬性型別)的行為。NONE: 不做任何反應; ARNING: 輸出提醒日誌 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日誌等級必須設定為 WARN);FAILING: 對映失敗 (丟擲 SqlSessionException),預設值為NONE --> <setting name="autoMappingUnknownColumnBehavior" value="NONE"/> <!--配置預設的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新。預設值為SIMPLE --> <setting name="defaultExecutorType" value="SIMPLE"/> <!--設定超時時間,它決定驅動等待資料庫響應的秒數。引數為任意正整數,未設定預設值--> <setting name="defaultStatementTimeout" value="25"/> <!--為驅動的結果集獲取數量(fetchSize)設定一個提示值。此引數只可以在查詢設定中被覆蓋。引數為任意正整數, 未設定預設值 --> <setting name="defaultFetchSize" value="100"/> <!--允許在巢狀語句中使用分頁(RowBounds)。如果允許使用則設定為false,預設值未false --> <setting name="safeRowBoundsEnabled" value="false"/> <!--允許在巢狀語句中使用分頁(ResultHandler)。如果允許使用則設定為false。預設值為true --> <setting name="safeResultHandlerEnabled" value="true"/> <!--是否開啟自動駝峰命名規則(camel case)對映,即從經典資料庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似對映,預設值為false --> <setting name="mapUnderscoreToCamelCase" value="false"/> <!--MyBatis 利用本地快取機制(Local Cache)防止迴圈引用(circular references)和加速重複巢狀查詢。 預設值為 SESSION,這種情況下會快取一個會話中執行的所有查詢。 若設定值為 STATEMENT,本地會話僅用在語 句執行上,對相同 SqlSession 的不同調用將不會共享資料。--> <setting name="localCacheScope" value="SESSION"/> <!--當沒有為引數提供特定的 JDBC 型別時,為空值指定 JDBC 型別。 某些驅動需要指定列的 JDBC 型別,多數情 況直接用一般型別即可,比如 NULL、VARCHAR 或 OTHER。預設值為OTHER --> <setting name="jdbcTypeForNull" value="OTHER"/> <!--指定哪個物件的方法觸發一次延遲載入。 --> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> <!--指定動態 SQL 生成的預設語言。--> <setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/> <!--指定當結果集中值為 null 的時候是否呼叫對映物件的 setter(map 物件時為 put)方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本型別(int、boolean等)是不能設定成 null 的。--> <setting name="callSettersOnNulls" value="false"/> <!--當返回行的所有列都是空時,MyBatis預設返回null。 當開啟這個設定時,MyBatis會返回一個空例項。 請注意,它也適用於巢狀的 結果集 (i.e. collectioin and association)。(從3.4.2開始--> <setting name="returnInstanceForEmptyRow" value="false"/> <!--指定 MyBatis 增加到日誌名稱的字首--> <setting name="logPrefix" value="log"/> <!--指定 MyBatis 所用日誌的具體實現,未指定時將自動查詢 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING。 --> <setting name="logImpl" value="LOG4J"/> <!--指定 Mybatis 建立具有延遲載入能力的物件所用到的代理工具。CGLIB | JAVASSIST--> <setting name="proxyFactory" value="JAVASSIST"/> <!--指定VFS的實現--> <setting name="vfsImpl" value="vfs"/> <!--允許使用方法簽名中的名稱作為語句引數名稱。 為了使用該特性,你的工程必須採用Java 8編譯,並且加上-parameters選項。 (從3.4.1開始)--> <setting name="useActualParamName" value="true"/> <!--指定一個提供Configuration例項的類。 這個被返回的Configuration例項用來載入被反序列化物件的懶載入屬性值。 這個類必須包含一個簽名方法static Configuration getConfiguration(). (從 3.2.3 版本開始)--> <setting name="configurationFactory" value="configClass"/> </settings> View Code
(三)typeAliases
類型別名為Java型別設定一個簡短名字,它只與xml有關,用來減少類完全限定名的冗餘
<typeAliases> <typeAlias type="demo.mybatis.entity.UserInfo" alias="UserInfo"/> </typeAliases>
這樣配置後,任何使用demo.mybatis.entity.UserInfo的地方,都可用UserInfo來代替
除此之外,還可以指定一個包名,mybatis會在包名下搜尋需要的Java Bean,比如:
<typeAliases> <package name="demo.mybatis.entity"/> </typeAliases>
在沒註解的情況下,每個在demo.mybatis.entity中的Java Bean,會使用 Bean 的首字母小寫的非限定類名來作為它的別名。 比如demo.mybatis.entity.UserInfo的別名為userInfo.
若存在註解,則別名為註解名。
POJO設定別名
@Alias("Users") public class User{ }
Mapper.xml
<select id="getUserInfoById" resultType="Users"> SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id} </select>
(四)typeHandlers
typeHandlers主要將獲取的值合理地轉化為java型別,可以轉換預處理階段(PreparedStatement)的引數和結果集中的值。mybatis提供了標準的型別處理,
詳細請參照官網:http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers
同時,mybatis也支援之定義處理型別,在自定義處理型別時,只需實現org.apache.ibatis.type.TypeHandler介面,或繼承org.apache.ibatis.type.BaseTypeHandler
(五)obejctFactory
後續文章講解...
(六)plugins
後續文章講解...
(七)environments
environments環境配置,mybatis支援多種配置,從而有助於適應多種資料庫。但需要注意的是,儘管可以配置多個環境,但每個SqlSessionFactory例項只能選擇其一。
接受環境配置的兩個方法簽名:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
忽略環境引數,則載入預設環境
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
如下為一個環境配置示例
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <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>
註釋:
- 預設的環境 ID(比如:default="development")。
- 每個 environment 元素定義的環境 ID(比如:id="development")。
- 事務管理器的配置(比如:type="JDBC")。
- 資料來源的配置(比如:type="POOLED")。
預設的環境和環境 ID 是自解釋的,因此一目瞭然。你可以對環境隨意命名,但一定要保證預設的環境 ID 要匹配其中一個環境 ID。
事務管理器:
Mybatis支援兩種型別的事務管理器:
jdbc:依賴於從資料來源得到的連線來管理事務作用域
managed:這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器的上下文)。
預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它預設的關閉行為。例如:
<transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager>
dataSource:
dataSource元素使用標準的JDBC資料來源介面來配置JDBC連線物件的資源,有三種內建的資料來源型別:
UNPOOLED:這個資料來源的實現只是每次被請求時開啟和關閉連線
POOLED:這種資料來源的實現利用“池”的概念將 JDBC 連線物件組織起來,避免了建立新的連線例項時所必需的初始化和認證時間。 這是一種使得併發 Web 應用快速響應請求的流行處理方式
JNDI:這個資料來源的實現是為了能在如 EJB 或應用伺服器這類容器中使用,容器可以集中或在外部配置資料來源,然後放置一個 JNDI 上下文的引用
(八)databaseIdProvider
databaseIdProvider主要功能是支援多廠商資料庫,它的實現原理是基於對映語句中的databaseId屬性。MyBatis 會載入不帶 databaseId 屬性和帶有匹配當前資料庫
databaseId 屬性的所有語句。 如果同時找到帶有 databaseId 和不帶 databaseId 的相同語句,則後者會被捨棄。 為支援多廠商特性只要像下面這樣在 mybatis-config.xml
檔案中加入 databaseIdProvider
<databaseIdProvider type="DB_VENDOR" />
(九)mappers
mappers關聯對映配置檔案,即告訴mybatis到哪裡去找對映配置檔案。有四種基本方式可以關聯對映配置檔案:
方式一:使用相對於類路徑的資源引用
<!--類路徑方式--> <mapper resource="demo/mybatis/resources/userInfo-config.xml"/>
表示的程式目錄結構如下:
方式二:使用完全限定資源定位符URL
假設對映檔案路徑為:E:\userInfo-config.xml
則採用url方式如下:(格式為file:///url)
<mapper url="file:///E:/userInfo-config.xml"/>
方式三:使用對映器介面實現類的完全限定名
定義對映介面:
package demo.mybatis.service; import demo.mybatis.entity.UserInfo; import org.apache.ibatis.annotations.Select; public interface UserInfoAnnotation { @Select("SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id}") public UserInfo getUserInfoById(int user_id); }
配置對映
<mapper class="demo.mybatis.service.UserInfoAnnotation"/>
方式四: 將包內的對映器介面實現全部註冊為對映器
<package name="demo.mybatis.service"/>
二 Mybatis九大類全域性配置節點順序
Mybatis九大類全域性配置節點按照如下順序排序,位置不能顛倒。
properties=>settings=>typeAliases=>typeHandlers=>objectFactory=>plugins=>environment=>databaseIdProvider=>mappers
三 Mybatis系列文章
四 參考文獻
【01】http://www.mybatis.org/mybatis-3/zh/configuration.html#
五 版權區
- 轉載部落格,必須註明部落格出處
- 博主網址:http://www.cnblogs.com/wangjiming/
- 如您有新想法,歡迎提出,郵箱:[email protected]