当前位置: 首页 > news >正文

Mybatis源码剖析---第二讲

Mybatis源码剖析—第二讲

那我们在讲完了mappedstatement这个类,它的一个核心作用之后呢?那下面我有一个问题想问问各位。作为mappedstatement来讲,它封装的是一个select标签或者insert标签。但是呢,我们需要大家注意的是什么?在我们开发的过程当中啊,这些我们所写的。select标签也好,还有insert标签儿,update标签儿delay的标签也罢,那么除了它标签儿上的这些内容之外。实际上,我们说它还有一个很重要的东西,
这个东西是什么呢?sql语句。哎,不管是insert标签当中的这个insert into的这条sql,还是我们所说的查询当中的这些select的sqk?那你会发现,作为这些标签,里面是不是都有这个SQL的封装啊?那么,作为这个sql的封装?它在mybatis源码当中是以什么形式来体现的呢?那首先我们大家可以确定的是什么呀?就是一切皆对象,什么最终都会被封装成对象的形式,

在这里插入图片描述
在这里插入图片描述
SQL语句,它一定是string类型的,但是它并没有。仅仅用一个string单独代表这个sql,而是把这个sql怎么着封装在了这个类里。那当然,我们说与sql相关的还有什么?那显然还有它的相关的参数。因为我们知道后续我们在写sql的时候,它一定不是简单的说select from, 它一定会带上相关参数,将这些统一封装成BoundSql类 从属于Mappedstatement, 这个秉承着责任单一,各司其职的面向对象的设计方式
就目前理解而言 : SqlSession封装JDBC,操作MappedStatement,其实并非这样

在这里插入图片描述
操作里包含了,查和改,改包括了增,删,改,还有处理缓存,这些操作由Executor实现,为什么设计成接口呢,根据设计原则来说,操作相关的类型都要设计成接口
在这里插入图片描述
它的设计也是这样,查看子类快捷键 ctrl + alt + B ,我们回到Executor类,

在这里插入图片描述
这个BaseExecute实际上是这个Execute的一个适配器,实现了一些基本功能,这三个才是最核心的
在这里插入图片描述

操作类对象 (SqlSession) ---> 门面 ExcutorExcutor 是Mybatis中处理功能的核心1. 增删改update  查query2. 事务操作 提交 回滚3. 缓存相关的操作Excutor接口 (适配器模式) 操作相关都要设计成接口BatchExcutorJDBC中批处理的操作, BatchExcutor ReuseExcutor目的:复用 Statement (需要sql一样)insert into t_user(ID,name)values(1,‘name1’);insert into t_user(ID,name)values(2,‘name2’);SimpleExcutor常用Excutor Mybatis推荐 默认 Configuration protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;

在这里插入图片描述
为什么需要批处理呢,因为每次connect连接操作系统都会消耗资源
在这里插入图片描述
现在我们知道了,executor是完成操作的。但其实真正完成数据库操作的是statementhandler。那为什么不能把这个executor给省略了,直接用statementhandler呢?还是我们所说的。单一职责的问题
executor他做了三件事。第一件事是增删改。也就是与数据库的。操作那除此之外,它是不是还有事物的控制?它是不是还有缓存的操作 所以实际上executor他做的是三件最主要的工作。那后续它之所以在这样的封装的原因是它把其中的第一部分操作。由statementhandler来进行工作。

在这里插入图片描述

采用了适配器模式StatmentHandlerStatementHandler是Mybatis封装了JDBC Statement,真正Mybatis进行数据库访问操作的核心功能:增删改差StatementHandler接口SimpleStatementHandlerJDBC 操作 PreparedStatementHandlerCallableStatementHandler ParameterHandler目的:Mybatis参数 ---》 JDBC 相关的参数 @Param ---> #{} --- > ?ResultSetHandler目的:对JDBC中查询结果集 ResultSet 进行封装 TypeHandlerJava程序操作 数据库Java类型   数据库类型String    varcharint       numberint       int excutor和statementhandler都用到了适配器模式

至此,我们总结一下

executor就是SqlSesson的一种实现,一种执行
在这里插入图片描述
跳到实现类中
在这里插入图片描述
然后executor可以进行对数据库进行操作,对缓存进行处理,对事务进行操作,具体对数据库的操作由statementhandler来做,通过parameterhandler进行参数处理,resultsethandler进行数据库的返回,相关类型由typehandler来进行控制,statementhandler封装了statement,resultsethandler封装了resuletset,至此我们流程就通了
在这里插入图片描述
点进去
在这里插入图片描述
跳到实现类
在这里插入图片描述
在这里插入图片描述
进行重载
在这里插入图片描述
在这里插入图片描述
交给executor进行执行,点击update方法继续往下深入
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

至此我们这个流程算是完成了,和我们的结论一一印证了
在这里插入图片描述
我们为什么说第一种是代理设计模式呢,因为 UserDAO userDAO = sqlSession.getMapper(UserDAO.class); 我们并没有创建接口的实现类,但userDAO的确是一个子类,让我们瞧瞧
在这里插入图片描述
这个动态代理如何实现的呢,我们下一节来讲解

相关文章:

  • 【Java面试】一、Redis篇(上)
  • 链表-设计LRU缓存结构
  • uni-app App端实现文字语音播报(Ba-TTS)
  • PTA 6-4 配对问题
  • 如何参与github开源项目并提交PR
  • Linux下环境变量配置出错导致基础命令使用不了的问题解决
  • 抖音分享链接视频下载
  • [Algorithm][动态规划][简单多状态DP问题][按摩师][打家劫舍Ⅱ][删除并获得点数][粉刷房子]详细讲解
  • 手机相册的照片彻底删除了怎么恢复?删除照片恢复的5种方法
  • 甘肃教育杂志社-甘肃教育编辑部
  • CSP俄罗斯方块(简单易懂)
  • C语言笔记21 •模拟atoi函数•
  • conda常见命令
  • 汽车R155法规中,汽车获取到的VTA证书,E后面的数字表示什么意思?
  • MySQL入门学习-查询进阶.别名
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • angular学习第一篇-----环境搭建
  • CentOS7简单部署NFS
  • Computed property XXX was assigned to but it has no setter
  • const let
  • Consul Config 使用Git做版本控制的实现
  • Flannel解读
  • IOS评论框不贴底(ios12新bug)
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Promise面试题2实现异步串行执行
  • select2 取值 遍历 设置默认值
  • Shell编程
  • Spring Boot MyBatis配置多种数据库
  • 电商搜索引擎的架构设计和性能优化
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 聚类分析——Kmeans
  • 提醒我喝水chrome插件开发指南
  • 跳前端坑前,先看看这个!!
  • 微信小程序填坑清单
  • 2017年360最后一道编程题
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ## 基础知识
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #每日一题合集#牛客JZ23-JZ33
  • (2022 CVPR) Unbiased Teacher v2
  • (3) cmake编译多个cpp文件
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (七)理解angular中的module和injector,即依赖注入
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十三)MipMap
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET开源项目介绍及资源推荐:数据持久层
  • @Autowired注解的实现原理
  • @GlobalLock注解作用与原理解析