Mybatis配置檔案深入
課堂目標
主要內容
- 熟悉核心配置檔案SqlMapConfig.xml檔案的檔案層級關係;
- 熟悉並掌握核心配置檔案的常用配置標籤;
- 熟悉並掌握mapper對映檔案的SQL語句的基本寫法;
- 熟悉並掌握mapper對映檔案的動態SQL的寫法。
知識點掌握
- SqlMapConfig.xml核心配置檔案層級關係;
- 核心配置檔案常用標籤;
- 動態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種:
- JDBC:這個配置就是直接使用了JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務作用域。
- MANAGED:這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它預設的關閉行為。
dataSource(資料來源)型別有3種:
- UNPOOLED:這個資料來源的實現只是每次被請求時開啟和關閉連線。
- POOLED:這種資料來源的實現利用“池”的概念將 JDBC 連線物件組織起來。
- 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:
-
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>
-
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>
-
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 屬性中指定的內容。
-
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>
注意,我們覆蓋了字尾值設定,並且自定義了字首值。
-
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 是值。
課堂總結
-
SqlMapConfig.xml核心配置檔案層級關係;
configuration配置 properties屬性 settings設定 typeAliases類型別名 typeHandlers型別處理器 objectFactory物件工廠 plugins外掛 environments環境 environment環境變數 transactionManager事務管理器 dataSource資料來源 databaseIdProvider資料庫廠商標識 mappers對映器
-
核心配置檔案常用標籤;
- properties
- typeAliases
- environments
- environment
- transactionManager
- dataSource
- property
- environment
-
動態SQL的寫法
- if:相當於滿足條件,就在後面新增if下配置的語句,所以會有缺點。
- choose:相當於switch語句,而且語句解讀上可以直接使用"當...當...否則...",缺點同if語句。
- where:作用是動態實現where語句。
- set:作用是動態實現更新語句。
- foreach:一般是用於構建IN條件語句的時候遍歷傳入的引數,可以自定義範圍。