(。・∀・)ノ゙嗨,小伙伴们,这篇博文将带你们手写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那样使用就能够了,最后剩下的大家就能够自由发挥修改代码,相信大家能作得更好。