【手写系列】透彻理解MyBatis设计思想之手写实现
前言
MyBatis,曾经给我的感觉是一个很神奇的东西,我们只需要按照规范写好XXXMapper.xml以及XXXMapper.java接口。要知道我们并没有提供XXXMapper.java的实现类,MyBatis到底是怎么做到这一点的呢?有人会说是动态代理,现在我就来通过手写一个迷你版的MyBatis来彻底理解它的设计思想!
如果你不了解JDK动态代理,请参考:《纯手写实现JDK动态代理》
如果你不了解MyBatis的使用,请参考:《MyBatis+Spring MVC开发指南(一)》
如果你对Spring MVC感兴趣,请参考:《写出我的第一个框架:迷你版Spring MVC》
动手写一个迷你版的MyBatis
其实对于MyBatis最为关键的就在于:
XXXMapper mapper = sqlSession.getMapper(XXXMapper.class);
大家可以以这个为切入口,进行源码跟踪,容易得到上面的调用链。
我们先来看一下迷你版MyBatis的整体框架思路:
执行器MyExecutor:
在MyBatis中,比如说select有多种形式,比如selectOne,selectList,那么其实到最后,还是向JDBC发出一个SQL而已。对于执行器而言,其实对于查询,提供一个query接口就可以了。
这里,为了简便,直接执行已经处理好的SQL语句(动态SQL以及输入类型,这不是迷你版MyBatis关心的)。另外执行器的实现类MyBaseExecutor其实就是一段JDBC的操作代码。
这里为了简化处理,在RequestMapping这块硬编码了。
StudentMapper.java/StudentMapper.xml:
这里,为了不牵涉到XML的解析过程,直接提供已经处理完毕的结果。其实就是namespace/statementID/SQL的存储、映射。
对外暴露的API接口(MySqlSession):
从这里,你能够看到一些端倪:
第一,MyDefaultSqlSession持有执行器的引用,调用selectOne等方法,就是在调用执行器的query方法。
第二,在getMapper的获取过程中,我们看到了具体业务处理Handler的身影:MyMapperProxy,根据JDK动态代理的知识,我们知道,最终都是要回调Handler的invoke方法完成的。
MyMapperProxy:
当invoke方法被调用时,我们根据调用的方法,进行反射,得到namespace以及对应的SQL,然后,我们把SQL交给sqlSession进行执行即可。
启动测试类Bootstrap:
看到没有,我们完全通过自己的类,自己的理解,去实现了和MyBatis一样的功能!
OK,一个迷你版的MyBatis就竣工了,有一种油然而生的成就感,哈哈~
手写系列相关爆文
【手写系列】写出我的第一个框架:迷你版Spring MVC
【手写系列】透彻理解Spring事务设计思想之手写实现
【手写系列】纯手写实现一个高可用的RPC
【手写系列】理解数据库连接池底层原理之手写实现
【手写系列】对HashMap的思考及手写实现
【手写系列】纯手写实现JDK动态代理
【手写系列】写一个迷你版的Tomcat
作者:张丰哲
链接:https://www.jianshu.com/p/73ee8caddc68
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
【手写系列】透彻理解MyBatis设计思想之手写实现相关推荐
- 【手写系列】透彻理解Spring事务设计思想之手写实现
事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Dura ...
- 【手写系列】理解数据库连接池底层原理之手写实现
前言 数据库连接池的基本思想是:为数据库连接建立一个"缓冲池",预先在池中放入一定数量的数据库连接管道,需要时,从池子中取出管道进行使用,操作完毕后,再将管道放入池子中,从而避免了 ...
- 【手写系列】对HashMap的思考及手写实现
前言 HashMap是Java中常用的集合,而且HashMap的一些思想,对于我们平时解决业务上的一些问题,在思路上有帮助,基于此,本篇博客将分析HashMap底层设计思想,并手写一个迷你版的Hash ...
- 透彻理解Spring事务设计思想之手写实现
2019独角兽企业重金招聘Python工程师标准>>> 前言 事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原 ...
- 《写给大家看的设计书》《写给大家看的色彩书》《点石成金》《形式感》学习笔记...
为什么80%的码农都做不了架构师?>>> 首发:个人博客,更新&纠错&回复 今天读了四本书<写给大家看的设计书><写给大家看的色彩书>& ...
- 《写给大家看的设计书》《写给大家看的色彩书》《点石成金》《形式感》学习笔记
首发:个人博客,更新&纠错&回复 今天读了四本书<写给大家看的设计书><写给大家看的色彩书><点石成金>和<形式感>,学习学习设计. 笔 ...
- 模仿SpringMVC的DispatcherServlet 手撸300行代码提炼精华设计思想并保证功能可用(1.0版本)
前言 1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 3.内容为手写SpringMVC的DistapcherServlet的核心功能,从V1版本到V2版本再到 ...
- 微服务架构设计实践系列之三:软件架构设计思想
微服务架构设计实践 目 次 1 序言 2 微服务 3 软件架构设计思想 4 微服务架构设计实践 4.1 项目概述 4.2 架构准备阶段 4.3 概念架构阶段 4.4 细化架构阶段 4.4.1 业 ...
- vuex系列--浅析Vuex 的设计思想
一.前言 在聊之前,大家要始终记得一句话:一切前端概念,都是纸老虎. 不管是Vue,还是 React,都需要管理状态(state),比如组件之间都有共享状态的需要.什么是共享状态?比如一个组件需要使用 ...
最新文章
- mysql删除重复sql_mysql中删除完全重复数据的准确SQL语句
- 【POJ - 3281】Dining(拆点建图,网络流最大流)
- 20171108 模拟题 T1
- AttemptID:attempt_1557891872692_0001_r_000000_0 Timed out after 3600 secs
- 关于在IBatis中返回DataSet
- numpy矢量化运算
- nanomsg项目实战
- 短时傅里叶变换(Short Time Fourier Transform)
- Cacti之交换机端口无法正常显示
- python基于requests库实现12306火车票余票信息以及票价信息查询
- 鸿蒙断更术辰东,唐家三少说出《圣墟》断更真相,这次不怪辰东,网文将大范围断更...
- 性能测试分析软件汇总–开源、商业全部收集
- 安洵杯 --writeup
- Panda3D学习 (1):小行星示例程序
- CCD视觉应用上有哪些优势
- OpenCV视频质量诊断----视频遮挡诊断
- 【Java】Date类型获取年月日时分秒的两种方法(12小时制、24小时制)
- 计算机网络的发展历史
- 第一次接python私活,就被骗了···表弟让我再也别接私活了
- 网页字体助手 WebFont Helper
热门文章
- 移动端屏幕自适应布局
- 关于 移动端 页面跳转的方赞
- MinGW下静态编译、链接Qt 5.0
- vs2008生成安装部署文件的步骤
- Google code 100个开源项目
- python dlib学习(四):单目标跟踪
- Gabor滤波器的特征提取C++实现
- opencv摄像头 vmware虚拟机出现select timeout
- mysql创立不了数据库_以下不属于MySQL安装时自动创建的数据库是( ) (5.0分)_学小易找答案...
- 计算机网络工作组英文,十进制网络标准工作组:IPv4,IPv6,IPv9三代协议比较