(。・∀・)ノ゙嗨,小夥伴們,這篇博文將帶你們手寫mybatis,讓你們對mybaits的核心原理以及工做流程有更加深入的理解。在上篇Spring-Mybatis運行機制歸納以及上上篇MyBatis原理歸納發佈後,因爲本人事情較多致使這篇博文卻遲遲沒出來,這裏須要跟你們深感抱歉。可是,這篇若是你看了,我想你應該會以爲這一切都是值得的,由於之後在面試過程當中或者在同事面前就能夠好好裝裝啦,哈哈。
嗯哼,廢話很少說,我們直接進入主題。java
這裏先給你們看看若是大家看了這篇博文以後,能達到什麼樣的成果。git
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框架由哪些部分組成,下面是框架的代碼目錄。github
從上面的圖中能夠看到涵蓋了executor、plugin、typehandler等基礎組件。而後再看下是如何使用的。面試
有沒有發現使用過程當中跟原生Mybatis使用方式基本一致。最後就是你們應該比較關心的部分了,那就是源代碼能提供嗎???答案是確定!
handwritten_mybatis_framework 但願喜歡的小夥伴能star哦。sql
有些小夥伴可能會有疑問,怎麼才能寫出這樣的框架呢?這個怎麼回答呢,其實寫出來只須要你對Mybatis的工做原理有大體的瞭解,知道那些模塊是作什麼的又是怎麼實現的,而後畫個流程圖,而後定義須要哪些類和接口去實現,最後只須要將這些定義好的類和接口填空就能夠了。
那麼如今咱們來看看這個仿真Mybatis是怎麼工做的,固然須要申明的是這個框架僅僅只是做爲了解Mybatis運行原理的一個代碼練習,有些地方的代碼可能只是爲了演示這樣的效果,並不必定徹底跟原生同樣。好比Mybatis須要解析XML,而這裏咱們投了個懶,直接上properties。這樣咱們就能夠重點關注Myabtis的業務流程啦。
接下來對框架的每一個部分進行一個簡單的說明,具體還請小夥伴去看代碼好好了解而後有什麼問題直接在評論區或者私信我就能夠了,我保證看到就回復,哈哈。數據庫
顧名思義,就是框架配置類,用於解析配置文件加載相關環境。這裏代碼裏對配置文件的初始化主要有如下這麼一個流程。segmentfault
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這幾個步驟。具體如何進行小夥伴們能夠看下代碼實現,代碼寫得簡單,相信大家一看就懂。session
這個模塊用於用戶與框架交互的入口。包括經常使用的sqlSession、sqlSessionFactory以及sqlSessionFactoryBuilder。這幾個類徹底是仿照Mybatis的,只是類實現會相對簡單不少。至於每一個類用來幹嗎,這個我在以前的文章中有講述,這裏就很少作贅述啦,只是簡單引導講解框架信息。mybatis
這個模塊主要用來註冊咱們的mapper映射文件的。app
這裏須要說明下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 + '}'; } }
這個模塊主要用於執行SQL語句而且結合各類handler處理,而後這裏只是寫了一簡單的執行器類。
這裏模仿Mybatis執行SQL時的過程,stamentHandler用於處理語句集、parameterHandler用於處理參數、resultHandler用於處理結果映射。
這裏模仿Myabtis插件的工做原理實現的,也就是說這裏和原生Mybatis的plugin基本同樣,不過這裏我又偷了個懶,目前只能實現對executor的攔截。哈哈,別怪我。
這裏模仿Mybatis類型處理的機制,用於javaType到jdbcType的映射處理以及jdbcType到javaType的映射處理,固然這只是演示這樣的一種效果,具體實現其實沒有像Mybatis那樣複雜。大家看代碼應該也能看出來。
這裏的對框架的配置使用了簡單的properties,主要緣由仍是簡單易懂而後節省時間。
本地使用的話其實就跟項目入口文件那樣,拉下代碼,修改數據源信息,導入數據庫,pom依賴下載而後運行就跟遠程Mybatis那樣使用就能夠了,最後剩下的大家就能夠自由發揮修改代碼,相信大家能作得更好。