最近復(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é),可擴展性更強。
