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流程的更多相关文章

  1. 手写mybatis框架笔记

    MyBatis 手写MyBatis流程 架构流程图 封装数据 封装到Configuration中 1.封装全局配置文件,包含数据库连接信息和mappers信息 2.封装*mapper.xml映射文件 ...

  2. 要想精通Mybatis?从手写Mybatis框架开始吧!

    1.Mybatis组成 动态SQL Config配置 Mapper配置 2.核心源码分析 Configuration源码解析 SqlSessionFactory源码解析 SqlSession源码解析 ...

  3. 手写MyBatis ORM框架实践

    一.实现手写Mybatis三个难点 1.接口既然不能被实例化?那么我们是怎么实现能够调用的? 2.参数如何和sql绑定 3.返回结果 下面是Mybatis接口 二.Demo实现 1.创建Maven工程 ...

  4. 手写mybatis框架-增加缓存&事务功能

    前言 在学习mybatis源码之余,自己完成了一个简单的ORM框架.已完成基本SQL的执行和对象关系映射.本周在此基础上,又加入了缓存和事务功能.所有代码都没有copy,如果也对此感兴趣,请赏个Sta ...

  5. 带码农《手写Mybatis》进度3:实现映射器的注册和使用

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  6. 《手写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 ...

  7. Mybatis执行流程学习之手写mybatis雏形

    Mybatis是目前开发中最常用的一款基于ORM思想的半自动持久层框架,平时我们都仅仅停留在使用阶段,对mybatis是怎样运行的并不清楚,今天抽空找到一些资料自学了一波,自己写了一个mybatis的 ...

  8. 从零搭建Spring Boot脚手架(4):手写Mybatis通用Mapper

    1. 前言 今天继续搭建我们的kono Spring Boot脚手架,上一文把国内最流行的ORM框架Mybatis也集成了进去.但是很多时候我们希望有一些开箱即用的通用Mapper来简化我们的开发.我 ...

  9. 手写Mybatis和Spring整合简单版示例窥探Spring的强大扩展能力

    Spring 扩展点 **本人博客网站 **IT小神 www.itxiaoshen.com 官网地址****:https://spring.io/projects/spring-framework T ...

随机推荐

  1. num12---组合模式

    案例描述: 学校下有多个学院,每个学院下有多个专业系. 把学校.院系.专业  全都看成某个组织类型,含有添加add方法,删除remove方法,显示print方法. 如果有新增的院系.专业,新增加对应的 ...

  2. BurpSuite--代理和浏览器设置

    上一篇文章我们完成了JAVA环境的搭建和burpsuite的安装,接下来请大家和我一起一步一步的完成burpsuite的代理和浏览器的相关设置. 关注“白帽技术与网络安全”获取安装包 1.设置浏览器代 ...

  3. CyclicBarrier与CountDownLatch区别

    阻塞与唤醒方式的区别 CountDownLatch计数方式 CountDownLatch是减计数.调用await()后线程阻塞.调用countDown()方法后计数减一,当计数为零时,调用await( ...

  4. javascript Worker子线程

    main.js code: //创建 var worker = new Worker("./worker.js"); //发送 worker.postMessage(1); //接 ...

  5. 软件bug描述(android)

    1.bug主题:主要操作+bug主题 主题要简单明了,即开发一看主题就知道该问题. 2.描述: 作用:便于开发重现和定位缺陷的 2.1前置条件 2.2操作步骤 2.3预期结果 2.4实际结果 2.5备 ...

  6. js 细节

    1.js中var a=s=1和var a=1,s=1的区别 function fl() { ; } function fl1() { , s = ; } 看出问题所在了吗? var q=w=1 中的s ...

  7. 加密算法极先锋之MD5算法

    在开发过程中,避免不了要涉及到数据加密,比如用户账号密码的加密,用户敏感数据的加密,涉及到的加密算法种类繁多,作为拿来主义的开发者时间精力有限,能够清楚其中主流的加密算法和用途,就已经足够了. 主要的 ...

  8. 寒假答辩作品:Java小游戏

    目录 java入门小游戏[test] 游戏界面 前言 (可直接跳到程序介绍) 前期入门小项目 前期收获 后期自创关卡 后续 java入门小游戏[test] 游戏界面 github地址: https:/ ...

  9. Linux监控-历史细项数据回溯

    Linux监控数据回溯 网络服务监控 应用场景: lvs 后端内网端机器网络波动监控: nginx 80.443端口连接监控: mysql 连接监控 以上为抛砖引玉,根据环境安装到监控工具(open ...

  10. 移动app

    什么是移动App开发[重点] 苹果上的软件是如何开发出来的:使用IOS平台的开发工具和开发语言进行设计开发的!苹果上的开发语言:OC.Swift 安卓平台上的软件又是如何开发出来的:使用Java这么语 ...