透彻理解MyBatis设计思想之手写实现
Posted java进阶架构师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了透彻理解MyBatis设计思想之手写实现相关的知识,希望对你有一定的参考价值。
MyBatis,曾经给我的感觉是一个很神奇的东西,我们只需要按照规范写好XXXMapper.xml以及XXXMapper.java接口。要知道我们并没有提供XXXMapper.java的实现类,MyBatis到底是怎么做到这一点的呢?有人会说是动态代理,现在我就来通过手写一个迷你版的MyBatis来彻底理解它的设计思想!
MyBatis原理架构图
其实对于MyBatis最为关键的就在于:
XXXMapper mapper = sqlSession.getMapper(XXXMapper.class);
大家可以以这个为切入口,进行源码跟踪,容易得到上面的调用链。
迷你版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的存储、映射。
MySqlSession
从这里,你能够看到一些端倪:
第一,MyDefaultSqlSession持有执行器的引用,调用selectOne等方法,就是在调用执行器的query方法。
第二,在getMapper的获取过程中,我们看到了具体业务处理Handler的身影:MyMapperProxy,根据JDK动态代理的知识,我们知道,最终都是要回调Handler的invoke方法完成的。
MyMapperProxy:
MyMapperProxy
当invoke方法被调用时,我们根据调用的方法,进行反射,得到namespace以及对应的SQL,然后,我们把SQL交给sqlSession进行执行即可。
启动测试类Bootstrap:
Bootstrap
看到没有,我们完全通过自己的类,自己的理解,去实现了和MyBatis一样的功能!
OK,一个迷你版的MyBatis就竣工了,有一种油然而生的成就感,哈哈~
本号已开设如下二十大专题,关注后查看【我的主页】,批阅相关专题!
【极简入门专题】【dubbo实战专题】
【设计模式专题】【dubbo源码专题】
【数据结构专题】【 netty 源码专题】
【网络协议专题】【spring源码专题】
【并发编程专题】【springboot专题】
【架构技术专题】【zookeeper专题】
【BATj面试专题】【redis 实战专题】
【mq中间件专题】【mysql优化专题】
【grpc+etcd专题】【 线程相关专题】
【JVM调优专题】【springcloud专题】
闷骚的大屌程序员富一代们↓↓↓↓
点个赞、留个言再走可好↓↓
以上是关于透彻理解MyBatis设计思想之手写实现的主要内容,如果未能解决你的问题,请参考以下文章