mybatis-执行器
MyBatis 中的 Executor 接口有三个实现类:
-
SimpleExecutor:SimpleExecutor 是最简单的 Executor 实现。它每次执行 SQL 语句时都会创建一个新的 Statement 对象。这种实现方式的缺点是效率较低,因为每次执行 SQL 语句都需要创建一个新的 Statement 对象。
-
ReuseExecutor:ReuseExecutor 是 MyBatis 中的默认 Executor 实现。它会在执行 SQL 语句时重用 Statement 对象。这种实现方 式可以提高效率,因为重用 Statement 对象可以减少对象创建的开销。
-
BatchExecutor:BatchExecutor 是 MyBatis 中的批处理 Executor 实现。它可以将多个 SQL 语句一起发送到数据库,从而减少网络传输的开销。这种实现方式可以提高效率,特别是在需要执行大量 SQL 语句时。
在 MyBatis 中,Executor 是 SqlSession 的一个重要组成部分。每个 SqlSession 都有一个对应的 Executor,用于执行 SQL 语句。SqlSession 提供了一些方法,如 select、insert、update、delete 等,用于执行 SQL 语句。当调用这些方法时,SqlSession 将会委托 Executor 执行 SQL 语句,并将结果映射到 Java 对象中。
MyBatis 的 SimpleExecutor 是 MyBatis 中最简单的 Executor 实现之一。它在每次执行 SQL 语句时都会创建一个新的 Statement 对 象,然后执行 SQL 语句并将结果映射到 Java 对象中。
SimpleExecutor 的实现比较简单,主要包括以下几个步骤:
-
创建 Statement 对象:在执行 SQL 语句之前,SimpleExecutor 会先创建一个 Statement 对象。
-
设置参数:SimpleExecutor 会将 SQL 语句中的参数设置到 Statement 对象中。
-
执行 SQL 语句:SimpleExecutor 会执行 SQL 语句,并将结果保存到 ResultSet 对象中。
-
处理结果集:SimpleExecutor 会将 ResultSet 对象中的数据映射到 Java 对象中,并返回结果。
SimpleExecutor 的实现比较简单,但效率较低。因为每次执行 SQL 语句都需要创建一个新的 Statement 对象,这会增加对象创建的开 销。如果需要执行大量 SQL 语句,建议使用其他 Executor 实现,如 ReuseExecutor 或 BatchExecutor,以提高效率。
在 JDBC 中,Statement 是执行 SQL 语句的核心对象之一。根据 Statement 的不同特点,可以将其分为以下三种类型:
-
Statement:最基本的 Statement 对象,用于执行静态 SQL 语句。每次执行 SQL 语句时,都需要将完整的 SQL 语句传递给数据库进行编译和执行。由于每次执行 SQL 语句都需要编译,因此在执行大量 SQL 语句时效率较低。
-
PreparedStatement:继承自 Statement,用于执行预编译的 SQL 语句。在创建 PreparedStatement 对象时,会将 SQL 语句发送给 数据库进行编译,然后将编译后的 SQL 语句保存在 PreparedStatement 对象中。在执行 SQL 语句时,只需要将参数传递给 PreparedStatement 对象即可,不需要再次编译 SQL 语句,因此效率比 Statement 高。
-
CallableStatement:继承自 PreparedStatement,用于执行存储过程。与 PreparedStatement 不同的是,CallableStatement 可以 返回多个结果集,可以使用 OUT 或 INOUT 参数来传递参数和获取返回值。
除了上述三种类型的 Statement,还有一种批处理的 Statement,即 BatchStatement。BatchStatement 可以将多个 SQL 语句一次性发 送给数据库执行,以提高效率。
在使用 Statement 时,需要注意以下几点:
-
避免使用 Statement 执行动态 SQL 语句,以免引发 SQL 注入攻击。
-
尽量使用 PreparedStatement 执行 SQL 语句,以提高效率和安全性。
-
在执行大量 SQL 语句时,可以使用 BatchStatement 批处理,以提高效率。
MyBatis 的 ReuseExecutor 是一种可重用的 Executor 实现,它可以重复使用 Statement 对象,以提高执行 SQL 语句的效率。
在 ReuseExecutor 中,每个 Statement 对象都会被缓存起来,以便下次执行相同的 SQL 语句时可以直接重用该 Statement 对象,而不需要重新创建。当一个 Statement 对象被缓存起来时,它的参数和结果集都会被清空,以便下次执行时可以重新设置参数和获取结果。
ReuseExecutor 的实现比较简单,主要包括以下几个步骤:
-
从缓存中获取 Statement 对象:在执行 SQL 语句之前,ReuseExecutor 会先从缓存中获取一个可重用的 Statement 对象。
-
设置参数:ReuseExecutor 会将 SQL 语句中的参数设置到 Statement 对象中。
-
执行 SQL 语句:ReuseExecutor 会执行 SQL 语句,并将结果保存到 ResultSet 对象中。
-
处理结果集:ReuseExecutor 会将 ResultSet 对象中的数据映射到 Java 对象中,并返回结果。
-
将 Statement 对象缓存起来:在执行完 SQL 语句之后,ReuseExecutor 会将该 Statement 对象缓存起来,以便下次执行相同的 SQL 语句时可以直接重用。
ReuseExecutor 的实现比 SimpleExecutor 更加高效,因为它可以重复使用 Statement 对象,避免了每次创建 Statement 对象的开销。但是,由于 Statement 对象是可变的,因此在多线程环境下需要进行同步处理,以避免线程安全问题。
在使用 ReuseExecutor 时,需要注意以下几点:
-
避免在多线程环境下使用 ReuseExecutor,或者使用同步机制保证线程安全。
-
避免使用 Statement 执行动态 SQL 语句,以免引发 SQL 注入攻击。
-
尽量使用 PreparedStatement 执行 SQL 语句,以提高效率和安全性。