封面:洛小汐
作者:潘潘
一直以來
他們都說為了生活
便追求所謂成功
頂級薪水欲间、名牌包包
還有學區(qū)房
·
不過
總有人丟了生活
仍一無所獲
·
我比較隨遇而安
有些事懶得明白
平日里問心無愧
感興趣的事能一直做
便很知足
·
難道不是
除了活著
其他都只是錦上添花嗎
前言
上節(jié)我們介紹了 《 Mybatis系列全解(六):Mybatis最硬核的API你知道幾個? 》一文,詳細解讀了 Mybatis 框架核心設(shè)計和 API 甸鸟,圖文并茂撇贺,干貨滿滿,感興趣的朋友可以往下翻目錄找到文章的鏈接傳送門進行閱讀司志,文章發(fā)布之后被很多網(wǎng)站推薦閱讀甜紫,以致于持續(xù)至今依然會收到讀者朋友們的點贊評論關(guān)注、還有催更俐芯,閱讀量日日攀升棵介,當然我甚是開心,一來是兩周梳理的成果能得到認同吧史,二來也是發(fā)覺堅持做自己喜歡的事還能給大家?guī)硪恍┲R體驗邮辽,總之很欣慰。
回到本篇文章計劃講解內(nèi)容贸营,我們還是繼續(xù)沿用以往的文章風格吨述,對 Mybatis 框架在實際開發(fā)應用過程中,Dao 層的實現(xiàn)原理和方式進行解讀钞脂,開篇也簡單從 Mybatis 執(zhí)行 SQL 語句的流程切入揣云,引出我們研究的內(nèi)容,再與大家一同以全息視角知其然并知其所以然冰啃,下面我們一起探索吧刘莹。
號外: 我們的 Mybatis 全解系列一直在更新哦
Mybaits系列全解 ( 傳送門 )
- Mybatis系列全解(一):手寫一套持久層框架
- Mybatis系列全解(二):Mybatis簡介與環(huán)境搭建
- Mybatis系列全解(三):Mybatis簡單CRUD使用介紹
- Mybatis系列全解(四):全網(wǎng)最全!Mybatis配置文件XML全貌詳解
- Mybatis系列全解(五):全網(wǎng)最全焚刚!詳解Mybatis的Mapper映射文件
- Mybatis系列全解(六):Mybatis最硬核的API你知道幾個点弯?
- Mybatis系列全解(七):全息視角看Dao層兩種實現(xiàn)方式
- Mybatis系列全解(八):Mybatis的動態(tài)SQL
- Mybatis系列全解(九):Mybatis的復雜映射
- Mybatis系列全解(十):Mybatis注解開發(fā)
- Mybatis系列全解(十一):Mybatis緩存全解
- Mybatis系列全解(十二):Mybatis插件開發(fā)
- Mybatis系列全解(十三):Mybatis代碼生成器
- Mybatis系列全解(十四):Spring集成Mybatis
- Mybatis系列全解(十五):SpringBoot集成Mybatis
- Mybatis系列全解(十六):Mybatis源碼剖析
本文目錄
1、Mybatis 是如何找到 SQL 語句的 矿咕?
2抢肛、為什么有 Dao 層 ?
3碳柱、Dao 層的兩種實現(xiàn)方式:傳統(tǒng)與代理
1捡絮、Mybatis 是如何找到 SQL 語句的 ?
通過前面的學習莲镣,我們已經(jīng)對 Mybatis 的架構(gòu)設(shè)計以及核心數(shù)據(jù)層執(zhí)行流程都非常了解福稳,其實對于我們應用層的研發(fā)用戶來說,使用 Mybatis 框架的目的很簡單瑞侮,就是希望通過它來消除原有 JDBC 的冗余代碼邏輯灵寺、減輕我們開發(fā)工作量、提升研發(fā)效率区岗、以便于我們能夠?qū)W⒂?SQL 的編寫略板。所以說到底,是我們寫 SQL慈缔,Mybatis 幫我們執(zhí)行 SQL 叮称,跟數(shù)據(jù)庫做交互,更簡單來說藐鹤,我們和 Mybatis 的配合就5步:
1瓤檐、我們編寫 SQL
2、發(fā)號施令(調(diào)用API)
3娱节、Mybatis 找 SQL
4挠蛉、Mybatis 執(zhí)行 SQL
5、返回執(zhí)行結(jié)果
看吧肄满,Mybatis 實實在在是數(shù)據(jù)庫交互的好幫手呢谴古,乖巧又高效,我們只需編寫好 SQL 稠歉,在程序應用中就可以隨處發(fā)號施令(調(diào)用API)掰担,讓 Mybatis 幫我們具體執(zhí)行 SQL。但其實我們知道 Mybatis 默默做了許多事情怒炸,我們前面也都詳細剖析過的:
例如第1步編寫 SQL带饱,其實 Mybatis 就要求我們必須提前完成信息配置 Config.xml 與 映射文件 Mapper.xml (后面注解道理相同)再開始編寫 SQL;
例如第2步發(fā)號施令阅羹,其實就是我們實際應用當中調(diào)用增刪改查接口( 好比sqlsession.selectList )勺疼;
例如第4步執(zhí)行 SQL教寂,其實就是會話調(diào)用執(zhí)行器,執(zhí)行器調(diào)用語句處理器执庐,語句處理器結(jié)合參數(shù)處理器與類型處理器最終底層通過 JDBC 與數(shù)據(jù)庫交互孝宗;
例如第5步返回執(zhí)行結(jié)果,是 JDBC 返回的結(jié)果集并映射封裝耕肩,最終返回預期的封裝對象。
細心的你可能會發(fā)現(xiàn)问潭,我們第3步?jīng)]說到猿诸,那第3步是做什么的呢:Mybatis 找 SQL 。
到此狡忙,開始我們本小結(jié)的研究主題:
Mybatis 是如何找到 SQL 語句的梳虽?
針對這個問題,我們首先細細回想灾茁,平日里我們的 SQL 語句都編寫在哪些地方呢窜觉?嗯 ~ 不出意外的話,我相信大家腦海里都會浮現(xiàn)兩個地方:一個是 XML 配置文件北专,另一個是 Java 注解禀挫。
沒錯!假如使用 XML 配置方式則在 UserMapper.xml 配置文件中編寫 SQL 語句:
<mapper namespace="com.panshenlian.dao.UserDao">
<!-- 查詢用戶列表 -->
<select id="findAll" resultType="com.panshenlian.pojo.User" >
select * from User
</select>
</mapper>
使用 XML 配置方式編寫 SQL拓颓,會把 XML 中的「 命名空間標識 + 語句塊 ID 」作為唯一的語句標識语婴,這里的唯一語句標識為:
com.panshenlian.dao.UserDao.findAll
假如使用 Java 注解方式則在 UserDao 接口中編寫 SQL 語句:
public class UserDao {
/**
* 查詢用戶列表
* @return
*/
@Select(value =" select * from User ")
List<User> findAll();
}
使用 Java 注解方式編寫 SQL,會把接口中的「 接口全限定名 + 方法名 」作為唯一的語句標識驶睦,這里的唯一語句標識也是一樣:
com.panshenlian.dao.UserDao.findAll
其實砰左,我們的 Mybatis 是支持使用 XML 配置方式和 Java 注解兩種方式來編寫 SQL 語句的,兩者沒有絕對的孰優(yōu)孰劣场航,每個項目團隊都可以根據(jù)自身研發(fā)人員編碼習慣/能力缠导、工程的耦合性要求、研發(fā)效能性價比等多方面綜合考慮之后去做選擇溉痢。畢竟無論我們使用哪種方式僻造,目的都只是為了把實際需要執(zhí)行的 SQL 準備好,供 Mybatis 跟數(shù)據(jù)庫交互時使用孩饼。
是這樣的嫡意,Mybatis 在啟動構(gòu)建之初,會掃描我們編寫的 SQL 文件捣辆。假如你使用 XML 配置方式編寫 SQL蔬螟,那么需要在 Config.xml 核心配置文件中指定映射器文件 mapper.xml (下面代碼演示第一種);如果你使用 Java 注解方式編寫 SQL 汽畴,那么需要在 Config.xml 核心配置文件中也指定加載使用了注解的Mapper接口(下面代碼演示第二種)旧巾。
<!-- 第一種:XML配置方式:指定映射器文件 -->
<mappers>
<mapper resource="UserMapper.xml" />
</mappers>
<!-- 第二種:Java注解方式:指定映射器接口 -->
<mappers>
<mapper class="com.panshenlian.dao.UserDao"/>
</mappers>
同樣無論你使用哪一種方式告訴 Mybatis 來掃描/構(gòu)建耸序,最終都會被統(tǒng)一加載到一個 SQL 語句集合的大池子里面,它是一個 Map 集合鲁猩,以我們上面說的 唯一語句標識 作為集合的 key坎怪,以每一條 SQL 語句對象作為 value ,并且最終這個 SQL 語句 Map 集合的大池子廓握,會作為一個屬性設(shè)置在全局配置 Configuration 上面搅窿,供我們 Mybatis 在整個應用周期里頭隨時使用。
看看隙券,每一個 SQL 語句都實例成一個 MappedStatement 語句對象男应,并且這個 SQL 語句 Map 集合的大池子,會作為全局配置 Configuration 的屬性 mappedStatements 娱仔。
// Mybatis 全局配置對象
public class Configuration{
// 存儲SQL語句的集合池
Map<String, MappedStatement> mappedStatements
= new StrictMap<MappedStatement>
}
基本簡單的 SQL 語句解析過程:
到這里沐飘,我相信有部分好奇的朋友還是想知道,那 Mybatis 是如何把我們編寫的每一條 SQL 語句加載到語句集合大池子的呢牲迫?又是怎么保證每條語句在集合大池子中的 Key 值(唯一語句標識)是唯一不會重復的呢耐朴?
[圖片上傳失敗...(image-be0437-1611513575827)]
嗯,我們抱著好奇的小腦袋盹憎,對這兩個疑問進行探索:
1筛峭、Mybatis 是如何把我們編寫的每一條 SQL 語句加載到語句集合大池子的呢?
首先陪每,我們看看 Mybatis 在初始構(gòu)建會話時蜒滩,會通過加載核心配置文件,獲得會話工廠對象:
//加載核心配置文件
InputStream is =
Resources.getResourceAsStream("SqlMapConfig.xml");
// 獲得sqlSession工廠對象
SqlSessionFactory f =
new SqlSessionFactoryBuilder().build(is);
我們跟蹤了源代碼奶稠,發(fā)現(xiàn)會話工廠構(gòu)建器 SqlSessionFactoryBuilder 的build() 邏輯中俯艰,在實現(xiàn)會話工廠實例構(gòu)建的同時,會解析配置文件并封裝成全局配置對象 Configuration 和語句對象集合 MappedStatement 锌订。
用殊途同歸竹握,來形容 XML 配置方式和 Java 注解方式編寫 SQL 并構(gòu)建語句集合的過程再好不過了。
2辆飘、Mybatis 是怎么保證每條語句在集合大池子中的 Key 值(唯一語句標識)是唯一不會重復的呢啦辐??
根據(jù)第1個問題的分析結(jié)果蜈项,我們知道 SQL 語句最終會被存放在語句集合中芹关,那這個語句集合是普通 Map 嗎?顯示不是紧卒,這個集合實例其實是 Mybatis 框架在 Configuration 全局配置對象中的一個靜態(tài)的匿名內(nèi)部類 StrictMap侥衬,它繼承 HashMap ,重寫了 put() 方法,在 put() 中實現(xiàn)對 Key 值(唯一語句標識)的重復校驗轴总。
// 全局配置
public class Configuration {
// 靜態(tài)匿名內(nèi)部類
protected static class
StrictMap<V> extends HashMap<String, V> {
// 重寫了put方法
@Override
public V put(String key, V value) {
// 如果出現(xiàn)重復key則拋出異常
if (containsKey(key)) {
throw 重復異常;
}
}
}
}
所以直颅,無論是使用 XML 配置方式還是 Java 注解方式,都必須保證每條 SQL 語句有一個 唯一的語句標識怀樟,否則在 Mybatis 啟動構(gòu)建階段功偿,就會收到來自 Mybatis 的解析異常,例如我在 UserMapper.xml 中設(shè)置兩個 findAll 語句往堡。
<select id="findAll">
select 1 from User
</select>
<select id="findAll">
select * from User
</select>
不出意外械荷,出現(xiàn) Mybatis 解析 SQL 的異常警告:
// 異常定位很準確 --> 解析 mapper sql 時
### org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration.
// 哪個 mapper 文件呢 --> UserMapper.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'UserMapper.xml'
// 哪個 id 重復了呢 --> findAll
### Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.panshenlian.dao.IUserDao.findAll. please check UserMapper.xml and UserMapper.xml
好,到這里我們基本清晰虑灰,SQL 怎么存吨瞎,并且怎么不重復的存,而且存在哪瘩缆?那剩下的就很簡單,對于一個 Map 集合的取值佃蚜,我相信大家都知道庸娱,無非就是通過 key 來取到存儲的 value 值。而 Mybatis 中這個語句集合的取值方式也是一樣通過 key 值來去谐算,這個 key 呢熟尉,我們這里是每一條語句的 唯一語句標識 ,當我們調(diào)用會話 SqlSession 的增刪改查 API 的時候洲脂,就會傳遞這個唯一語句標識斤儿,告訴 Mybatis :“ 幫我們把這個 key 對應的語句對象的 SQL 執(zhí)行一下吧 “ ,僅此而已恐锦。
只不過往果,這里面當我們應用層的用戶調(diào)用增刪改查 API 的時候,我們到底是 如何把 Key 值告知給 Mybatis 呢一铅?是 直接 告訴 Mybatis 呢陕贮?還是委婉的(通過代理方式)告訴 Mybatis 。
這個就比較有意思了潘飘,也是我們第3部分主題要講解的內(nèi)容肮之,我們下面會細說,先看第2部分主題吧~
2卜录、為什么有 Dao 層 戈擒?
在軟件開發(fā)中,為了方便應用程序的研發(fā)與維護艰毒,一般我們都會使用清晰合理的框架模式來規(guī)范開發(fā)行為筐高,提高同模塊內(nèi)聚性,減低異模塊耦合性,例如 MVC凯傲、MVP犬辰、MVVM 等,而其中 MVC(Model-View-Controller) 則是 Java 語言中應用最廣泛的分層框架模式冰单。
對于 MVC 分層模式幌缝,其實最早的設(shè)計來源于桌面應用程序,一般 M 代表業(yè)務(wù)模型 Model诫欠,V 代表視圖界面 view涵卵,C 代表控制器 Controller ,一般的:
View (視圖層):視圖層直接面向用戶/終端荒叼,提供給用戶/終端的指令輸入或界面操作請求轿偎。
Controller (控制層):控制層負責接收 “視圖層” 的指令或操作請求,并轉(zhuǎn)移分派至 “模型層”被廓,接收到 “模型層” 的返回結(jié)果之后坏晦,會同步傳送回 “視圖層”,達到控制/紐帶的作用嫁乘。
Model (模型層):模型層是核心的數(shù)據(jù)信息處理層昆婿,分為業(yè)務(wù)邏輯處理與數(shù)據(jù)持久化處理,模型層接收來自 “控制層” 的請求蜓斧,并通過邏輯運算與數(shù)據(jù)轉(zhuǎn)換仓蛆,再把處理結(jié)果返回到 “控制層”。
從程序編碼角度看挎春,我們使用 MVC 的主要目的就是將 M 層與 V 層的實現(xiàn)代碼分離看疙,方便代碼分層設(shè)計與維護;從結(jié)果形態(tài)角度分析直奋,其實 M 層與 V 層可以理解為相同信息(或物質(zhì))的不同表現(xiàn)形態(tài)能庆,類比水與冰、或水與氣(可能不恰當脚线,But 我確實理解為信息/物質(zhì)形態(tài)轉(zhuǎn)移)相味,而 C 層的存在目的就是為了連接轉(zhuǎn)移 M 層與 V 層,保證 M 層與 V 層的同步/更新殉挽。
那有好奇的朋友就想知道丰涉,上面這介紹的 MVC 框架模式,跟我們 Dao 層有什么關(guān)系呢斯碌?
那必須有關(guān)系一死!
我們知道在 MVC 框架模式中,模型層 Model 是核心的數(shù)據(jù)信息處理層傻唾,包括業(yè)務(wù)邏輯處理與數(shù)據(jù)持久化處理投慈,其中業(yè)務(wù)邏輯處理我們劃為 Service 模塊承耿,負責具體業(yè)務(wù)需求對應的運算邏輯;數(shù)據(jù)持久化處理我們劃為 Dao 模塊(全稱 Data Access Object 伪煤,即數(shù)據(jù)訪問對象)加袋,負責與數(shù)據(jù)庫交互,連接 Service 模塊與數(shù)據(jù)庫抱既。所以只要是跟數(shù)據(jù)庫打交道职烧,我們的 Dao 層就必不可少!
到這里防泵,我相信很多朋友會聯(lián)想到蚀之,Dao 模塊是負責數(shù)據(jù)持久化處理 ,而我們的 Mybatis 不就是一個持久層框架嗎捷泞?沒錯足删,所以跟數(shù)據(jù)庫打交道的活,Mybatis 框架絕對是能全權(quán)負責锁右,所以當我們的項目應用集成 Mybatis 框架之后失受, Mybatis 的增刪改查等 API 就基本在 Dao 模塊中使用,并且接口調(diào)用與代碼實現(xiàn)也是極為簡單便捷咏瑟。
第3部分拂到,我們講講本文的關(guān)鍵主題 ” Dao 層的兩種實現(xiàn)方式:傳統(tǒng)與代理 “。
3响蕴、Dao 層的兩種實現(xiàn)方式:傳統(tǒng)與代理
有了前面兩點作為基礎(chǔ)谆焊,我們的第三個主題《 Dao 層的兩種實現(xiàn)方式:傳統(tǒng)與代理 》的內(nèi)容講解會讓大家很容易接受惠桃,因為我們在第一部分主題中花大篇幅闡明 Mybatis 是如何找到 SQL 語句的浦夷,讓大家對于 SQL 語句的尋找有了全面的了解,所以我在此處先提前跟大家劇透:Dao 層的兩種實現(xiàn)方式:傳統(tǒng)與代理 辜王,可以粗糙的理解為他兩僅僅在SQL 語句的 尋找方式 和 執(zhí)行對象 上存在區(qū)別而已劈狐。
我們先簡單看看我們一般的工程目錄結(jié)構(gòu)簡例(掐頭去尾只留下基本的 MVC 目錄骨架)。
一般 Dao 層 傳統(tǒng)上 的代碼實現(xiàn)方式:
1呐馆、編寫UserDao接口
public interface UserDao {
List<User> findAll() ;
}
2肥缔、編寫UserDaoImpl實現(xiàn)
public class UserDaoImpl implements UserDao {
@Override
public List<User> findAll() {
//加載核心配置文件
InputStream is = Resources.getResourceAsStream("config.xml");
// 獲得sqlSession工廠對象
SqlSessionFactory fy = new SqlSessionFactoryBuilder().build(is);
//獲得sqlSession對象
SqlSession sqlSession = fy.openSession();
// 執(zhí)行sql語句
List<User> userList = sqlSession.selectList("dao.UserDao.findAll");
return userList;
}
}
3、編寫 UserMapper.xml
<mapper namespace="dao.UserDao">
<select id="findAll">
select * from User
</select>
</mapper>
4汹来、Dao 層調(diào)用 (通過應用程序的 Service 層調(diào)用或者直接使用 Junit 框架進行測試)
// Service 服務(wù)層調(diào)用
// 或
// Junit 測試框架測試
@Test
public void tesDaoMethod(){
UserDao userDao = new UserDaoImpl();
List<User> userList = userDao.findAll();
System.out.println(userList);
}
以上調(diào)用結(jié)果可以獲取到所有 User 記錄续膳,這種通過在 Dao層定義接口、并創(chuàng)建 Dao 層接口實現(xiàn)類的方式收班,我們一般稱之為 Dao 層的傳統(tǒng)實現(xiàn)方式坟岔,此方式會構(gòu)建一個接口實現(xiàn)類去作為 Dao 層的執(zhí)行對象,并且對于 SQL 語句的找尋方式特別簡單直接摔桦,直接指定唯一語句標識社付,Java 文件中存在硬編碼, 例如本示例中的 SQL 語句唯一標識為: dao.UserDao.findAll承疲。
介紹完傳統(tǒng)的開發(fā)實現(xiàn)方式,我們說說 Dao 層的代理開發(fā)實現(xiàn)方式吧鸥咖,首先 Dao 層的代理開發(fā)方式有什么特別呢燕鸽?
首先代理開發(fā)實現(xiàn)方式只需我們編寫 Dao 接口而不需要編寫實現(xiàn)類。
那么既然不用編寫實現(xiàn)類啼辣,是不是會有一些其它方面的約束呢啊研?
那是當然了,這種代理開發(fā)實現(xiàn)方式熙兔,要求我們的接口與配置文件 Mapper.xml 需要遵循一些規(guī)范:
1) Mapper.xml 文件中的 namespace 與 mapper 接口的全限定名相同
2) Mapper 接口方法名和 Mapper.xml 中定義的每個 statement 的 id 相同
3) Mapper 接口方法的輸入?yún)?shù)類型和 mapper.xml 中定義的每個 sql 的 parameterType 的類型相同
4) Mapper 接口方法的輸出參數(shù)類型和 mapper.xml 中定義的每個 sql 的 resultType 的類型相同
由于代理開發(fā)實現(xiàn)方式與 Mapper 配置緊密關(guān)聯(lián)悲伶,故此我們也稱之為 Mapper 接口開發(fā)方法,之所以不需要編寫實現(xiàn)類的原因是其底層創(chuàng)建了 Dao 接口的動態(tài)代理對象住涉,代理對象本身會構(gòu)建有 Dao 接口的方法體麸锉, Dao 層 代理實現(xiàn)方式 的代碼實現(xiàn)方式:
1、編寫UserDao接口
public interface UserDao {
User findOne( int userId ) ;
}
2舆声、編寫 UserMapper.xml
<mapper namespace="dao.UserDao">
<select id="findOne" parameterType="int" resultType="user">
select * from User where id =#{id}
</select>
</mapper>
3花沉、Dao 層調(diào)用 (通過應用程序的 Service 層調(diào)用或者直接使用 Junit 框架進行測試)
// Service 服務(wù)層調(diào)用
// 或
// Junit 測試框架測試
@Test
public void tesDaoMethod(){
//加載核心配置文件
InputStream is = Resources.getResourceAsStream("config.xml");
// 獲得sqlSession工廠對象
SqlSessionFactory fy = new SqlSessionFactoryBuilder().build(is);
//獲得sqlSession對象
SqlSession sqlSession = fy.openSession();
//獲得MyBatis框架生成的 UserMapper接口的代理類
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//代理類執(zhí)行SQL
User user = userMapper.findById(1);
System.out.println(user);
sqlSession.close();
}
以上調(diào)用結(jié)果可以獲取到了指定 ID 的 User 記錄,此方式通過代理執(zhí)行實際 SQL 語句媳握,由于 Dao 接口與 Mapper.xml 配置已經(jīng)約定好規(guī)范碱屁,所以不需要在調(diào)用接口時指定唯一語句標識,Java 文件中也不會存在硬編碼問題蛾找。
到這里娩脾,就會有部分朋友疑惑? sqlSession 會話通過 getMapper 獲取接口代理類之后去調(diào)用接口方法打毛,那到底實際執(zhí)行接口方法的時候柿赊,Mybatis 的代理在代碼邏輯上是怎么跟 mapper.xml 配置文件中的 SQL 語句對應匹配起來的呢?
上圖黑色 ① ~ ⑥ 幻枉,是構(gòu)建 Dao 代理對象的實際過程碰声,基本就是生成代理對象的過程,其中 MapperProxy 代理類本身實現(xiàn)了 InvocationHandler 接口熬甫,所以符合一個代理類的要求胰挑,MapperProxy 代理實例最終是指派 MapperMethod 對象進行語句分發(fā)執(zhí)行,包含增刪改查等操作椿肩。
上圖紅色 ① ~ ③ 瞻颂,是代理對象在執(zhí)行實際接口時根據(jù)接口全限定名去 SQL 語句集合池查找 SQL 具體語句的過程。
// 實際語句執(zhí)行方法對象
public class MapperMethod{
// 根據(jù)指令類型分配執(zhí)行SQL
public Object execute(SqlSession sqlSession, Object[] args) {
switch (command.getType()) {
case INSERT: sqlSession.insert(接口語句ID); break;
case UPDATE: sqlSession.update(接口語句ID); break;
case DELETE: sqlSession.insert(接口語句ID); break;
case SELECT: sqlSession.select(接口語句ID); break;
}
}
}
另外郑象,本文關(guān)于代理的構(gòu)建過程贡这,建議大家看一下我的另外一個系列一文讀懂系列中的一篇文章 《一文讀懂Java動態(tài)代理》,就會對于 JDK 的動態(tài)代理有一個深刻的理解扣唱。(在我個人中心文章列表中查找吧~)
總結(jié)
本篇文章主要圍繞 Dao 層的兩種實現(xiàn)方式展開討論藕坯,首先鋪墊一些基礎(chǔ)認識例如 Mybatis 是如何找到 SQL 語句的团南、以及為什么有 Dao 層,然后我們集合代碼實現(xiàn)了解了傳統(tǒng)開發(fā)方式與代理開發(fā)方式實現(xiàn) Dao 層的區(qū)別炼彪,無非就是傳統(tǒng)方式是通過實現(xiàn)接口構(gòu)建實現(xiàn)類吐根,而代理模式是通過會話創(chuàng)建代理對象,不過他們只是執(zhí)行對象不同辐马,其實最終執(zhí)行 SQL 語句還是需要從 SQL 語句集合池中匹配查找拷橘,并最終還是通過 SqlSession 去執(zhí)行增刪改查。
本篇完喜爷,本系列下一篇我們講《 Mybatis系列全解(八):Mybatis的動態(tài)SQL 》冗疮。
文章持續(xù)更新,微信搜索「潘潘和他的朋友們」第一時間閱讀檩帐,隨時有驚喜术幔。本文會在 GitHub https://github.com/JavaWorld 收錄,關(guān)于熱騰騰的技術(shù)湃密、框架诅挑、面經(jīng)、解決方案泛源、摸魚技巧拔妥、教程、視頻达箍、漫畫等等等等没龙,我們都會以最美的姿勢第一時間送達,歡迎 Star ~ 我們未來 不止文章缎玫!想進讀者群的朋友歡迎撩我個人號:panshenlian硬纤,備注「加群」我們?nèi)豪飼沉模?BIU ~