手写迷你版本Mybatis

动手写一个迷你版的MyBatis

手写迷你版本Mybatis_第1张图片

MyBatis原理架构图

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

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

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

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

手写迷你版本Mybatis_第2张图片

迷你版MyBatis

执行器MyExecutor:

手写迷你版本Mybatis_第3张图片

MyExecutor提供query方法

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

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

 

手写迷你版本Mybatis_第4张图片

query的JDBC实现

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

StudentMapper.java/StudentMapper.xml:

手写迷你版本Mybatis_第5张图片

Mapper接口

 

手写迷你版本Mybatis_第6张图片

Mapper.xml

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

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

手写迷你版本Mybatis_第7张图片

MySqlSession

 

手写迷你版本Mybatis_第8张图片

MySqlSession实现

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

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

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

MyMapperProxy:

手写迷你版本Mybatis_第9张图片

MyMapperProxy

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

启动测试类Bootstrap:

手写迷你版本Mybatis_第10张图片



作者:张丰哲
链接:https://www.jianshu.com/p/73ee8caddc68
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

你可能感兴趣的:(javaweb)