从 0 开始手写一个 Mybatis 框架,三步搞定!
最近研究了一下Mybatis,給大家磕叨磕叨,MyBatis框架的核心功能其實不難,無非就是動態(tài)代理和jdbc的操作,難的是寫出來可擴展,高內聚,低耦合的規(guī)范的代碼。本文完成的Mybatis功能比較簡單,代碼還有許多需要改進的地方,大家可以結合Mybatis源碼去動手完善。
一、Mybatis框架流程簡介
在手寫自己的Mybatis框架之前,我們先來了解一下Mybatis,它的源碼中使用了大量的設計模式,閱讀源碼并觀察設計模式在其中的應用,才能夠更深入的理解源碼。我們對上圖進行分析總結:
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í)行并輸出結果集,無需手動判斷參數(shù)類型和參數(shù)下標位置,且自動將結果集映射為Java對象
HashMap,KV格式的數(shù)據(jù)類型
Java的基本數(shù)據(jù)類型
POJO,java的對象
二、梳理自己的Mybatis的設計思路
根據(jù)上文Mybatis流程,我簡化了下,分為以下步驟:
1.讀取xml文件,建立連接
從圖中可以看出,MyConfiguration負責與人交互。待讀取xml后,將屬性和連接數(shù)據(jù)庫的操作封裝在MyConfiguration對象中供后面的組件調用。本文將使用dom4j來讀取xml文件,它具有性能優(yōu)異和非常方便使用的特點。
2.創(chuàng)建SqlSession,搭建Configuration和Executor之間的橋梁
我們經常在使用框架時看到Session,Session到底是什么呢?一個Session僅擁有一個對應的數(shù)據(jù)庫連接。類似于一個前段請求Request,它可以直接調用exec(SQL)來執(zhí)行SQL語句。從流程圖中的箭頭可以看出,MySqlSession的成員變量中必須得有MyExecutor和MyConfiguration去集中做調配,箭頭就像是一種關聯(lián)關系。我們自己的MySqlSession將有一個getMapper方法,然后使用動態(tài)代理生成對象后,就可以做數(shù)據(jù)庫的操作了。
3.創(chuàng)建Executor,封裝JDBC操作數(shù)據(jù)庫
Executor是一個執(zhí)行器,負責SQL語句的生成和查詢緩存(緩存還沒完成)的維護,也就是jdbc的代碼將在這里完成,不過本文只實現(xiàn)了單表,有興趣的同學可以嘗試完成多表。
4.創(chuàng)建MapperProxy,使用動態(tài)代理生成Mapper對象
我們只是希望對指定的接口生成一個對象,使得執(zhí)行它的時候能運行一句sql罷了,而接口無法直接調用方法,所以這里使用動態(tài)代理生成對象,在執(zhí)行時還是回到MySqlSession中調用查詢,最終由MyExecutor做JDBC查詢。這樣設計是為了單一職責,可擴展性更強。
三、實現(xiàn)自己的Mybatis
工程文件及目錄:
首先,新建一個maven項目,在pom.xml中導入以下依賴:
創(chuàng)建我們的數(shù)據(jù)庫xml配置文件:
然后在數(shù)據(jù)庫創(chuàng)建test庫,執(zhí)行如下SQL語句:
創(chuàng)建User實體類,和UserMapper接口和對應的xml文件:
基本操作配置完成,接下來我們開始實現(xiàn)MyConfiguration:
用面向對象的思想設計讀取xml配置后:
接下來實現(xiàn)我們的MySqlSession,首先的成員變量里得有Excutor和MyConfiguration,代碼的精髓就在getMapper的方法里。
緊接著創(chuàng)建Executor和實現(xiàn)類:
MyExecutor中封裝了JDBC的操作:
MyMapperProxy代理類完成xml方法和真實方法對應,執(zhí)行查詢:
到這里,就完成了自己的Mybatis框架,我們測試一下:
執(zhí)行結果:
查詢一個不存在的用戶試試:
到這里我們就大功告成了!
總結
以上是生活随笔為你收集整理的从 0 开始手写一个 Mybatis 框架,三步搞定!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 困扰我多年的Java泛型〈? exten
- 下一篇: 我发现一个新的软件,用自然语言编程!非常