SQL 映射文件有很少的幾個(gè)頂級(jí)元素(按照它們應(yīng)該被定義的順序):
cache – 給定命名空間的緩存配置。 cache-ref – 其他命名空間緩存配置的引用。 resultMap – 是最復(fù)雜也是最強(qiáng)大的元素,用來(lái)描述如何從數(shù)據(jù)庫(kù)結(jié)果集中來(lái)加載對(duì)象。 parameterMap – 已廢棄!老式風(fēng)格的參數(shù)映射。內(nèi)聯(lián)參數(shù)是首選,這個(gè)元素可能在將來(lái)被移除,這里不會(huì)記錄。 sql – 可被其他語(yǔ)句引用的可重用語(yǔ)句塊。 insert – 映射插入語(yǔ)句 update – 映射更新語(yǔ)句 delete – 映射刪除語(yǔ)句 select – 映射查詢語(yǔ)句
select可以有很多的屬性配置。 下面列舉一些不常用的單比較重要的屬性。
| 屬性 | 描述 |
|---|---|
| flushCache | 將其設(shè)置為 true,任何時(shí)候只要語(yǔ)句被調(diào)用,都會(huì)導(dǎo)致本地緩存和二級(jí)緩存都會(huì)被清空,默認(rèn)值:false。 |
| useCache | 將其設(shè)置為 true,將會(huì)導(dǎo)致本條語(yǔ)句的結(jié)果被二級(jí)緩存,默認(rèn)值:對(duì) select 元素為 true。 |
| timeout | 這個(gè)設(shè)置是在拋出異常之前,驅(qū)動(dòng)程序等待數(shù)據(jù)庫(kù)返回請(qǐng)求結(jié)果的秒數(shù)。默認(rèn)值為 unset(依賴驅(qū)動(dòng)) |
| fetchSize | 嘗試影響驅(qū)動(dòng)程序每次批量返回的結(jié)果行數(shù)和這個(gè)設(shè)置值相等。默認(rèn)值為 unset(依賴驅(qū)動(dòng))。 |
| statementType | STATEMENT,PREPARED 或 CALLABLE 的一個(gè)。這會(huì)讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認(rèn)值:PREPARED。 |
| resultSetType | FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一個(gè),默認(rèn)值為 unset (依賴驅(qū)動(dòng))。 |
下面解釋下幾個(gè)屬性:
| 屬性 | 描述 |
|---|---|
| useGeneratedKeys | (僅對(duì) insert 和 update 有用)這會(huì)令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來(lái)取出由數(shù)據(jù)庫(kù)內(nèi)部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)的自動(dòng)遞增字段),默認(rèn)值:false。 |
| keyProperty | (僅對(duì) insert 和 update 有用)唯一標(biāo)記一個(gè)屬性,MyBatis 會(huì)通過(guò) getGeneratedKeys 的返回值或者通過(guò) insert 語(yǔ)句的 selectKey 子元素設(shè)置它的鍵值,默認(rèn):unset。如果希望得到多個(gè)生成的列,也可以是逗號(hào)分隔的屬性名稱列表。 |
插入語(yǔ)句詳細(xì)解釋: 1. 如果你的數(shù)據(jù)庫(kù)支持自動(dòng)生成主鍵的字段(比如 MySQL 和 SQL Server),那么你可以設(shè)置 useGeneratedKeys=”true”,然后再把 keyProperty 設(shè)置到目標(biāo)屬性上就OK了。
<insert id="insertAuthor" **useGeneratedKeys="true" keyProperty="id"**> insert into Author (username,passWord,email,bio) values (#{username},#{password},#{email},#{bio})</insert>如果你的數(shù)據(jù)庫(kù)還支持多行插入, 你也可以傳入一個(gè)Authors數(shù)組或集合,并返回自動(dòng)生成的主鍵。 使用foreach循環(huán)進(jìn)行批量插入。
<insert id="insertAuthor" useGeneratedKeys="true" keyProperty="id"> insert into Author (username, password, email, bio) values <foreach item="item" collection="list" separator=","> (#{item.username}, #{item.password}, #{item.email}, #{item.bio}) </foreach></insert>如果數(shù)據(jù)庫(kù)不支持自動(dòng)生成主鍵,該如何操作呢? 下面給出了一個(gè)例子(最好不要這么做):
<insert id="insertAuthor"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1 </selectKey> insert into Author (id, username, password, email,bio, favourite_section) values (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})</insert>selectKey 元素描述如下:
<selectKey keyProperty="id" resultType="int" order="BEFORE" statementType="PREPARED">| 屬性 | 描述 |
|---|---|
| order | 這可以被設(shè)置為 BEFORE 或 AFTER。如果設(shè)置為 BEFORE,那么它會(huì)首先選擇主鍵,設(shè)置 keyProperty 然后執(zhí)行插入語(yǔ)句。如果設(shè)置為 AFTER,那么先執(zhí)行插入語(yǔ)句,然后是 selectKey 元素 - 這和像 Oracle 的數(shù)據(jù)庫(kù)相似,在插入語(yǔ)句內(nèi)部可能有嵌入索引調(diào)用。 |
這個(gè)元素可以被用來(lái)定義可重用的 SQL 代碼段,可以包含在其他語(yǔ)句中。它可以被靜態(tài)地(在加載參數(shù)) 參數(shù)化. 不同的屬性值通過(guò)包含的實(shí)例變化
resultMap 元素是 MyBatis 中最重要最強(qiáng)大的元素。它就是讓你遠(yuǎn)離 90%的需要從結(jié)果 集中取出數(shù)據(jù)的 JDBC 代碼的那個(gè)東西, 而且在一些情形下允許你做一些 JDBC 不支持的事 情。 事實(shí)上, 編寫相似于對(duì)復(fù)雜語(yǔ)句聯(lián)合映射這些等同的代碼, 也許可以跨過(guò)上千行的代碼。 ResultMap 的設(shè)計(jì)就是簡(jiǎn)單語(yǔ)句不需要明確的結(jié)果映射,而很多復(fù)雜語(yǔ)句確實(shí)需要描述它們 的關(guān)系。
constructor - 類在實(shí)例化時(shí),用來(lái)注入結(jié)果到構(gòu)造方法中 idArg - ID 參數(shù);標(biāo)記結(jié)果作為 ID 可以幫助提高整體效能arg - 注入到構(gòu)造方法的一個(gè)普通結(jié)果id – 一個(gè) ID 結(jié)果;標(biāo)記結(jié)果作為 ID 可以幫助提高整體效能result – 注入到字段或 javaBean 屬性的普通結(jié)果association – 一個(gè)復(fù)雜的類型關(guān)聯(lián);許多結(jié)果將包成這種類型 嵌入結(jié)果映射 – 結(jié)果映射自身的關(guān)聯(lián),或者參考一個(gè)collection – 復(fù)雜類型的集 嵌入結(jié)果映射 – 結(jié)果映射自身的集,或者參考一個(gè)discriminator – 使用結(jié)果值來(lái)決定使用哪個(gè)結(jié)果映射 case – 基于某些值的結(jié)果映射嵌入結(jié)果映射 – 這種情形結(jié)果也映射它本身,因此可以包含很多相 同的元素,或者它可以參照一個(gè)外部的結(jié)果映射。構(gòu)造方法注入允許你在初始化時(shí) 為類設(shè)置屬性的值,而不用暴露出公有方法。MyBatis 也支持私有屬性和私有 JavaBeans 屬 性來(lái)達(dá)到這個(gè)目的,但是一些人更青睞構(gòu)造方法注入。構(gòu)造方法元素支持這個(gè)。
public class User { //... public User(int id, String username) { //... }//...}對(duì)應(yīng)的mapper:
<constructor> <idArg column="id" javaType="int"/> <arg column="username" javaType="String"/></constructor>關(guān)聯(lián)元素處理“有一個(gè)”類型的關(guān)系。比如,在我們的示例中,一個(gè)博客有一個(gè)用戶。 關(guān)聯(lián)映射就工作于這種結(jié)果之上。你指定了目標(biāo)屬性,來(lái)獲取值的列,屬性的 java 類型(很 多情況下 MyBatis 可以自己算出來(lái)) ,如果需要的話還有 jdbc 類型,如果你想覆蓋或獲取的 結(jié)果值還需要類型控制器。
關(guān)聯(lián)中不同的是你需要告訴 MyBatis 如何加載關(guān)聯(lián)。MyBatis 在這方面會(huì)有兩種不同的 方式: 1. 嵌套查詢:通過(guò)執(zhí)行另外一個(gè) SQL 映射語(yǔ)句來(lái)返回預(yù)期的復(fù)雜類型。 2. 嵌套結(jié)果:使用嵌套結(jié)果映射來(lái)處理重復(fù)的聯(lián)合結(jié)果的子集。首先,然讓我們來(lái)查看這個(gè)元素的屬性。所有的你都會(huì)看到,它和普通的只由 select 和 resultMap 屬性的結(jié)果映射不同。
MyBatis 包含一個(gè)非常強(qiáng)大的查詢緩存特性,它可以非常方便地配置和定制。MyBatis 3 中的緩存實(shí)現(xiàn)的很多改進(jìn)都已經(jīng)實(shí)現(xiàn)了,使得它更加強(qiáng)大而且易于配置。
默認(rèn)情況下是沒(méi)有開啟緩存的,除了局部的 session 緩存,可以增強(qiáng)變現(xiàn)而且處理循環(huán) 依賴也是必須的。要開啟二級(jí)緩存,你需要在你的 SQL 映射文件中添加一行:<cache/> - 映射語(yǔ)句文件中的所有 select 語(yǔ)句將會(huì)被緩存。 - 映射語(yǔ)句文件中的所有 insert,update 和 delete 語(yǔ)句會(huì)刷新緩存。 - 緩存會(huì)使用 Least Recently Used(LRU,最近最少使用的)算法來(lái)收回。 - 根據(jù)時(shí)間表(比如 no Flush Interval,沒(méi)有刷新間隔), 緩存不會(huì)以任何時(shí)間順序 來(lái)刷新。 - 緩存會(huì)存儲(chǔ)列表集合或?qū)ο?無(wú)論查詢方法返回什么)的 1024 個(gè)引用。 - 緩存會(huì)被視為是 read/write(可讀/可寫)的緩存,意味著對(duì)象檢索不是共享的,而 且可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改。
可用的收回策略有:
LRU – 最近最少使用的:移除最長(zhǎng)時(shí)間不被使用的對(duì)象。默認(rèn)策略。 FIFO – 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來(lái)移除它們。 SOFT – 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對(duì)象。 WEAK – 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對(duì)象。
除了這些自定義緩存的方式, 你也可以通過(guò)實(shí)現(xiàn)你自己的緩存或?yàn)槠渌谌骄彺娣桨?創(chuàng)建適配器來(lái)完全覆蓋緩存行為。
<cache type="com.domain.something.MyCustomCache"/>配置:
<cache type="com.domain.something.MyCustomCache"> <property name="cacheFile" value="/tmp/my-custom-cache.tmp"/></cache>記得緩存配置和緩存實(shí)例是綁定在 SQL 映射文件的命名空間是很重要的。因此,所有 在相同命名空間的語(yǔ)句正如綁定的緩存一樣。 語(yǔ)句可以修改和緩存交互的方式, 或在語(yǔ)句的 語(yǔ)句的基礎(chǔ)上使用兩種簡(jiǎn)單的屬性來(lái)完全排除它們。默認(rèn)情況下,語(yǔ)句可以這樣來(lái)配置:
<select ... flushCache="false" useCache="true"/><insert ... flushCache="true"/><update ... flushCache="true"/><delete ... flushCache="true"/>也許將來(lái)的某個(gè)時(shí)候,你會(huì)想在命名空間中共享相同的緩存配置和實(shí)例。在這樣的 情況下你可以使用 cache-ref 元素來(lái)引用另外一個(gè)緩存。
<cache-ref namespace="com.someone.application.data.SomeMapper"/>mybatis
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注