前言


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 MVC

【手写系列】透彻理解Spring事务设计思想之手写实现

【手写系列】纯手写实现一个高可用的RPC

【手写系列】理解数据库连接池底层原理之手写实现

【手写系列】对HashMap的思考及手写实现

【手写系列】纯手写实现JDK动态代理

【手写系列】写一个迷你版的Tomcat

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

【手写系列】透彻理解MyBatis设计思想之手写实现相关推荐

  1. 【手写系列】透彻理解Spring事务设计思想之手写实现

    事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Dura ...

  2. 【手写系列】理解数据库连接池底层原理之手写实现

    前言 数据库连接池的基本思想是:为数据库连接建立一个"缓冲池",预先在池中放入一定数量的数据库连接管道,需要时,从池子中取出管道进行使用,操作完毕后,再将管道放入池子中,从而避免了 ...

  3. 【手写系列】对HashMap的思考及手写实现

    前言 HashMap是Java中常用的集合,而且HashMap的一些思想,对于我们平时解决业务上的一些问题,在思路上有帮助,基于此,本篇博客将分析HashMap底层设计思想,并手写一个迷你版的Hash ...

  4. 透彻理解Spring事务设计思想之手写实现

    2019独角兽企业重金招聘Python工程师标准>>> 前言 事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原 ...

  5. 《写给大家看的设计书》《写给大家看的色彩书》《点石成金》《形式感》学习笔记...

    为什么80%的码农都做不了架构师?>>>    首发:个人博客,更新&纠错&回复 今天读了四本书<写给大家看的设计书><写给大家看的色彩书>& ...

  6. 《写给大家看的设计书》《写给大家看的色彩书》《点石成金》《形式感》学习笔记

    首发:个人博客,更新&纠错&回复 今天读了四本书<写给大家看的设计书><写给大家看的色彩书><点石成金>和<形式感>,学习学习设计. 笔 ...

  7. 模仿SpringMVC的DispatcherServlet 手撸300行代码提炼精华设计思想并保证功能可用(1.0版本)

    前言 1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 3.内容为手写SpringMVC的DistapcherServlet的核心功能,从V1版本到V2版本再到 ...

  8. 微服务架构设计实践系列之三:软件架构设计思想

    微服务架构设计实践 目    次 1 序言 2 微服务 3 软件架构设计思想 4 微服务架构设计实践 4.1 项目概述 4.2 架构准备阶段 4.3 概念架构阶段 4.4 细化架构阶段 4.4.1 业 ...

  9. vuex系列--浅析Vuex 的设计思想

    一.前言 在聊之前,大家要始终记得一句话:一切前端概念,都是纸老虎. 不管是Vue,还是 React,都需要管理状态(state),比如组件之间都有共享状态的需要.什么是共享状态?比如一个组件需要使用 ...

最新文章

  1. mysql删除重复sql_mysql中删除完全重复数据的准确SQL语句
  2. 【POJ - 3281】Dining(拆点建图,网络流最大流)
  3. 20171108 模拟题 T1
  4. AttemptID:attempt_1557891872692_0001_r_000000_0 Timed out after 3600 secs
  5. 关于在IBatis中返回DataSet
  6. numpy矢量化运算
  7. nanomsg项目实战
  8. 短时傅里叶变换(Short Time Fourier Transform)
  9. Cacti之交换机端口无法正常显示
  10. python基于requests库实现12306火车票余票信息以及票价信息查询
  11. 鸿蒙断更术辰东,唐家三少说出《圣墟》断更真相,这次不怪辰东,网文将大范围断更...
  12. 性能测试分析软件汇总–开源、商业全部收集
  13. 安洵杯 --writeup
  14. Panda3D学习 (1):小行星示例程序
  15. CCD视觉应用上有哪些优势
  16. OpenCV视频质量诊断----视频遮挡诊断
  17. 【Java】Date类型获取年月日时分秒的两种方法(12小时制、24小时制)
  18. 计算机网络的发展历史
  19. 第一次接python私活,就被骗了···表弟让我再也别接私活了
  20. 网页字体助手 WebFont Helper

热门文章

  1. 移动端屏幕自适应布局
  2. 关于 移动端 页面跳转的方赞
  3. MinGW下静态编译、链接Qt 5.0
  4. vs2008生成安装部署文件的步骤
  5. Google code 100个开源项目
  6. python dlib学习(四):单目标跟踪
  7. Gabor滤波器的特征提取C++实现
  8. opencv摄像头 vmware虚拟机出现select timeout
  9. mysql创立不了数据库_以下不属于MySQL安装时自动创建的数据库是( ) (5.0分)_学小易找答案...
  10. 计算机网络工作组英文,十进制网络标准工作组:IPv4,IPv6,IPv9三代协议比较