透彻理解MyBatis设计思想之手写实现

前言

MyBatis,曾经给我的感觉是一个很神奇的东西,我们只需要按照规范写好XXXMapper.xml以及XXXMapper.java接口。要知道我们并没有提供XXXMapper.java的实现类,MyBatis到底是怎么做到这一点的呢?有人会说是动态代理,现在我就来通过手写一个迷你版的MyBatis来彻底理解它的设计思想!

如果你不了解JDK动态代理,请参考:《纯手写实现JDK动态代理》

如果你不了解MyBatis的使用,请参考:《MyBatis+Spring MVC开发指南(一)》

如果你对Spring MVC感兴趣,请参考:《写出我的第一个框架:迷你版Spring MVC》


动手写一个迷你版的MyBatis

MyBatis原理架构图

其实对于MyBatis最为关键的就在于:

XXXMapper mapper = sqlSession.getMapper(XXXMapper.class);

大家可以以这个为切入口,进行源码跟踪,容易得到上面的调用链。

我们先来看一下迷你版MyBatis的整体框架思路:

迷你版MyBatis

执行器MyExecutor:

MyExecutor提供query方法

在MyBatis中,比如说select有多种形式,比如selectOne,selectList,那么其实到最后,还是向JDBC发出一个SQL而已。对于执行器而言,其实对于查询,提供一个query接口就可以了。

这里,为了简便,直接执行已经处理好的SQL语句(动态SQL以及输入类型,这不是迷你版MyBatis关心的)。另外执行器的实现类MyBaseExecutor其实就是一段JDBC的操作代码。


query的JDBC实现

这里为了简化处理,在RequestMapping这块硬编码了。

StudentMapper.java/StudentMapper.xml:

Mapper接口


Mapper.xml

这里,为了不牵涉到XML的解析过程,直接提供已经处理完毕的结果。其实就是namespace/statementID/SQL的存储、映射。

对外暴露的API接口(MySqlSession):

MySqlSession


MySqlSession实现

从这里,你能够看到一些端倪:

第一,MyDefaultSqlSession持有执行器的引用,调用selectOne等方法,就是在调用执行器的query方法。

第二,在getMapper的获取过程中,我们看到了具体业务处理Handler的身影:MyMapperProxy,根据JDK动态代理的知识,我们知道,最终都是要回调Handler的invoke方法完成的。

MyMapperProxy:

MyMapperProxy

当invoke方法被调用时,我们根据调用的方法,进行反射,得到namespace以及对应的SQL,然后,我们把SQL交给sqlSession进行执行即可。

启动测试类Bootstrap:

Bootstrap

看到没有,我们完全通过自己的类,自己的理解,去实现了和MyBatis一样的功能!


OK,一个迷你版的MyBatis就竣工了,有一种油然而生的成就感,哈哈~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,007评论 6 342
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,863评论 0 4
  • Mybatis相关 1.Mybatis是什么? 2.为什么选择Mybatis? 3、#{}和${}的区别是什么? ...
    zhihaoZzz阅读 1,307评论 0 2
  • 随着人们生活水平的提高,越来越多的人开始关注口腔健康。牙齿健康关系到全身健康的诸多方面,牙齿出现问题,将会对人们的...
    我只是默默无闻的小苦逼阅读 533评论 0 0
  • 一、情境综述 工作:重点围绕R项目及质量问题攻关开展工作。 素质:周计划实践进入第3阶段,加强跟进;日计划记录持续...
    严哥阅读 303评论 0 1