手写MyBatis流程
MyBatis
手写MyBatis流程
架构流程图

封装数据
封装到Configuration中
1、封装全局配置文件,包含数据库连接信息和mappers信息
2、封装*mapper.xml映射文件
封装操作:Builder类
Builder类用来操作配置文件(全局配置文件和mapper映射文件),将配置数据封装到类中。
XmlConfigBuilder
提供parse方法将dataSource信息封装到Configuration
XmlMapperBuilder
提供parse方法将mapper.xml信息封装到Configuration
XmlStatementBuilder
提供parse方法封装MappedStatement信息(此处应用了创建者模式)
XmlScriptBuilder
提供parse方法封装SqlNode信息
数据封装类:
Configuration
封装DataSource和MappedStatement
注意:在Configuration中还提供了创建四大组件的功能!!!
DataSource
封装了连接数据库所需的四大属性:数据库驱动、url、username、passwrod
MappedStatement
每一个CRUD标签都对应一个MappedStatement,其中包含了标签类型(StatementType)、参数类型(ParameterType)、结果类型(ResultType)、Sql文本包装类(SqlSource)
SqlSource
此接口只是对SqlNode做了一些包装,并提供getBound方法,用来获取sql文本和参数列表
1、StaticSqlSource
包含已经解析过的sql文本和参数信息(名称和类型)列表
2、RawSqlSource
用来封装只包含#{}的SqlNode
在其构造方法中,实现了以下操作:
(1)调用SlqNode的apply方法,拼接sql文本
(2)将#{}替换成?
(3)生成StaticSqlSource
在其getBound方法中,实现了以下操作:
将构造参数中生成的StaticSqlSource转化成BoundSql
2、DynamicSqlSource
用来封装包含${}的SqlNode,在getBound方法中,实现了以下操作:
(1)调用SlqNode的apply方法,拼接sql文本
(2)将#{}替换成?
(3)生成BoundSql
注意:因为含有${},解析时需要替换成参数值,所以每次传入不同的参数,都需要调用此方法,重新生成可执行的sql。
SqlNode
不同的SqlNode实现封装了不同类型的Sql文本,并提供了apply方法,用来将sql文本拼接到全局变量DynamicContext中
遍历mapper.xml文件,将不同的Node封装到不同的SqlNode实现类中。
1、StaticSqlNode
用来封装只包含#{}的sql文本。
2、TextSqlNode
用来封装包含${}的sql文本。并在其apply方法中解析了${},将${}替换成相应的参数值。
3、IfSqlNode
用来封装If标签的sql文本。
4、MixSqlNode
用来封装SqlNode集合。并在其apply方法中遍历了集合,并调用了每个元素的apply方法。(此处用到了组合模式)
如下mapper.xml文件对应的SqlNode:
mapper.xml映射文件:
对应生成的MixedSqlNode:

BoundSql
封装JDBC可执行的sql文本和参数信息(参数名、参数类型)列表
执行JDBC
SqlSession
提供CRUD方法,用户可以直接调用。
DefaultSqlSession
SqlSessionFactory
SqlSession工厂
DefaultSqlSessionFactory
SqlSessionFactoryBuilder(构建者模式)
用configuration创建SqlSession????
JDBC四大组件
Executor
执行器,执行JDBC。其中涉及一级缓存和二级缓存。
BaseExecutor
实现了Executor接口,提供query方法,如果存在一级缓存,那么返回一级缓存的数据;如果不存在一级缓存,则从数据库查询
SimpleExecutor(应用了里氏替换原则)
继承了BaseExecutor,忽略了二级缓存的存在,直接从数据库查询数据。
CachingExecutor
继承了BaseExecutor,如果存在二级缓存,使用二级缓存,否则从数据库查询。
statementHandler(此处应用了策略模式)
创建statement对象,比如PreparedStatementHandler,执行JDBC操作。
ParameterHandler
参数处理器,将参数信息添加到statement中
ResultHandler
对结果ResultSet进行处理,转化成List
设计模式整理
组合模式
因为xml中的sql文本是以层级标签的形式组成的,所以通过递归调用生成了SqlNode树。
模板模式
工厂模式
构建者模式
代理模式
杂项
MyBatis分页插件
MyBatis常见面试题
手写MyBatis流程的更多相关文章
- 手写mybatis框架笔记
MyBatis 手写MyBatis流程 架构流程图 封装数据 封装到Configuration中 1.封装全局配置文件,包含数据库连接信息和mappers信息 2.封装*mapper.xml映射文件 ...
- 要想精通Mybatis?从手写Mybatis框架开始吧!
1.Mybatis组成 动态SQL Config配置 Mapper配置 2.核心源码分析 Configuration源码解析 SqlSessionFactory源码解析 SqlSession源码解析 ...
- 手写MyBatis ORM框架实践
一.实现手写Mybatis三个难点 1.接口既然不能被实例化?那么我们是怎么实现能够调用的? 2.参数如何和sql绑定 3.返回结果 下面是Mybatis接口 二.Demo实现 1.创建Maven工程 ...
- 手写mybatis框架-增加缓存&事务功能
前言 在学习mybatis源码之余,自己完成了一个简单的ORM框架.已完成基本SQL的执行和对象关系映射.本周在此基础上,又加入了缓存和事务功能.所有代码都没有copy,如果也对此感兴趣,请赏个Sta ...
- 带码农《手写Mybatis》进度3:实现映射器的注册和使用
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- 《手写Mybatis》第4章:Mapper XML的解析和注册使用
作者:小傅哥 系列:https://bugstack.cn/md/spring/develop-mybatis/2022-03-20-%E7%AC%AC1%E7%AB%A0%EF%BC%9A%E5%B ...
- Mybatis执行流程学习之手写mybatis雏形
Mybatis是目前开发中最常用的一款基于ORM思想的半自动持久层框架,平时我们都仅仅停留在使用阶段,对mybatis是怎样运行的并不清楚,今天抽空找到一些资料自学了一波,自己写了一个mybatis的 ...
- 从零搭建Spring Boot脚手架(4):手写Mybatis通用Mapper
1. 前言 今天继续搭建我们的kono Spring Boot脚手架,上一文把国内最流行的ORM框架Mybatis也集成了进去.但是很多时候我们希望有一些开箱即用的通用Mapper来简化我们的开发.我 ...
- 手写Mybatis和Spring整合简单版示例窥探Spring的强大扩展能力
Spring 扩展点 **本人博客网站 **IT小神 www.itxiaoshen.com 官网地址****:https://spring.io/projects/spring-framework T ...
随机推荐
- learn about sqlserver partitition and partition table 1
Dear all, Let get into business, the partitions on sql server is very different with that on oracle. ...
- 网络安全初级实战笔记(一):owasp zap 暴力破解
网络安全里装着好多人的侠客梦.但是不能触碰铁律,所以,只小小的自娱自乐. 自己练习,大都会用到DVWA,一个很好的安全测试平台,自己搭建(很简单,傻瓜式搭建),自己设置安全级别,自己验证各种漏洞攻击方 ...
- DNS 查询 - Domain Name Server
DNS 查询 - Domain Name Server socket.getaddrinfo("www.baidu.com",None) 返回时一个 tuple list - (f ...
- 由lwip的mbox中netbuf传递看指针的指针
如果使用netconn API的话,udp接收过程需要用到mbox传递接收的包(传递的是指针) mbox发送过程: api_msg.c中recv_udp中会将接收的包发送给udp的接收mbox sys ...
- Linux高级系统恢复技术
一,MBR毁坏: 查看系统分区在那: 毁坏MBR: 如果没有重启动,可以直接恢复: 如果重启之后就不可启动系统,需要恢复系统: 出现这样的情况: force off关机,使用光盘启动,添加一个镜像光盘 ...
- VueJs一步步实现带感的帮助面板
环境 IDE: WebStorm 2019.1.4 系统: Mac OS X 10.15.4 VueJs: 2.6.11 Vue-cli: 4.2.2 前言 最近一直在忙毕设,前端终于还是对我这个 ...
- MySQL中使用group by 是总是出现1055的错误
因为在MySQL中使用group by 是总是出现1055的错误,这就导致了必须去查看是什么原因了,查询了相关的资料,现在将笔记记录下来,以便后面可以参考使用: sql_mode:简而言之就是:它定义 ...
- (Hourglass)Windows倒计时软件 v1.9 电脑版
(Hourglass)Windows倒计时软件是一款电脑系统小工具,能帮助大家快速进行最新的电脑系统倒计时设计,你可以设置自己的关机时间,帮助大家更好的管理自己的电脑应用. 链接:https://pa ...
- web自动化之三大等待
这个假期有些长,长到忘记了要学习,要找工作,好吧,在我每天无休止的追着偶像剧时,我确实没有负罪感,在听了小祥大佬的分享后,我连睡午觉都被吓醒.大佬跟我同一个班,在大厂工作,每天还抽时间学习,作业也没落 ...
- P1843 奶牛晒衣服
链接:Miku -------------------------------- 这是一道二分答案的题,我们要二分时间. 对于每件衣服,我们自然是能让它自己蒸发就自己蒸发,这样才是最优的. 那么我闷可 ...