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对象,执行JDBC操作。StatementHandler的实现类有PreparedStatementHandler、CallableStatementHandler、SimpleStatementHandler。此处应用了策略模式,每个实现类提供了不同的策略。

ParameterHandler

参数处理器,将参数信息添加到statement中

ResultHandler

对结果ResultSet进行处理,转化成List<Object>

手写mybatis框架笔记的更多相关文章

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

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

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

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

  3. 手写mybatis框架

    前言 很久没有更新mybatis的源码解析了,因为最近在将自己所理解的mybatis思想转为实践. 在学习mybatis的源码过程中,根据mybatis的思想自己构建了一个ORM框架 .整个代码都是自 ...

  4. 手写MyBatis ORM框架实践

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

  5. MyBatis 框架笔记

    Mybatis 框架笔记   ------技术源于热爱! 获取更多内容请关注小编的个人微信公众平台 1       Mybatis入门 1.1     单独使用jdbc编程问题总结 1.1.1  jd ...

  6. 手写Spring框架,加深对Spring工作机制的理解!

    在我们的日常工作中,经常会用到Spring.Spring Boot.Spring Cloud.Struts.Mybatis.Hibernate等开源框架,有了这些框架的诞生,平时的开发工作量也是变得越 ...

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

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

  8. Spring 08: AOP面向切面编程 + 手写AOP框架

    核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...

  9. 手写 jQuery 框架

    1.测试页面; <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

随机推荐

  1. HDU6440 Dream(费马小定理+构造) -2018CCPC网络赛1003

    题意: 给定素数p,定义p内封闭的加法和乘法,使得$(m+n)^p=m^p+n^p$ 思路: 由费马小定理,p是素数,$a^{p-1}\equiv 1(mod\;p)$ 所以$(m+n)^{p}\eq ...

  2. oracle查询表空间的空间占用情况

    ,) percent_used from (select tablespace_name,sum(bytes) bytes from dba_data_files group by tablespac ...

  3. CentOS 6.4安装mongo的php扩展包

    最近安装mongo相关内容,因mongodb下载好解压即可使用,在这里我就不多说了,这里我分享下如何安装mongo的php扩展 首先下载扩展包https://github.com/mongodb/mo ...

  4. ISO14229系列之二:诊断指令格式和相关概念

    作者:autogeek 原文链接:http://www.cnblogs.com/autogeek/p/4458658.html 1. 简单的通信机制 其实诊断通信的机制很简单,可以类比client-s ...

  5. 修改centos7容器的时间和宿主机时间一致

    一.问题 centos7系统容器时间与宿主机系统时间不一致,就进去查看一番,发现时区和宿主机上的时间不一致,下面就来解决一下 二.现象 1.查看centos宿主机的时间 输入如下命令查看 # date ...

  6. 利用预测分析改进欠款催收策略,控制欺诈风险和信贷风险—— Altair Knowledge Studio 预测分析和机器学习

    前提摘要 在数字经济新时代,金融服务主管正在寻求方法去细分他们的产品和市场,保持与客户的联系,寻找能够推动增长和收入的新市场,并利用可以增加优势和降低风险的新技术. 在拥有了众多可用数据之后,金融机构 ...

  7. 将jsp页面转化为图片或pdf升级版(二)(qq:1324981084)

    java高级架构师全套vip教学视频,需要的加我qq1324981084 上面我们已经将jsp页面转化成html页面了,那么接下来我们的目标是利用这个html页面形成pdf或图片格式.这里我用到的是w ...

  8. Go 1.14 中 Cleanup 方法简介

    目录 一般的测试 使用 defer 清除依赖 使用 Cleanup 关于t.Parallel 总结 原文:What's New In Go 1.14: Test Cleanup 单元测试通常遵循某些步 ...

  9. 手把手教你快速使用数据可视化BI软件创建互联网用户数据分析大屏

    灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件.   本文以互联网用户数据分析大屏为 ...

  10. StarUML之五、StarUMl中Formatting Diagram-格式化图

    这章比较简单,主要是对视图元素的样式调整 主要是在视图元素右下角设置,可以修改视图元素的相关样式 字体样式 颜色 链接线样式 对齐样式 Stereotype Display-视图元素的样式属性 菜单F ...