在前面兩篇文章中,大體與你們分享了基於Java的ORM框架,Mybatis基本架構和Mybatis實現CRUD的基本原理與流程,在本篇文章中,繼續與你們分享Mybatis配置文件。html
經過研究Mybatis官網配置文件,不可貴出以下兩個結論:java
結論一:Mybatis配置文件結構是固定的數據庫
結論二:Mybatis配置文件有九大類全局配置節點,且它們之間存在前後順序關係apache
本篇文章重點,也是爲了解決如上兩個結論問題。緩存
一 Mybatis九大類全局配置節點服務器
(一)propertiessession
properties爲屬性配置文件,它爲上下文提供相關的資源,properties有三種配置資源的方式:mybatis
方式一:經過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>
(三)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 是自解釋的,所以一目瞭然。你能夠對環境隨意命名,但必定要保證默認的環境 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#
五 版權區