手写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 ...
随机推荐
- CentOS8 上安装Docker
从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE.Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需 ...
- Go语言实现:【剑指offer】孩子们的游戏
该题目来源于牛客网<剑指offer>专题. 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的 ...
- LeetCode 126. Word Ladder II 单词接龙 II(C++/Java)
题目: Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transfo ...
- javascript Worker子线程
main.js code: //创建 var worker = new Worker("./worker.js"); //发送 worker.postMessage(1); //接 ...
- DeBug Python神级工具PySnooper
安装 pip3 install pysnooper import pysnooper @pysnooper.snoop() def number_to_bits(number): if number: ...
- 【算法总结】图论/dp-动态规划 大总结
写于一只蹲在角落的蒟蒻-Z__X... 2020.2.7,图论和 \(dp\) 终于告一段落.蓦然回首,好似已走过许多...不曾细细品味,太多太多又绵延不断地向我涌来... 谨以此纪念 逝去 的图论和 ...
- AMD R2600+微星B450迫击炮配置的新工作机,分享给大家
上个月,突然觉得自己总做用的电脑有点老了,虽然很不舍陪自己战斗了3,4年的老战士,下了很大的决心,才决定搞一台新的吧,虽然新电脑的配置也不算非常高,但是用于开发的话,也算不错的选择了,特此分享一下.又 ...
- go实现java虚拟机02
上一篇通过flag包实现了命令行参数的解析,其实就是将输入的参数保存到一个结构体中,上一篇说过的例如java -classpath hello.jar HelloWorld这种命令,那么HelloWo ...
- springboot 后台框架平台 mybatis 集成代码生成器 shiro 权限 websocket
1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...
- 14.Android-使用sendMessage线程之间通信
1.Handler介绍 Handler 是一个消息分发对象.handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,通过它可以实现在不同线程之间传递消息 本章Handle ...