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