MyBatis学习(六)

63 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第36天,点击查看活动详情

MyBatis中的API

MyBatis的配置文件已经介绍完毕,一般来说MyBatis配置文件提供的功能在日常CRUD中已经够用了,但是如果有特殊的需求的话,那么就需要扩展MyBatis中的一些行为,这就要求我们对MyBatis中的Java API要有所了解,本文章接下来讲解MyBatis中的API。

SqlSession

在MyBatis中,我们使用最多的API就是 SqlSession,通过这个接口,我们可以获取 Mapper 对象,管理事务等操作。我们来看下怎么获取 SqlSession 实例。SqlSessions 是由 SqlSessionFactory 实例创建的。SqlSessionFactory 对象包含创建 SqlSession 实例的各种方法。构建 SqlSessionFactory 又需要 SqlSessionFactoryBuilder来构建,SqlSessionFactoryBuilder 提供了从 xml、注解、和Java代码创建 SqlSessionFactory 的方法。SqlSessionFactoryBuilder 的API如下:

SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)

SqlSessionFactoryBuilder 需要的是一个配置 Configuration 对象,而我们的配置信息又是存储在 xml 文件中,所以 SqlSessionFactoryBuilder 提供了两种构建方式,一种是直接传入 Configuration 对象,另一种是通过流的形式传入 xml 文件,最终 SqlSessionFactoryBuilder 会通过配置的各种信息构建出 SqlSessionFactory,从 SqlSessionFactory 中就可以获取 SqlSession 进行数据库操作了。

SqlSessionFactory

SqlSessionFactory 有六个方法创建 SqlSession 实例。通常来说,当你选择其中一个方法时,你需要考虑以下几点:

  • 事务处理:你希望在 session 作用域中使用事务作用域,还是使用自动提交(auto-commit)?(对很多数据库和/或 JDBC 驱动来说,等同于关闭事务支持)
  • 数据库连接:你希望 MyBatis 帮你从已配置的数据源获取连接,还是使用自己提供的连接?
  • 语句执行:你希望 MyBatis 复用 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 对象。
  • 事务隔离级别将会使用驱动或数据源的默认设置。
  • 预处理语句不会被复用,也不会批量处理更新。

SqlSession

SqlSession 是在应用中打交道最多的类,所有SQL语句都是通过它进行发送的,所以 SqlSession 中的方法是最多的,包括事务的处理 和 Mapper映射获取,API如下:

<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
<T> Cursor<T> selectCursor(String statement, Object parameter)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)

对于你打开的所有的 session,都要保证它们被妥善关闭。保证妥善关闭的最佳代码实践是这样的:

SqlSession session = sqlSessionFactory.openSession();
try (SqlSession session = sqlSessionFactory.openSession()) {
    // 假设下面三行代码是你的业务逻辑
    session.insert(...);
    session.update(...);
    session.delete(...);
    session.commit();
}