1. 程式人生 > 實用技巧 >Mybatis配置檔案深入

Mybatis配置檔案深入

課堂目標

主要內容

  1. 熟悉核心配置檔案SqlMapConfig.xml檔案的檔案層級關係;
  2. 熟悉並掌握核心配置檔案的常用配置標籤;
  3. 熟悉並掌握mapper對映檔案的SQL語句的基本寫法;
  4. 熟悉並掌握mapper對映檔案的動態SQL的寫法。

知識點掌握

  1. SqlMapConfig.xml核心配置檔案層級關係;
  2. 核心配置檔案常用標籤;
  3. 動態SQL的寫法。

課堂內容

Q1:簡述Mybatis核心配置檔案的層級關係。

A1:

configuration配置
	properties屬性
	settings設定
	typeAliases類型別名
	typeHandlers型別處理器
	objectFactory物件工廠
	plugins外掛
	environments環境
		environment環境變數
			transactionManager事務管理器
			dataSource資料來源
	databaseIdProvider資料庫廠商標識
	mappers對映器

Q2:簡述Mybatis的environment標籤的作用及其屬性配置。

A2:

<environments default="development"> ------ default指定預設的環境名稱
    <environment id="development"> ------ id指定當前環境的名稱
        <transactionManager type="JDBC"/> ------ type指定事務管理型別是JDBC
        <dataSource type="POOLED"> ------ type指定當前資料來源型別是連線池
            <!-- 資料來源配置的基本引數-->
            <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>

transactionManager(事務管理器)型別有2種

  1. JDBC:這個配置就是直接使用了JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務作用域。
  2. MANAGED:這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它預設的關閉行為。

dataSource(資料來源)型別有3種

  1. UNPOOLED:這個資料來源的實現只是每次被請求時開啟和關閉連線。
  2. POOLED:這種資料來源的實現利用“池”的概念將 JDBC 連線物件組織起來。
  3. JNDI:這個資料來源的實現是為了能在如 EJB 或應用伺服器這類容器中使用,容器可以集中或在外部配置資料來源,然後放置一個 JNDI 上下文的引用。

Q3:簡述Mybatis的mapper標籤的作用及其載入方式。

A3:mapper標籤的作用是載入對映的,有如下幾種載入方式:

<!-- 1.使用相對於類路徑的資源引用-->
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>

<!-- 2.使用完全限定資源定位符(URL)-->
<mapper URL="file:///var/mappers/AuthorMapper.xml"/>

<!-- 3.使用對映器介面實現類的完全限定類名-->
<mapper class="org.mybatis.builder.AuthorMapper"/>

<!-- 4.將包內的對映器介面實現全部註冊為對映器-->
<package name="org.mybatis.builder"/>

Q4:簡述Mybatis的properties標籤的作用及其載入方式。

A4:實際開發中,習慣將資料來源的配置資訊單獨抽取成一個properties檔案,該標籤就是用於載入額外配置的properties檔案。

<!-- 使用相對於類路徑的資源引用-->
<properties resource="jdbc.properties" />

Q5:簡述typeAliases標籤的作用以及常用類型別名。

A5:typeAliases標籤就是給Java型別設定一個短的名稱,也就是類型別名。

<typeAliases>
	<typeAlias type="com.lagou.domain.User" alias="user" />
</typeAliases>

Java常用類型別名

別名 資料型別
string String
long Long
int Integer
double Double
boolean Boolean

Q6:簡述動態SQL的寫法和相關的應用場景(參考Mybatis3官方文件)。

A6:

  1. if條件語句

    使用動態 SQL 最常見情景是根據條件包含 where 子句的一部分。如下:

    <!--這條語句提供了可選的查詢文字功能。如果不傳入 “title”,那麼所有處於 “ACTIVE” 狀態的 BLOG 都會返回;如果傳入了 “title” 引數,那麼就會對 “title” 一列進行模糊查詢並返回對應的 BLOG 結果-->
    <select id="findActiveBlogWithTitleLike" resultType="Blog">
        SELECT * FROM BLOG
        WHERE state = ‘ACTIVE’
        <if test="title != null">
            AND title like #{title}
        </if>
    </select>
    
  2. choose條件選擇語句(子標籤when、otherwise)

    有時候,我們不想使用所有的條件,而只是想從多個條件中選擇一個使用。類似switch語句的功能,如下:

    <!-- 還是上面的例子,但是策略變為:傳入了 “title” 就按 “title” 查詢,傳入了 “author” 就按 “author” 查詢的情形。若兩者都沒有傳入,就返回標記為 featured 的 BLOG-->
    <select id="findActiveBlogLike" resultType="Blog">
        SELECT * FROM BLOG WHERE state = ‘ACTIVE’
        <choose>
            <when test="title != null">
                AND title like #{title}
            </when>
            <when test="author != null and author.name != null">
                AND author_name like #{author.name}
            </when>
            <otherwise>
                AND featured = 1
            </otherwise>
        </choose>
    </select>
    
  3. where條件語句

    where 元素只會在子元素返回任何內容的情況下才插入 “WHERE” 子句。而且,若子句的開頭為 “AND” 或 “OR”,where 元素也會將它們去除。

    <select id="findActiveBlogLike" resultType="Blog">
        SELECT * FROM BLOG
        <where>
            <if test="state != null">
                state = #{state}
            </if>
            <if test="title != null">
                AND title like #{title}
            </if>
            <if test="author != null and author.name != null">
                AND author_name like #{author.name}
            </if>
        </where>
    </select>
    

    通過自定義 trim 元素來定製 where 元素的功能。比如,和 where 元素等價的自定義 trim 元素為:

    <trim prefix="WHERE" prefixOverrides="AND |OR ">
        ...
    </trim>
    

    prefixOverrides 屬性會忽略通過管道符分隔的文字序列(注意此例中的空格是必要的)。上述例子會移除所有 prefixOverrides 屬性中指定的內容,並且插入 prefix 屬性中指定的內容。

  4. set動態更新語句

    用於動態更新語句的類似解決方案叫做 set。set元素可以用於動態包含需要更新的列,忽略其它不更新的列。比如:

    <update id="updateAuthorIfNecessary">
        update Author
        <set>
            <if test="username != null">username=#{username},</if>
            <if test="password != null">password=#{password},</if>
            <if test="email != null">email=#{email},</if>
            <if test="bio != null">bio=#{bio}</if>
        </set>
        where id=#{id}
    </update>
    

    set 元素會動態地在行首插入 SET 關鍵字,並會刪掉額外的逗號(這些逗號是在使用條件語句給列賦值時引入的)。

    與 set 元素等價的自定義 trim 元素:

    <trim prefix="SET" suffixOverrides=",">
        ...
    </trim>
    

    注意,我們覆蓋了字尾值設定,並且自定義了字首值。

  5. foreach遍歷語句

    動態 SQL 的另一個常見使用場景是對集合進行遍歷(尤其是在構建 IN 條件語句的時候)。比如:

    <select id="selectPostIn" resultType="domain.blog.Post">
        SELECT *
        FROM POST P
        WHERE ID in
        <foreach item="item" index="index" collection="list"
                 open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>
    

    foreach 元素的功能非常強大,它允許你指定一個集合,宣告可以在元素體內使用的集合項(item)和索引(index)變數。它也允許你指定開頭與結尾的字串以及集合項迭代之間的分隔符。這個元素也不會錯誤地新增多餘的分隔符。

    提示:可以將任何可迭代物件(如 List、Set 等)、Map 物件或者陣列物件作為集合引數傳遞給 foreach。當使用可迭代物件或者陣列時,index 是當前迭代的序號,item 的值是本次迭代獲取到的元素。當使用 Map 物件(或者 Map.Entry 物件的集合)時,index 是鍵,item 是值。

課堂總結

  1. SqlMapConfig.xml核心配置檔案層級關係;

    configuration配置
    	properties屬性
    	settings設定
    	typeAliases類型別名
    	typeHandlers型別處理器
    	objectFactory物件工廠
    	plugins外掛
    	environments環境
    		environment環境變數
    			transactionManager事務管理器
    			dataSource資料來源
    	databaseIdProvider資料庫廠商標識
    	mappers對映器
    
  2. 核心配置檔案常用標籤;

    • properties
    • typeAliases
    • environments
      • environment
        • transactionManager
        • dataSource
          • property
  3. 動態SQL的寫法

    • if:相當於滿足條件,就在後面新增if下配置的語句,所以會有缺點。
    • choose:相當於switch語句,而且語句解讀上可以直接使用"當...當...否則...",缺點同if語句。
    • where:作用是動態實現where語句。
    • set:作用是動態實現更新語句。
    • foreach:一般是用於構建IN條件語句的時候遍歷傳入的引數,可以自定義範圍。