圖靈學(xué)院Java架構(gòu)師-VIP-手寫MyBatis框架

最近復(fù)習(xí)了Mybatis,就想用自己的理解手寫mybatis框架,Mybatis源碼的核心是jdk動態(tài)代理和jdbc。本文完成的Mybatis功能比較簡單,代碼還有許多需要改進的地方,歡迎大家可以結(jié)合Mybatis源碼去動手完善。

一、Mybatis流程簡介


在手寫自己的Mybatis框架之前,我們先來了解一下Mybatis,它的源碼中使用了大量的設(shè)計模式,閱讀源碼并觀察設(shè)計模式在其中的應(yīng)用,才能夠更深入的理解源碼(ref:Mybatis源碼解讀-設(shè)計模式總結(jié))。我們對上圖進行分析總結(jié):

mybatis的配置文件有2類

mybatisconfig.xml,配置文件的名稱不是固定的,配置了全局的參數(shù)的配置,全局只能有一個配置文件。

Mapper.xml 配置多個statemement,也就是多個sql,整個mybatis框架中可以有多個Mappe.xml配置文件。

通過mybatis配置文件得到SqlSessionFactory

通過SqlSessionFactory得到SqlSession,用SqlSession就可以操作數(shù)據(jù)了。

SqlSession通過底層的Executor(執(zhí)行器),執(zhí)行器有2類實現(xiàn):? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

基本實現(xiàn)

帶有緩存功能的實現(xiàn)

MappedStatement是通過Mapper.xml中定義statement生成的對象。

參數(shù)輸入執(zhí)行并輸出結(jié)果集,無需手動判斷參數(shù)類型和參數(shù)下標位置,且自動將結(jié)果集映射為Java對象

HashMap,KV格式的數(shù)據(jù)類型

Java的基本數(shù)據(jù)類型

POJO,java的對象

二、手動實現(xiàn)Mybatis框架思路

二、梳理自己的Mybatis的設(shè)計思路

? ? ? ?根據(jù)上文Mybatis流程,我簡化了下,分為以下步驟:

? ? ? ?1.dom4j讀取數(shù)據(jù)庫配置,建立連接

? ? ? ?LzxDBConfigurationUtils通過dom4j讀取mybatis-config.xml的工具類,mybatis3添加了數(shù)據(jù)庫環(huán)境配置本文通過讀取標簽的default,將屬性和連接數(shù)據(jù)庫的操作封裝在MyConfiguration對象中供后面的組件調(diào)用。

? ? ? 2.dom4j讀取Mapper配置

? 讀取mapper.xml的工具類,將接口類名、方法、返回類型封裝在LzxMapperBean對象中供后面的組件調(diào)用。

? ? ? ?3.創(chuàng)建SqlSession

? ? ? ?MySqlSession的成員變量中必須得有Executor和Configuration去做調(diào)配,箭頭就像是一種關(guān)聯(lián)關(guān)系。我們自己的SqlSession將有一個getMapper方法,然后使用動態(tài)代理生成對象后,就可以做數(shù)據(jù)庫的操作了。

? ? ? ?4.創(chuàng)建Executor,封裝JDBC操作數(shù)據(jù)庫

? ? ? ?Executor是一個執(zhí)行器,負責(zé)SQL語句的生成和查詢緩存(緩存還沒完成)的維護,也就是jdbc的代碼將在這里完成。


? ? ? ?5.創(chuàng)建LzxMapperProxy,使用動態(tài)代理生成Mapper對象

? ? ? ?我們只是希望對指定的接口生成一個對象,使得執(zhí)行它的時候能運行一句sql罷了,而接口無法直接調(diào)用方法,所以這里使用動態(tài)代理生成對象,在執(zhí)行時還是回到LzxSqlSession中調(diào)用查詢,最終由LzxExecutor做JDBC查詢。這樣設(shè)計是為了單一職責(zé),可擴展性更強。

項目地址:https://github.com/liuzx-2018/RewriteMybatis

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容