詳解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系列文章


     淺談JavaWeb架構演變

     淺談mybatis如何半自動化解耦

四  參考文獻


   【01】http://www.mybatis.org/mybatis-3/zh/configuration.html#

五 版權區


  •    轉載博客,必須注明博客出處
  •    博主網址:http://www.cnblogs.com/wangjiming/
  •    如您有新想法,歡迎提出,郵箱:2098469527@qq.com

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM