手写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 ...
随机推荐
- 《Python学习手册 第五版》 -第5章 数值类型
本章是承接第四章整体说明之后,将对”数值类型“展开详细的说明 数值类型这一章主要通过一下几个内容来讲解: 1.数值类型有哪些? 2.表达式运算符:有哪些?有什么规范? 3.数值的显示格式 接下来,从第 ...
- Redis(九):主从复制的设计与实现解析
前面几篇我们已经完全理解了redis的基本功能的实现了. 但单靠基本功能实现,往往还是称不上优秀的项目的.毕竟,我们现在面对的都是复杂的环境,高并发的场景,大数据量的可能. 简而言之,现在的系统一般都 ...
- Go语言实现:【剑指offer】矩阵中的路径
该题目来源于牛客网<剑指offer>专题. 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...
- 将Spring实战第5版中Spring HATEOAS部分代码迁移到Spring HATEOAS 1.0
最近在阅读Spring实战第五版中文版,书中第6章关于Spring HATEOAS部分代码使用的是Spring HATEOAS 0.25的版本,而最新的Spring HATEOAS 1.0对旧版的AP ...
- 由lwip的mbox中netbuf传递看指针的指针
如果使用netconn API的话,udp接收过程需要用到mbox传递接收的包(传递的是指针) mbox发送过程: api_msg.c中recv_udp中会将接收的包发送给udp的接收mbox sys ...
- LVM知识梳理
1 LVM介绍 LVM即logical volume manager逻辑卷管理,其主要特点是:可以动态地扩大和缩小分区大小,但前提是分区的文件系统必须是LVM格式的,lvm的实现需要安装lvm2软件包 ...
- Error serializing object:序列化对象时出错
序列化对象时出错 :Error serializing object. Error serializing object. Cause: java.io.NotSerializableExceptio ...
- Java集合效率问题
凑算式 B DEFA + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A~I代表1~9的数字,不同的字母代表不同的数字. 比如:6+8/3 ...
- BFC的语法
先说一下什么是BFC(Block Formatting Contexts) BFC:块级格式化上下文(独立的渲染区).通俗的说是块级元素布局逻辑或规则,想要触发BFC就要是块级元素,要不把它转为块级元 ...
- Android中点击按钮获取星级评分条的评分
场景 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改为Lin ...