Mybatis映射原理

MyBatis 的真正強大之處在于它的映射語句,這也是它的魔力所在。由于它的映射語句異
常強大,映射器的 XML 文件就顯得相對簡單。
MyBatis 3.0 相比 2.0 版本的一個最大變化,就是支持使用接口來調用方法。
以前使用 SqlSession 通過命名空間調用 MyBatis 方法時,首先需要用到命名空間和方法
id 組成的字符串來調用相應的方法 。 當參數多于 1 個的時候,需要將所有參數放到一個 Map
對象中 。 通過 Map 傳遞多個參數,使用起來很不方便,而且還無法避免很多重復的代碼。
使用接口調用方式就會方便很多, MyBatis 使用 Java 的動態代理可以直接通過接口來調
用 相應 的方法,不需要提供接口的實現類,更不需要在實現類中使用 SqlSess 工∞以通過
命名空 間間接調用 。 另外,當有多個參數的時候,通過參數注解@ Par am 設置參數的名字省
去了 手動構造 Map 參數的過程,尤其在 Spring 中使用的時候,可以配置為自動掃描所有的
接口類 ,直接將接口注入需要用到的地方。

mapper文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cnpiec.ireader.dao.GetBookDataDao">
    <insert id="batchInsertBook" parameterType="Book">
        INSERT INTO BOOK (BOOKID,NAME,PARTNERNAME) VALUES
        <foreach collection="list" item="book" separator=",">
            (#{book.bookId}, #{book.name}, #{book.partnerName})
        </foreach>
    </insert>
</mapper>

需要注意的是<mapper>根標簽的 name space 屬性。當 Mapper 接口和 XML 文件關聯的
時候,命名空間口amespace 的值就需要配置成接口的全限定名稱,例如 UserMapper 接口對
應的 tk. mybatis . simple .mapper . UserMapper, MyBatis 內部就是通過這個值將接口和
XML 關聯起來的。

mybati s-config.xml 配置文件中的 mappers 元素中配置所有的 mapper ,部分配置代碼如下 。

<mappers>
    <mapper resource=” tk/mybatis/simple/mapper/CountryMapper.xml ” / >
    <mapper resource=” tk/mybatis/simple/mapper/UserMapper . xml ” / >
    <mapper resource=” tk/mybatis/simple/mapper/RoleMapper.xml ” />
    <mapper resource=” tk/mybatis/simple/mapper/PrivilegeMapper . xml ” />
    <mapper resource=” tk/mybatis/simple/mapper/UserRoleMapper . xml ” />
    <mapper resource=” tk/mybatis/simple/mapper / RolePrivilegeMapper.xml ” />
</mappers>

更簡單的配置方式,代碼如下

<mappers>
    <package name= ” tk.mybatis . simple . mapper ” />
</mappers>

這種配置方式會先查找 tk.mybatis.simple . mapper 包下所有的接口,循環對接口進行
如下操作。

這種配置方式會先查找 tk.mybatis.simple . mapper 包下所有的接口,循環對接口進行
如下操作。

  1. 判斷接口對應的命名 空 間是否己經存在,如果不存在就拋出異常,存在就繼續進行接下
    來的操作。
  2. 加載接口對應的卻也映射文件 , 將接口全限定名轉換為路徑 , 例如 , 將接口
    tk.mybatis.simple.mapper.UserMapper 轉換為 tk/mybati s/simple/mapper/UserMapper.xml,
    搜索以.xml 為后綴搜索 XML 資源,如果找到就解析 XML 。
  3. 處理接口中的注解方法。

為什么 Mapper 接口沒有實現類卻能被正常調用呢?

這是因為 MyBaits 在 Mapper 接口上使用了動態代理的一種非常規的用法,熟悉這種動態代
理的用法不僅有利于理解 MyBatis 接口和 XML 的關系,還能開闊思路 。

從代理類中可以看到,當調用 一個接口的方法時,會先通過接口的全限定名稱和當前調用
的方法名的組合得到一個方法 id,這個 id 的值就是映射 XML 中口arnespa ce 和具體方法 id
的組合。所以可以在代理方法中使用 sqlSession 以命名空間的方式調用方法。通過這種方式
可以將接口和 XML 文件中的方法關聯起來。這種代理方式和常規代理的不同之處在于,這里
沒有對某個具體類進行代理,而是通過代理轉化成了對其他代碼的調用。
由于方法參數和返回值存在很多種情況,因此 MyBatis 的內部實現會比上面的邏輯復雜得
多,正是因為 MyBatis 對接口動態代理的實現,我們在使用接口方式的時候才會如此容易。如
果大家對 MyBatis 源碼感興趣,可以通過第 11 章的內容了解 MyBatis 的源碼并深入學習。
通過本節這個簡單的例子,我們可以了解 MyBatis 動態代理實現的方式,同時也學會一種
編程思路:可以通過動態代理這個橋梁將對接口方法的調用轉換為對其他方法的調用 。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容