前言知识汇总
上篇文章中我们已经详细介绍了Mybatis的存储类对象。我们上篇提到了:
Mapper.xml当中的SQL标签都被解析成了一个一个的MappedStatement对象。那么我们当中的SQL是基于什么形式进行封装的呢?
我们要知道,Java当中一切皆对象。MappedStatement当中SQL被封装成了MappedStateMent当中的SqlSource对象。
我们通过sqlSource.getBoundSql()来获取一个BoundSql对象,BoundSQL当中的对象就是对于SQL语句的真实封装。
Cofiguration也好,MappedStatent也好存储的是我们配置文件或者是在注解当中书写的配置信息。它们是一个存储对象。
我们还要有操作类型的对象。
一:操作类型对象
Executor
在 MyBatis 中,Executor 是一个重要的接口,它负责执行存储在映射器文件中的 SQL 语句,以及处理结果集。Executor 接口定义了对 SQL 语句的执行和处理,是 MyBatis 中执行数据库操作的核心组件之一。
主要作用
Executor 接口的主要作用包括以下几个方面:
1. 执行 SQL 语句:Executor 负责执行映射器文件中配置的各种 SQL 语句,包括查询、插入、更新、删除等操作。
2. 缓存处理:Executor 可以对 SQL 语句执行的结果进行缓存处理,提高重复查询的性能。
3. 结果集处理:Executor 负责将数据库返回的结果集处理成 Java 对象或基本数据类型,以便应用程序进一步处理和展示。
主要实现
在 MyBatis 中,Executor 接口有三个主要的实现类:
- SimpleExecutor:SimpleExecutor 是 Executor 接口的简单实现,它对每个 SQL 语句的执行创建一个新的 Statement 对象,并直接执行 SQL 语句,适用于较为简单的数据库操作场景。
- ReuseExecutor:ReuseExecutor 是 Executor 接口的复用实现,它会重用 Statement 对象,减少 SQL 语句执行的开销,适用于需要频繁执行 SQL 语句的场景。
BatchExcutor是一个批处理的执行器,我们知道在JDBC当中就有批处理的操作,如果我们想再JDBC当中仍然有批处理的操作。使用这个BatchExcutor即可。也就是一个Connection处理一坨SQL语句,我们就可以考虑使用这个执行器了。
值得注意的是最常用的执行器往往是最简单的这个:SimpleExecutor,完成常规的操作,这个是最核心的Excutor,这要是Mybatis当中内置推荐的执行器。如果我们不更改配置的话,默认使用的就是Configuration当中的简单的Excutor
总体来说,Executor 在 MyBatis 中起着承担着执行 SQL 语句和处理结果集的重要角色,它通过不同的实现方式,能够满足不同场景下的数据库操作需求,并在一定程度上提高了数据库访问的性能。
Configuration三个功能:封装Mybatis-Config.xml,存储MappedStatement,创建其他的核心执行的对象包括Excutor,所以配置肯定也在这个类里边。
ReuseExcutor这是一个复用Excutor,他复用的是Statement。我们说任何对数据库的操作底层都得用JDBC,JDBC中的三大件东西Connection是连接数据库的ResultSet是获取查询结果集的,真正和数据库交互的是Statement。复用Statement在什么条件下会发生呢?
Statement与什么想关呢?Statement是与SQL语句相关的。如果我们的SQL在任何条件下都不会改变的话,我们这样的话就可以一直使用这个Statement对象,减少了对象的创建,保证了性能。
这个SQL语句的话可以是增删改查任何的语句,但是不能有任何的改变,任何的改变的话,就不适用了。
补充知识点
JDBC当中的批处理是啥意思?
我们最简单的JDBC是获取一个Connection之后,我们直接获取一个Statement对象,然后拿着这个对象和数据库沟通,然后取到结果集,释放连接。但是这样会有一个问题,需要频繁的有连接的创建和关闭。或者是连接池的获取和归还。
我们想到了批处理,也就是在一个连接之上,与数据库进行多语SQL交互,这样的话我们就省略了大量的Connetion的创建和销毁,这就是批处理,大大提高了性能。
站在Mybatis当中如果我们想要使用批处理的话,我们就可以使用BatchExcutor
为什么说IO,连接都是非常真贵的资源?
我们知道,我们搞Java开发我们底层面临的是OS操作系统的资源,在它之上我们构建了一个Java虚拟机的东西。我们写Java程序是运行在虚拟机层面上的东西,然后我们想要在虚拟机当中去建立网络连接、或者是io、或者是线程的时候,这个时候虚拟机就办不到了,需要去沟通操作系统,因为只有操作系统可以进行读取文件,可以去访问互联网,只有操作系统可以操作CPU操作线程、进程。所以,我们知道这些操作被后都有操作系统,都会有这些native的方法的操作,而这些东西都是耗时和占用资源的,所以我们认为这些东西,必须要管,必须要复用,必须要池化。
Excutor来处理和数据库的操作,那么这个是怎么和JDBC建立连接的呢,这就和后面的对象有关系了。
ParameterHandler
- ParameterHandler 用于处理 SQL 语句中的参数,包括对输入参数的设置和处理。它负责将 Java 对象中的属性值映射到预编译的 SQL 语句中的参数位置上。
ResultSetHandler
- ResultSetHandler 用于处理查询结果集,将数据库返回的数据转换为 Java 对象或基本数据类型,以便应用程序进行后续的处理和展示。
StatementHandler
- StatementHandler 用于处理 SQL 语句的执行,包括对 SQL 语句的组装、参数设置、语句执行和结果集的处理等。它负责实际执行 SQL 语句,并处理各种异常情况。
以上这些操作类型对象一起构成了 MyBatis 框架中数据库操作的基本组成部分,它们协同工作,实现了数据库访问层的抽象和封装,为开发者提供了灵活、高效的数据库访问手段。