SqlSessionFactory
有六个方法创建 SqlSession
实例。通常来说,当你选择其中一个方法时,你需要考虑以下几点:
session
作用域中使用事务作用域,还是使用自动提交(auto-commit
)?(对很多数据库和/或 JDBC 驱动来说,等同于关闭事务支持)PreparedStatement
和/或批量更新语句(包括插入语句和删除语句)吗?基于以上需求,有下列已重载的多个 openSession()
方法供使用。
SqlSession openSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
Configuration getConfiguration();
默认的 openSession()
方法没有参数,它会创建具备如下特性的 SqlSession
:
DataSource
实例中获取 Connection
对象。相信你已经能从方法签名中知道这些方法的区别。向 autoCommit
可选参数传递 true
值即可开启自动提交功能。若要使用自己的 Connection
实例,传递一个 Connection
实例给 connection
参数即可。注意,我们没有提供同时设置 Connection
和 autoCommit
的方法,这是因为 MyBatis 会依据传入的 Connection
来决定是否启用 autoCommit
。对于事务隔离级别,MyBatis 使用了一个 Java 枚举包装器来表示,称为 TransactionIsolationLevel
,事务隔离级别支持 JDBC 的五个隔离级别(NONE
、READ_UNCOMMITTED
、READ_COMMITTED
、REPEATABLE_READ
和 SERIALIZABLE
),并且与预期的行为一致。
你可能对 ExecutorType
参数感到陌生。这个枚举类型定义了三个值:
ExecutorType.SIMPLE
:该类型的执行器没有特别的行为。它为每个语句的执行创建一个新的预处理语句。ExecutorType.REUSE
:该类型的执行器会复用预处理语句。ExecutorType.BATCH
:该类型的执行器会批量执行所有更新语句,如果 SELECT
在多个更新中间执行,将在必要时将多条更新语句分隔开来,以方便理解。在 SqlSessionFactory
中还有一个方法我们没有提及,就是 getConfiguration()
。这个方法会返回一个 Configuration
实例,你可以在运行时使用它来检查 MyBatis 的配置。
如果你使用过 MyBatis 的旧版本,可能还记得 session
、事务和批量操作是相互独立的。在新版本中则不是这样。上述三者都包含在 session
作用域内。你不必分别处理事务或批量操作就能得到想要的全部效果。