手写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对象,执行JDBC操作。StatementHandler的实现类有PreparedStatementHandler、CallableStatementHandler、SimpleStatementHandler。此处应用了策略模式,每个实现类提供了不同的策略。
ParameterHandler
参数处理器,将参数信息添加到statement中
ResultHandler
对结果ResultSet进行处理,转化成List<Object>
手写mybatis框架笔记的更多相关文章
- 要想精通Mybatis?从手写Mybatis框架开始吧!
1.Mybatis组成 动态SQL Config配置 Mapper配置 2.核心源码分析 Configuration源码解析 SqlSessionFactory源码解析 SqlSession源码解析 ...
- 手写mybatis框架-增加缓存&事务功能
前言 在学习mybatis源码之余,自己完成了一个简单的ORM框架.已完成基本SQL的执行和对象关系映射.本周在此基础上,又加入了缓存和事务功能.所有代码都没有copy,如果也对此感兴趣,请赏个Sta ...
- 手写mybatis框架
前言 很久没有更新mybatis的源码解析了,因为最近在将自己所理解的mybatis思想转为实践. 在学习mybatis的源码过程中,根据mybatis的思想自己构建了一个ORM框架 .整个代码都是自 ...
- 手写MyBatis ORM框架实践
一.实现手写Mybatis三个难点 1.接口既然不能被实例化?那么我们是怎么实现能够调用的? 2.参数如何和sql绑定 3.返回结果 下面是Mybatis接口 二.Demo实现 1.创建Maven工程 ...
- MyBatis 框架笔记
Mybatis 框架笔记 ------技术源于热爱! 获取更多内容请关注小编的个人微信公众平台 1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jd ...
- 手写Spring框架,加深对Spring工作机制的理解!
在我们的日常工作中,经常会用到Spring.Spring Boot.Spring Cloud.Struts.Mybatis.Hibernate等开源框架,有了这些框架的诞生,平时的开发工作量也是变得越 ...
- 带码农《手写Mybatis》进度3:实现映射器的注册和使用
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- Spring 08: AOP面向切面编程 + 手写AOP框架
核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...
- 手写 jQuery 框架
1.测试页面; <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
随机推荐
- sqlserver install on linux chapter one
Hello The MS open the source to let people download source. You may ask where to download ? Ask goog ...
- ajax实现文本框的联想功能
先写一个jsp通过ajax传值给servlet进行查询再传给对应的div进行显示. <%@ page language="java" contentType="te ...
- 云服务器InfluxDB & Chronograf配置
环境: 阿里云服务器 Ubuntu 18.04.3 LTS InfluxDB 1.7.10 (截至2020.2.20最新版) chonograf 1.8.0 (2020.2.19推出) 配置建议: 不 ...
- 【Java并发工具类】CountDownLatch和CyclicBarrier
前言 下面介绍协调让多线程步调一致的两个工具类:CountDownLatch和CyclicBarrier. CountDownLatch和CyclicBarrier的用途介绍 CountDownLat ...
- react项目中引用amap(高德地图)坑
最近在写一个react项目,用到了需要定位的需求,于是乎自己决定用高德地图(AMap),但是react官方文档的案列很少,大多都是原生JS的方法. 在调用amap的 Geocoder Api 时,一直 ...
- ELF文件之七——使用链接脚本-2个函数-data-bss-temp-call
main.c int enable; ; int main() { int temp; add(); ; } int add() { ; } o反汇编的地址都是0起始,elf的地址都是映射后的地址. ...
- Samba搭建Linux和Windows文件共享服务
一.Samba简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共享 ...
- [Python]Bytes 和 String转换
#----string to bytes------ # 方法一:直接复制bytes类型 b'<str>' b = b'Hello World' print(type(b)) print( ...
- pycharm创建Django项目时报 AttributeError:'module' object has no attrbute 'main' 错误或者创建了就只有venv一个目录
这是因为创建项目时候没有选择合适的项目环境. 所以在创建项目的时候选择一下项目的环境,比如选择python的运行环境 这时候创建的项目就不再报 AttributeError:'module' obje ...
- webpack之打包分析以及prefetching和preloading
打包分析: https://webpack.js.org/guides/code-splitting/#bundle-analysis 性能优化使用缓存是很有限的,现在更多的应该是再编写 ...