更新時(shí)間:2021-06-21 12:35:14 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1068次
MyBatis 的真正強(qiáng)大之處在于它的映射語(yǔ)句,這也是它的魔力所在。由于它的映射語(yǔ)句異常強(qiáng)大,映射器的 XML 文件就顯得相對(duì)簡(jiǎn)單。MyBatis 3.0 相比 2.0 版本的一個(gè)最大變化,就是支持使用接口來(lái)調(diào)用方法。以前使用 SqlSession 通過(guò)命名空間調(diào)用 MyBatis 方法時(shí),首先需要用到命名空間和方法id 組成的字符串來(lái)調(diào)用相應(yīng)的方法 。
當(dāng)參數(shù)多于 1 個(gè)的時(shí)候,需要將所有參數(shù)放到一個(gè) Map對(duì)象中 。 通過(guò) Map 傳遞多個(gè)參數(shù),使用起來(lái)很不方便,而且還無(wú)法避免很多重復(fù)的代碼。使用接口調(diào)用方式就會(huì)方便很多, MyBatis 使用 Java 的動(dòng)態(tài)代理可以直接通過(guò)接口來(lái)調(diào)用相應(yīng)的方法,不需要提供接口的實(shí)現(xiàn)類,更不需要在實(shí)現(xiàn)類中使用 SqlSess 工∞以通過(guò)命名空間間接調(diào)用 。 另外,當(dāng)有多個(gè)參數(shù)的時(shí)候,通過(guò)參數(shù)注解@ Par am 設(shè)置參數(shù)的名字省去了 手動(dòng)構(gòu)造 Map 參數(shù)的過(guò)程,尤其在 Spring 中使用的時(shí)候,可以配置為自動(dòng)掃描所有的接口類 ,直接將接口注入需要用到的地方。
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>根標(biāo)簽的 name space 屬性。當(dāng) Mapper 接口和 XML 文件關(guān)聯(lián)的
時(shí)候,命名空間口amespace 的值就需要配置成接口的全限定名稱,例如 UserMapper 接口對(duì)
應(yīng)的 tk. mybatis . simple .mapper . UserMapper, MyBatis 內(nèi)部就是通過(guò)這個(gè)值將接口和
XML 關(guān)聯(lián)起來(lái)的。
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>
更簡(jiǎn)單的配置方式,代碼如下
<mappers>
<package name= ” tk.mybatis . simple . mapper ” />
</mappers>
這種配置方式會(huì)先查找 tk.mybatis.simple . mapper 包下所有的接口,循環(huán)對(duì)接口進(jìn)行如下操作。
1.判斷接口對(duì)應(yīng)的命名 空 間是否己經(jīng)存在,如果不存在就拋出異常,存在就繼續(xù)進(jìn)行接下來(lái)的操作。
2.加載接口對(duì)應(yīng)的卻也映射文件 , 將接口全限定名轉(zhuǎn)換為路徑 , 例如 , 將接口
tk.mybatis.simple.mapper.UserMapper 轉(zhuǎn)換為 tk/mybati s/simple/mapper/UserMapper.xml,搜索以.xml 為后綴搜索 XML 資源,如果找到就解析 XML 。
3.處理接口中的注解方法。
為什么 Mapper 接口沒有實(shí)現(xiàn)類卻能被正常調(diào)用呢?
這是因?yàn)?MyBaits 在 Mapper 接口上使用了動(dòng)態(tài)代理的一種非常規(guī)的用法,熟悉這種動(dòng)態(tài)代理的用法不僅有利于理解 MyBatis 接口和 XML 的關(guān)系,還能開闊思路 。從代理類中可以看到,當(dāng)調(diào)用 一個(gè)接口的方法時(shí),會(huì)先通過(guò)接口的全限定名稱和當(dāng)前調(diào)用的方法名的組合得到一個(gè)方法 id,這個(gè) id 的值就是映射 XML 中口arnespa ce 和具體方法 id的組合。所以可以在代理方法中使用 sqlSession 以命名空間的方式調(diào)用方法。通過(guò)這種方式可以將接口和 XML 文件中的方法關(guān)聯(lián)起來(lái)。這種代理方式和常規(guī)代理的不同之處在于,這里沒有對(duì)某個(gè)具體類進(jìn)行代理,而是通過(guò)代理轉(zhuǎn)化成了對(duì)其他代碼的調(diào)用。由于方法參數(shù)和返回值存在很多種情況,因此 MyBatis 的內(nèi)部實(shí)現(xiàn)會(huì)比上面的邏輯復(fù)雜得多,正是因?yàn)?MyBatis 對(duì)接口動(dòng)態(tài)代理的實(shí)現(xiàn),我們?cè)谑褂媒涌诜绞降臅r(shí)候才會(huì)如此容易。如果大家對(duì) MyBatis 源碼感興趣,可以通過(guò)第 11 章的內(nèi)容了解 MyBatis 的源碼并深入學(xué)習(xí)。通過(guò)本節(jié)這個(gè)簡(jiǎn)單的例子,我們可以了解 MyBatis 動(dòng)態(tài)代理實(shí)現(xiàn)的方式,同時(shí)也學(xué)會(huì)一種編程思路:可以通過(guò)動(dòng)態(tài)代理這個(gè)橋梁將對(duì)接口方法的調(diào)用轉(zhuǎn)換為對(duì)其他方法的調(diào)用 。
以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"Mybatis映射原理",希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為您服務(wù)。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743