淺析mybatis的全局配置文件mybatis-config.xml各配置的意義


  大部分時候,我們都是在 Spring 里面去集成MyBatis。因為 Spring 對 MyBatis 的一些操作進行的封裝,我們不能直接看到它的本質,所以先看下不使用容器的時候,也就是編程的方式,MyBatis 怎么使用。先引入mybatis jar 包。

  首先我們要創建一個全局配置文件,這里面是對 MyBatis 的核心行為的控制,比如mybatis-config.xml。

  第二個就是我們的映射器文件,Mapper.xml,通常來說一張表對應一個,我們會在這個里面配置我們增刪改查的SQL 語句,以及參數和返回的結果集的映射關系。跟JDBC 的代碼一樣,我們要執行對數據庫的操作,必須創建一個會話,這個在MyBatis 里面就是SqlSession。

  SqlSession 又是工廠類根據全局配置文件創建的。所以整個的流程就是這樣的(如下代碼)。最后我們通過SqlSession 接口上的方法,傳入我們的Statement ID 來執行SQL。這是第一種方式。

  這種方式有一個明顯的缺點,就是會對Statement ID 硬編碼,而且不能在編譯時進行類型檢查,所以通常我們會使用第二種方式,就是定義一個Mapper 接口的方式。這個接口全路徑必須跟Mapper.xml 里面的namespace 對應起來,方法也要跟StatementID 一一對應。

public void testMapper() throws IOException {   String resource = "mybatis-config.xml";   InputStream inputStream = Resources.getResourceAsStream(resource);   SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);   SqlSession session = sqlSessionFactory.openSession();   try {     BlogMapper mapper = session.getMapper(BlogMapper.class);     Blog blog = mapper.selectBlogById(1);     System.out.println(blog);   } finally {     session.close();   } }

  這個就是我們單獨使用MyBatis 的基本流程。

1、核心對象的生命周期

  在編程式使用的這個demo 里面,我們看到了MyBatis 里面的幾個核心對象:SqlSessionFactoryBuiler、SqlSessionFactory、SqlSession 和Mapper 對象。這幾個核心對象在MyBatis 的整個工作流程里面的不同環節發揮作用。如果說我們不用容器,自己去管理這些對象的話,我們必須思考一個問題:什么時候創建和銷毀這些對象?在一些分布式的應用里面,多線程高並發的場景中,如果要寫出高效的代碼,必須了解這四個對象的生命周期。這四個對象的聲明周期的描述在官網上面也可以找到。我們從每個對象的作用的角度來理解一下,只有理解了它們是干什么的,才知道什么時候應該創建,什么時候應該銷毀。

  其具體生命周期可以看之前的這篇博客:mybatis學習筆記:什么是mybatis、使用mybatis好處、使用mybatis步驟、作用域(Scope)和生命周期、mybatis屬性加載順序、開啟默認值屬性

2、核心配置解讀

  第一個是config 文件。大部分時候我們只需要很少的配置就可以讓MyBatis 運行起來。其實MyBatis 里面提供的配置項非常多,我們沒有配置的時候使用的是系統的默認值。大家可以從官方上下載到最新的源碼。中文地址:http://www.mybatis.org/mybatis-3/zh/index.html

<?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="db.properties"></properties>
    <settings>
        <!-- 打印查詢語句 -->
        <setting name="logImpl" value="STDOUT_LOGGING" />
        <!-- 控制全局緩存(二級緩存)-->
        <setting name="cacheEnabled" value="true"/>
        <!-- 延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。默認 false -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 當開啟時,任何方法的調用都會加載該對象的所有屬性。默認 false,可通過select標簽的 fetchType來覆蓋-->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!-- Mybatis 創建具有延遲加載能力的對象所用到的代理工具,默認JAVASSIST -->
        <!--<setting name="proxyFactory" value="CGLIB" />-->
        <!-- STATEMENT級別的緩存,使一級緩存,只針對當前執行的這一statement有效 -->
        <!-- <setting name="localCacheScope" value="STATEMENT"/> -->
        <setting name="localCacheScope" value="SESSION"/>
    </settings>

    <typeAliases>
        <typeAlias alias="blog" type="com.wuzz.domain.Blog" />
    </typeAliases>

<!-- <typeHandlers> <typeHandler handler="com.wuzz.type.MyTypeHandler"></typeHandler> </typeHandlers>-->

    <!-- 對象工廠 -->
<!-- <objectFactory type="com.wuzz.objectfactory.GPObjectFactory"> <property name="wuzz" value="666"/> </objectFactory>-->

<!-- <plugins> <plugin interceptor="com.wuzz.interceptor.SQLInterceptor"> <property name="wuzz" value="betterme" /> </plugin> <plugin interceptor="com.wuzz.interceptor.MyPageInterceptor"> </plugin> </plugins>-->

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/><!-- 單獨使用時配置成MANAGED沒有事務 -->
            <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>
    </environments>

    <mappers>
        <mapper resource="BlogMapper.xml"/>
        <mapper resource="BlogMapperExt.xml"/>
    </mappers>

</configuration>

一、mybatis-config.xml

1、作用

  mybatis-config.xml是MyBatis核心配置文件,該文件配置了MyBatis的一些全局信息,包含數據庫連接信息和Mybatis運行時所需的各種特性,以及設置和影響Mybatis行為的一些屬性

2、結構

configuration配置
    properties 可以配置在Java屬性配置文件中
    settings 修改Mybatis在運行時的行為方式
    typeAliases 為Java類型命名一個別名(簡稱)
    typeHandlers 類型處理器
    objectFactory 對象工廠
    plugins 插件
    environments 環境
        environment 環境變量
            transactionManager 事務管理器
            dataSource 數據源
       mappers 映射器

二、配置文件講解

1、configuration

  configuration元素是整個XML配置文件的根節點,相當於MyBatis的總管,MyBatis所有的配置信息都會存放在這里面。Mybatis提供了設置這些配置信息的方法。

  Configuration可從配置文件里獲取屬性值,也可以通過程序直接設置。

2、properties元素:properties元素描述的都是外部化、可替代的屬性

(1)通過外部指定的方式(在Java屬性配置文件 如database.properties)

driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/smbms
user=root password=root

  mybatis-config.xml 引入database.properties

// 引入 database.properties 文件
<properties resource="database.properties"/> …… <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${user}"/>
        <property name="password" value="${password}"/>
    </dataSource>

  上述代碼中,driver url username password屬性將會用database.properties文件中的值來替換

(2)直接配置為xml,並使用這些屬性對配置項實現動態配置:mybatis-config.xml

// properties元素中直接配置property屬性
<properties>
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
  <property name="user" value="root"/> <property name="password" value="root"/></properties> …… <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${user}"/> <property name="password" value="${password}"/> </dataSource>

  在上述代碼中,driver url username password將會由properties元素中設置的值來替換

(3)兩種方式優先級:resource屬性值的優先級高於property子節點配置的值

3、settings元素

  settings元素的作用是設置一些非常重要的選項,用於設置和改變Mybatis運行中的行為。

  settings元素支持的屬性

(1)cacheEnabled : 對在此配置文件下的所有cache進行全局性開/關設置 - true|false

(2)lazyLoadingEnabled : 全局性設置懶加載。如果設為false,則所有相關聯的設置都會被初始化加載 -true|false

(3)autoMappingBehavior : Mybatis對於resultMap自動映射的匹配級別 -PAPTLAL|NONE|FULL

  這是 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)
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) 類型別名或者全類名. 未設置

4、type Aliases元素

  配置類型別名,通過與MyBatis的SQL映射文件相關聯,減少輸入多余的完整類名,以簡化操作

(1)基礎配置

<typeAliases>
    <!--這里給實體類取別名,方便在mapper配置文件中使用-->
    <typeAlias alias="user" type="cn.smbms.pojo.User"/>
    <typeAlias alias="provider" type="cn.smbms.pojo.Provider"/> …… </typeAliases>

(2)簡便配置

  第一種方法弊端在於:如果一個項目中有多個POJO,需要一一進行配置。所以在第二種方法中,我們通過name屬性直接指定包名,讓Mybatis自動去掃描指定包下的JavaBean,並設置一個別名

<typeAliases>
    <package name="cn.smbms.pojo"/>
</typeAliases>

<mapper namespace="cn.smbms.dao.user.UserMapper">
    <!--查詢用戶表記錄數-->
    <select id="count" resultType="int">select count(1) as count from smbms_user </select>
    <!--查詢用戶列表-->
    <select id="getUserList" resultType="User">select * from smbms_user/select> </mapper>

  另外,Mybatis已經為許多常見的Java基礎數據類型內建了相應的類型別名。一般都與其映射類型一致,並且都是大小寫不敏感的,比如映射的類型int Boolean String Integer等,它們的別名都是int Boolean String Integer

5、environments元素

  配置不同的運行環境,但是不管增加幾套運行環境,都必須要明確選擇出當前唯一的一個運行環境。這是因為每個數據庫都對應一個Sql Session Factory實例,需要指明哪個運行環境被創建,並把運行環境中設置的參數傳遞個Sql Session Factory Builder

<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="${user}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
    <!--測試環境-->
    <environment id="test"> …… </environment>
 </environments>

  上述代碼中,需要注意以下幾個關鍵點:

(1)默認的運行環境ID:通過default屬性來指定當前的運行環境ID為development,對於環境ID的命名要確保唯一。

(2)transactionManager事務管理器:設置其類型為JDBC(MyBatis有兩種事務管理類型,即JDBC和MANAGED),直接使用JDBC的提交和回滾功能,依賴於從數據源獲得連接來管理事務的生命周期。

(3)dataSource元素:使用標准的JDBC數據源接口來配置JDBC連接對象的資源。

  MyBatis提供了三種數據源類型(UNPOOLED、POOLED、JNDI),這里使用POOLED數據源類型該類型利用“池”的概念將JDBC連接對象組織起來,減少了創建新的連接實例時所必需的初始化和認證時間,是MyBatis實現的簡單的數據庫連接池類型,它使數據庫連接可被復用,不必在每次請求時都去創建一個物理連接。對於高並發的Web應用,這是一種流行的處理方式,有利於快速響應請求。

6、mappers:用來定義SQL的映射語句

  <mappers>標簽配置的是我們的映射器,也就是Mapper.xml 的路徑。這里配置的目的是讓MyBatis 在啟動的時候去掃描這些映射器,創建映射關系。我們有四種指定Mapper 文件的方式:

  1. 使用相對於類路徑的資源引用(resource)
  2. 使用完全限定資源定位符(絕對路徑)(URL)
  3. 使用映射器接口實現類的完全限定類名
  4. 將包內的映射器接口實現全部注冊為映射器(最常用)
<!-- 使用相對於類路徑的資源引用 -->
<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://www.cnblogs.com/wuzhenzhao/p/11092526.html


免責聲明!

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



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