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

MyBatis源码解读2(2.1、核心对象)

二、MyBatis的核心对象

2.1、核心对象

2.1、MappedStatement

MyBatis其实是对JDBC的进一步封装,我们都知道JDBC有几个重要的对象:

  1. Statement
  2. Prepared Statement
  3. Callable Statement
  4. ResultSet

image-20230618182852840Statement、Prepared Statement、Callable Statement分别与数据与进行交互,最终执行返回的结果由ResultSet进行封装。而SqlSession是对上述步骤进行进一步的封装。

mybatis-config.xml最终被封装成了Configuration对象。我们点啊看iabatis的Configuration类可以发现,environment标签都封装在了Configuration这个类的Environment属性当中,而mapper.xml文件中的一个一个的标签一般会被封装在MappedStatement这个对象中,这就注定了一个Mybatis应用中会有N个MappedStatement对象。

image-20230618194011980

还有一个我们很常见的二级缓存的配置在Configuration类中也有对应的属性。我们可以发现他的默认值为true,所以这个属性我们写不写都可以,因为是默认开启的。

image-20230618194226910

而我们写别名的<typeAlioases>标签被mybatis封装成的对象是TypeAliasRegistry

image-20230618223437255

对于mapper.xml文件的注册,我们可以封装在<mappers>这个标签里面,而被mybatis封装的对象是loadedResources。

image-20230618223622443

而最重要的是写sql语句的mapper.xml文件,在Configuration对象中也做了汇总进行封装。

image-20230618223739810

那么此时问题来了,我们写在标签里面的sql语句最终会被封装到哪里了呢?因为sql语句是写在标签里面的,每一个标签都被封装成了一个个的MappedStatement对象,所以我们需要在MappedStatement对象里面去找。我们往下翻会发现一个getBoundSql方法。

image-20230622115532337

我们会发现他的返回值是叫一个BoundSql的对象,这个对象其实就是MyBatis对sql语句的封装。我们点进去看看这个对象,他有这么几个属性。我们来挨个分析一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. private final String sql:用于封装我们写的sql
  2. 其他的用于封装各种参数。

2.2、Executor

Executor是MyBatis中处理功能的核心,对应增删改Executor提供了对应的方法来执行这些操作。

我们打开源码可以发现,Executor是一个接口(一般涉及到操作相关的类型,尽量设计成接口),我们点住alt+7可以打开大纲,看看所有的方法。

image-20230622143227566

我们可以看到他主要有两类方法:

  1. update:对应的是sql中的增删改,只要是对于数据库有改动的操作都统一归为update
  2. query:对应的是sql中的查询操作。
  3. commit、rollback、getTransaction:与事务相关的操作,包括提交、回滚等。
  4. createCacheKey、isCached:与缓存相关的操作。

Executor接口有3个比较重要的实现:

  1. BatchExecutor:批处理操作,一次链接,执行多条sql。
  2. ReuseExecutor:复用Statement,只要你的sql一样,用的Statement就是一样的。这个Executor比较少用,因为我们很少执行同样的sql,同类型的sql哪怕参数不同都不叫一样的sql
  3. SimpleExecutor:最常用的Executor,也是MyBatis默认的Executor。

image-20230622153251883

2.3、StatementHandler

StatementHandler是MyBatis封装的JDBC的Statement,MyBatis访问数据库操作真正的核心。我们来看一下StatementHandler的源码。

image-20230622165215901

可以看到都是一些简单的增删改查操作。

2.4、ParamentHandler

ParamentHandlerd的作用是把处理参数,把MyBatis的参数替换成底层JDBC的参数。

2.5、ResultSetHandler

ResultSetHandler封装的是JDBC的ResultSet。他的作用是对JDBC中查询结果集ResultSet进行封装。

image-20230622170924560

2.6、TypeHandler

用于处理数据库类型与Java类型之间转换的过程。

2.7、总结

作为总结,我们就来简单的跟一下insert的源码。

SqlSession的insert方法。

image-20230622174401502

DefaultSqlSessionSession的insert方法,我们可以发现insert方法调用的其实是update方法。

image-20230622174442331

还是在DefaultSqlSessionSession同一个类中的update方法。

image-20230622174528602

接着走到了Executor的update方法,注意这个Executor是默认的SimpleExecutor

image-20230622174614909

http://www.xdnf.cn/news/5546.html

相关文章:

  • 【RP2350】香瓜树莓派RP2350之按键
  • B站取关脚本
  • robomaster机甲大师--电调电机
  • C++入门篇——类和对象(下)
  • C/C++表驱动法
  • Kubernetes生产实战(二十):容器大镜像拉取优化指南
  • 8.二叉树减枝
  • 双流 JOIN 与维表 JOIN 的区别
  • 多线程与信号
  • 软件设计师-错题笔记-软件工程基础知识
  • 总结C/C++中程序内存区域划分
  • 判断公网IP办法
  • Java SolonMCP 实现 MCP 实践全解析:SSE 与 STDIO 通信模式详解
  • Kubernetes排错(十三):Pod间偶发超时问题排查
  • 期刊 | 《电讯技术》
  • [SAP] SAP ERP用户参数设置
  • Funplus 服务端开发实习 面经
  • 分享一些资料供大家学习
  • PCB 设计 | 1A / 10A / 100A
  • 41、IIS 应⽤程序池集成模式和经典模式的区别?
  • 点和体素哪个好
  • 损失函数的选择和技术分析:深度学习模型训练的指南
  • GO语言-导入自定义包
  • 嵌入式STM32学习——振动传感器控制继电器开关灯
  • 力扣-二叉树-101 对称二叉树
  • fast-livo2原理
  • 【Java学习笔记】属性重写问题
  • 全栈项目实战:Vue3+Node.js开发博客系统
  • Python-MCPAgent开发-DeepSeek版本
  • MySQL索引原理以及SQL优化(二)