摘要:前言嗨,小伙伴們,這篇博文將帶大家手寫,讓大家對(duì)的核心原理以及工作流程有更加深刻的理解。模塊顧名思義,就是框架配置類,用于解析配置文件加載相關(guān)環(huán)境。配置模塊這里的對(duì)框架的配置使用了簡(jiǎn)單的,主要原因還是簡(jiǎn)單易懂然后節(jié)省時(shí)間。
前言
(????)??嗨,小伙伴們,這篇博文將帶大家手寫mybatis,讓大家對(duì)mybaits的核心原理以及工作流程有更加深刻的理解。在上篇Spring-Mybatis運(yùn)行機(jī)制概括以及上上篇MyBatis原理概括發(fā)布后,由于本人事情較多導(dǎo)致這篇博文卻遲遲沒(méi)出來(lái),這里需要跟大家深感抱歉。但是,這篇如果你看了,我想你應(yīng)該會(huì)覺(jué)得這一切都是值得的,因?yàn)橐院笤诿嬖囘^(guò)程中或者在同事面前就可以好好裝裝啦,哈哈。
嗯哼,廢話不多說(shuō),咱們直接進(jìn)入主題。
這里先給大家看看如果你們看了這篇博文之后,能達(dá)到什么樣的成果。
public class Entry { public static void main(String[] args) { MtConfiguration configuration = new MtConfiguration("mybatis-config.properties"); MtSqlSessionFactoryBuilder sqlSessionFactoryBuilder = new MtSqlSessionFactoryBuilder(configuration); MtSqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(); MtSqlSession sqlSession = sqlSessionFactory.openSession(); PersonDao personDao = sqlSession.getMapper(PersonDao.class); Person person = personDao.queryPersonById(1l); System.out.println(person); } }
了解Mybatis使用的同學(xué)們,能看出這跟你們常用的Mybatis有什么區(qū)別嗎?區(qū)別還是有的,只是很像有木有。
然后再讓大家看看這個(gè)仿真版的Mybatis框架由哪些部分組成,下面是框架的代碼目錄。
從上面的圖中可以看到涵蓋了executor、plugin、typehandler等基礎(chǔ)組件。然后再看下是如何使用的。
有沒(méi)有發(fā)現(xiàn)使用過(guò)程中跟原生Mybatis使用方式基本一致。最后就是大家應(yīng)該比較關(guān)心的部分了,那就是源代碼能提供嗎???答案是肯定!
handwritten_mybatis_framework 希望喜歡的小伙伴能star哦。
有些小伙伴可能會(huì)有疑問(wèn),怎么才能寫出這樣的框架呢?這個(gè)怎么回答呢,其實(shí)寫出來(lái)只需要你對(duì)Mybatis的工作原理有大致的了解,知道那些模塊是做什么的又是怎么實(shí)現(xiàn)的,然后畫個(gè)流程圖,然后定義需要哪些類和接口去實(shí)現(xiàn),最后只需要將這些定義好的類和接口填空就可以了。
那么現(xiàn)在我們來(lái)看看這個(gè)仿真Mybatis是怎么工作的,當(dāng)然需要申明的是這個(gè)框架僅僅只是作為了解Mybatis運(yùn)行原理的一個(gè)代碼練習(xí),有些地方的代碼可能只是為了演示這樣的效果,并不一定完全跟原生一樣。比如Mybatis需要解析XML,而這里我們投了個(gè)懶,直接上properties。這樣我們就可以重點(diǎn)關(guān)注Myabtis的業(yè)務(wù)流程啦。
接下來(lái)對(duì)框架的每個(gè)部分進(jìn)行一個(gè)簡(jiǎn)單的說(shuō)明,具體還請(qǐng)小伙伴去看代碼好好了解然后有什么問(wèn)題直接在評(píng)論區(qū)或者私信我就可以了,我保證看到就回復(fù),哈哈。
1.configuration模塊顧名思義,就是框架配置類,用于解析配置文件加載相關(guān)環(huán)境。這里代碼里對(duì)配置文件的初始化主要有以下這么一個(gè)流程。
public MtConfiguration(String configLocation){ this.configLocation = configLocation; init(); } private void init(){ try { //記載配置文件,這里使用properties代替xml解析 loadConfigProperties(); //初始化數(shù)據(jù)源信息 initDataSource(); //解析并加載mapper文件 loadMapperRegistory(); //解析加載plugin initPluginChain(); //解析加載typeHandler initTypeHandler(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } }
可以看到實(shí)例類的時(shí)候調(diào)用init方法進(jìn)行初始化,分別加載配置信息、初始化數(shù)據(jù)源信息、解析并加載mapper文件、解析加載plugin、解析加載typeHandler這幾個(gè)步驟。具體如何進(jìn)行小伙伴們可以看下代碼實(shí)現(xiàn),代碼寫得簡(jiǎn)單,相信你們一看就懂。
2.session模塊這個(gè)模塊用于用戶與框架交互的入口。包括常用的sqlSession、sqlSessionFactory以及sqlSessionFactoryBuilder。這幾個(gè)類完全是仿照Mybatis的,只是類實(shí)現(xiàn)會(huì)相對(duì)簡(jiǎn)單很多。至于每個(gè)類用來(lái)干嘛,這個(gè)我在之前的文章中有講述,這里就不多做贅述啦,只是簡(jiǎn)單引導(dǎo)講解框架信息。
3.Mapper映射模塊這個(gè)模塊主要用來(lái)注冊(cè)我們的mapper映射文件的。
這里需要說(shuō)明下MapperData這個(gè)類,這個(gè)類主要記錄sql語(yǔ)句和sql語(yǔ)句返回類型信息的。然后MapperRegistory用來(lái)保存方法與MapperData的映射關(guān)系,這樣我們執(zhí)行某個(gè)方法是就能找到對(duì)應(yīng)的Sql語(yǔ)句和對(duì)應(yīng)的返回類型了。這個(gè)過(guò)程可以結(jié)合Mybatis解析mapper.xml的過(guò)程去理解。
public class MapperData { private String sql; private Class type; public MapperData(String sql, Class type) { this.sql = sql; this.type = type; } public String getSql() { return sql; } public void setSql(String sql) { this.sql = sql; } public Class getType() { return type; } public void setType(Class type) { this.type = type; } @Override public String toString() { return "MapperData{" + "sql="" + sql + """ + ", resultType=" + type + "}"; } }4.Executor執(zhí)行模塊
這個(gè)模塊主要用于執(zhí)行SQL語(yǔ)句并且結(jié)合各種handler處理,然后這里只是寫了一簡(jiǎn)單的執(zhí)行器類。
5.handler模塊這里模仿Mybatis執(zhí)行SQL時(shí)的過(guò)程,stamentHandler用于處理語(yǔ)句集、parameterHandler用于處理參數(shù)、resultHandler用于處理結(jié)果映射。
6.plugin模塊這里模仿Myabtis插件的工作原理實(shí)現(xiàn)的,也就是說(shuō)這里和原生Mybatis的plugin基本一樣,不過(guò)這里我又偷了個(gè)懶,目前只能實(shí)現(xiàn)對(duì)executor的攔截。哈哈,別怪我。
7.typeHandler模塊這里模仿Mybatis類型處理的機(jī)制,用于javaType到j(luò)dbcType的映射處理以及jdbcType到j(luò)avaType的映射處理,當(dāng)然這只是演示這樣的一種效果,具體實(shí)現(xiàn)其實(shí)沒(méi)有像Mybatis那樣復(fù)雜。你們看代碼應(yīng)該也能看出來(lái)。
8.配置模塊這里的對(duì)框架的配置使用了簡(jiǎn)單的properties,主要原因還是簡(jiǎn)單易懂然后節(jié)省時(shí)間。
使用本地使用的話其實(shí)就跟項(xiàng)目入口文件那樣,拉下代碼,修改數(shù)據(jù)源信息,導(dǎo)入數(shù)據(jù)庫(kù),pom依賴下載然后運(yùn)行就跟遠(yuǎn)程Mybatis那樣使用就可以了,最后剩下的你們就可以自由發(fā)揮修改代碼,相信你們能做得更好。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/71269.html
摘要:基本綱要組成動(dòng)態(tài)配置配置核心源碼分析源碼解析源碼解析源碼解析源碼解析手寫框架是什么本質(zhì)是一種半自動(dòng)的框架,前身是其源于和的組合,除了和映射關(guān)系之外,還需要編寫語(yǔ)句映射三要素映射規(guī)則快速入門加入的依賴添加的配置文件場(chǎng)景介紹編寫實(shí)體類接口以及文 showImg(https://segmentfault.com/img/bVblrnC); Mybatis基本綱要 Mybatis組成 · 動(dòng)態(tài)...
摘要:核心流程三大階段縷清思路也就是核心流程之后,我們就開(kāi)始寫代碼了,詳見(jiàn)下節(jié) Mybatis快速入門 步驟: 1.加入mybatis的依賴 2.添加Mybatis的配置文件 3.場(chǎng)景介紹 4.編寫實(shí)體類丶mapper接口及mapper.xml文件 5.編寫測(cè)試代碼 demo: public class TUser { private Integer id; priva...
摘要:看我這邊文章的人,請(qǐng)先去,完全學(xué)習(xí)完了,理解了,再過(guò)來(lái)我這邊看看吧,反正我是剛從轉(zhuǎn)來(lái)的小白,有可以改良的請(qǐng)告訴我哈首先是它最后沒(méi)有做層開(kāi)始先把先回顧一下它最后做到包下的先這是他寫的第一個(gè)方法,我把它稍微改成自己熟悉的寫法,效果都是一樣的然 看我這邊文章的人,請(qǐng)先去http://blog.csdn.net/qq598535...,完全學(xué)習(xí)完了,理解了,再過(guò)來(lái)我這邊看看吧,反正我是剛從ph...
摘要:三大巨頭結(jié)果集再通過(guò)反射機(jī)制映射到對(duì)象上面,便做好了數(shù)據(jù)的映射關(guān)于映射具體內(nèi)容可查閱資料及源碼到這我們已經(jīng)完成了一個(gè)簡(jiǎn)易的框架了通過(guò)手寫一個(gè)簡(jiǎn)單的框架,我們就可以看得懂源碼了,學(xué)習(xí)框架設(shè)計(jì)的思路并且增強(qiáng)我們的內(nèi)功 簡(jiǎn)化版Mybatis實(shí)現(xiàn)思路 1.創(chuàng)建SqlSessionFactory實(shí)例. 2.實(shí)例化過(guò)程中,加載配置文件創(chuàng)建configuration對(duì)象. 3.通過(guò)factory創(chuàng)...
摘要:菜鳥(niǎo)教程框架中文手冊(cè)入門目標(biāo)使用搭建通過(guò)對(duì)數(shù)據(jù)增刪查改沒(méi)了純粹占行用的拜 后端API入門學(xué)習(xí)指北 了解一下一下概念. RESTful API標(biāo)準(zhǔn)] 所有的API都遵循[RESTful API標(biāo)準(zhǔn)]. 建議大家都簡(jiǎn)單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計(jì)指南 RESTful API指南 依賴注入 D...
閱讀 1223·2019-08-30 12:44
閱讀 709·2019-08-29 13:03
閱讀 2641·2019-08-28 18:15
閱讀 2483·2019-08-26 10:41
閱讀 3166·2019-08-26 10:28
閱讀 3091·2019-08-23 16:54
閱讀 2065·2019-08-23 15:16
閱讀 892·2019-08-23 14:55