MyBatis Plus学习连接 https://developer.aliyun.com/article/1592161

CachingExecutor:独树一帜,它本身并不具备其他执行器的功能,不能直接进行sql操作,也无没获取连接,自然也无法执行事务提交或回滚,它只是个缓存容器(二级缓存),所以每一次使用CachingExecutor时,其内必须含一个其他执行器,sql和事务的操作,其实都由该其他执行器负责。
BaseExecutor:一个抽象类,执行器的基本实现。该类主要完成了一些事务管理和一级缓存准备的工作,而查询和更新的核心逻辑则是空方法,所以不直接使用,一般使用的都是其三个子类,其子类将重写核心方法。
SimpleExecutor:Mybatis默认的执行器,它对每个SQL语句都创建一个Statement对象,执行完毕后立即关闭。SimpleExecutor适用于执行一些短期查询、插入、更新或删除等SQL操作,但频繁的创建和关闭Statement对象会导致较差的性能。
ReuseExecutor:重用已经创建的Statement对象,将相同sql的多次查询或更新操作放到同一个Statement中执行,提高了性能。
BatchExecutor:用于批量执行SQL语句,它将多个SQL语句放到同一个Statement中执行,从而减少了与数据库的通信次数
Executor执行器的核心功能,就是新建出一个statementHandler , 然后利用该handler创建一个statement 的实例。最后调用该实例的对应方法完成sql的执行。其基础和默认实现类是SimpleExecutor,另两种执行器则是该基础执行器在特殊场景下的优化版本。
而CachingExecutor则只专注二级缓存,没有上述核心功能,所以无法单独出现,其必定引用着一个“正常”的执行器,以便二级缓存没结果时,能正常查询数据库。
Statement 是Java JDBC API中定义的一个接口,位于java.sql 包下,是一种执行静态SQL语句的对象,可以用于执行SQL语句的查询、更新、插入和删除等操作。该对象就是 jdbc 的核心,负责在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。
官方定义:用于执行静态SQL语句并返回其生成的结果的对象。默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交错进行,则每个ResultSet对象必须由不同的Statement对象生成。如果存在打开的语句的ResultSet对象,则Statement接口中的所有执行方法都隐式关闭该语句的当前ResultSet对象。
StatementHandler 的主要功能应该包括

public interface ParameterHandler {
Object getParameterObject();
void setParameters(PreparedStatement ps) throws SQLException;
}
({
(
type = Executor.class,
method = "update",
args = {MappedStatement.class, Object.class}
),
(
type = Executor.class,
method = "query",
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
)
})
<!--一个动态sql标签就是一个`MappedStatement`对象-->
<select id="selectUserList" resultType="com.mybatis.User">
select * from t_user
</select>
// 1.加载配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2. 创建SqlSessionFactory对象实际创建的是DefaultSqlSessionFactory对象
SqlSessionFactory builder = new SqlSessionFactoryBuilder().build(inputStream);
//3. 创建SqlSession对象实际创建的是DefaultSqlSession对象
SqlSession sqlSession = builder.openSession();
//4. 创建代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//5. 执行查询语句
List<User> users = mapper.selectUserList();
//6. 释放资源
sqlSession.close();
inputStream.close();
mapper.xml 时,Mybatis 会把每个 SQL 标签封装成 SqlSource 对象,然后根据 SQL 语句的不同,又分为动态 SQL 和静态 SQL。其中,静态 SQL 包含一段String 类型的 sql 语句;而动态 SQL 则是由一个个 SqlNode 组成。 MappedStatement 对象,保存在 Configuration 对象中。MappedStatement 的结构:id:全限定类名+方法名组成的 IDsqlSource:当前 SQL 标签对应的 SqlSource 对象@Param 注解时,除本身参数名外,还会增加参数名:Collection 类型,则增加 collectionList 类型,再增加 listarray@Param 注解,则以注解名为准,否则以实际名,同时增加 param1、param2 等通用名称parameterObject,是个map,存储参数名和对应的值parameterMapping 则存储每个参数对应的 javaType,jdbcType,typeHandler 等,对于 <foreach/> 标签则会产生每个值对应的 parameMappingConfiguration 中的 newParameterHandler,newResultSetHandler,newStatementHandler,newExecutor 四个方法会调用interceptorChain.pluginAll(executor),如果配置了拦截器,则最终返回的都是代理的对象,