当前位置: 首页 > article >正文

【MyBatis源码】SqlSession实例创建过程

在MyBatis中,openSession()方法是开启数据库会话的入口,主要作用是生成SqlSession对象。我们从SqlSessionFactory接口入手,其实现类DefaultSqlSessionFactory的openSession()方法用于创建SqlSession实例.

SqlSessionFactory接口方法

public interface SqlSessionFactory {

public interface SqlSessionFactory {

  /**
   * 打开一个默认的SqlSession会话,一般使用默认配置创建SqlSession,通常是非自动提交模式。
   */
  SqlSession openSession();

  /**
   * 打开一个新的SqlSession,并指定是否自动提交事务。
   * autoCommit为true时会自动提交;为false时需要手动提交或回滚事务。
   */
  SqlSession openSession(boolean autoCommit);

  /**
   * 使用已有的数据库连接Connection创建一个SqlSession。
   * 这种方式适用于已有连接池或自定义数据库连接的情况。
   */
  SqlSession openSession(Connection connection);

  /**
   *根据指定的事务隔离级别TransactionIsolationLevel创建SqlSession,可用于控制事务的隔离级别
   */
  SqlSession openSession(TransactionIsolationLevel level);

  /**
   *根据指定的执行器类型ExecutorType创建SqlSession。ExecutorType可以是以下几种:
   *
   * SIMPLE:简单的执行器,每次执行语句都会创建一个新的预处理语句。
   * REUSE:重用执行器,重用预处理语句。
   * BATCH:批量执行的执行器,可以提高批量插入、更新的效率。
   */
  SqlSession openSession(ExecutorType execType);

}

DefaultSqlSessionFactory

DefaultSqlSessionFactory类是MyBatis中SqlSessionFactory接口的默认实现类,用于创建和管理SqlSession对象。它是MyBatis连接数据库、执行SQL语句的核心组件之一,通常是通过读取配置文件并加载环境、数据源等设置来创建合适的数据库会话。

DefaultSqlSessionFactory主要负责:

  1. 管理数据库会话SqlSession的创建:提供多种重载的openSession方法,可以根据不同参数创建自定义的会话。
  2. 加载MyBatis的配置信息:在初始化时读取Configuration对象,并从中获取数据库环境、事务管理、执行器类型等信息。
  3. 提供配置访问:通过getConfiguration()方法,用户可以获取Configuration实例,从而查看或操作配置信息。

openSessionFromDataSource方法说明
openSessionFromDataSource方法是DefaultSqlSessionFactory类中创建SqlSession的关键方法之一。它负责从数据源中获取数据库连接,配置事务、执行器等,最终生成SqlSession对象

  @Override
  public SqlSession openSession() {
    return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
  }
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      // 从configuration对象获取环境配置信息
      final Environment environment = configuration.getEnvironment();
      // 获取事务工厂对象,通过Environment获取相应的事务工厂,用于创建Transaction事务对象。TransactionFactory的具体实现通常根据MyBatis配置确定,比如可以是JdbcTransactionFactory或ManagedTransactionFactory等。
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      // 构建事务对象
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      // 创建执行器对象,Executor是MyBatis执行SQL语句的核心组件,根据传入的ExecutorType创建不同类型的执行器(如SIMPLE、REUSE、BATCH),从而控制SQL执行的模式。
      final Executor executor = configuration.newExecutor(tx, execType);
      return new DefaultSqlSession(configuration, executor, autoCommit);
    } catch (Exception e) {
      closeTransaction(tx); // may have fetched a connection so lets call close()
      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);
    } finally {
// ErrorContext.instance().reset()用于重置MyBatis的错误上下文信息,确保每次操作都在独立的上下文中进行。
      ErrorContext.instance().reset();
    }
  }

Executor接口结构

在这里插入图片描述
MyBatis提供了3种不同的Executor,分别为SimpleExecutor、ResueExecutor、BatchExecutor,这些Executor都继承至BaseExecutor,BaseExecutor中定义的方法的执行流程及通用的处理逻辑,具体的方法由子类来实现,是典型的模板方法模式的应用。SimpleExecutor是基础的Executor,能够完成基本的增删改查操作,ResueExecutor对JDBC中的Statement对象做了缓存,当执行相同的SQL语句时,直接从缓存中取出Statement对象进行复用,避免了频繁创建和销毁Statement对象,从而提升系统性能,这是享元思想的应用。BatchExecutor则会对调用同一个Mapper执行的update、insert和delete操作,调用Statement对象的批量操作功能。另外,我们知道MyBatis支持一级缓存和二级缓存,当MyBatis开启了二级缓存功能时,会使用CachingExecutor对SimpleExecutor、ResueExecutor、BatchExecutor进行装饰,为查询操作增加二级缓存功能,这是装饰器模式的应用。


http://www.kler.cn/a/378901.html

相关文章:

  • 手动搭建 LNMP 环境(Ubuntu)
  • AI大模型重塑软件开发:从代码自动生成到智能测试
  • 对象池模式
  • Java实现动态切换ubuntu壁纸功能
  • C++和OpenGL实现3D游戏编程【连载17】——着色器进阶(附源码)
  • 【Python TensorFlow】入门到精通
  • 《Python修炼秘籍》01踏上编程之旅
  • 大零售时代下融合发展的新路径:定制开发技术的应用与思考
  • IT 运维:流量回溯与视频质量监控的秘籍
  • vue3项目中实现el-table分批渲染表格
  • scrapy服务器重试机制失效问题
  • 【生物学&水族馆】观赏淡水鱼检测系统源码&数据集全套:改进yolo11-dysample
  • Python规整电商编码
  • docker 启动 neo4j
  • STM32 透传简易实现的软件方法
  • 基于SpringBoot的“CSGO赛事管理系统”的设计与实现(源码+数据库+文档+PPT)
  • ESP8266 自定义固件烧录-Tcpsocket固件
  • java脚手架系列12-mongoDB
  • 10天进阶webpack---(1)为什么要有webpack
  • 【数据分享】2024年我国省市县三级的休闲娱乐设施数量(免费获取/18类设施/Excel/Shp格式)
  • 中文词向量质量的评估
  • 服务器开启SSH允许远程连接服务
  • Springboot 内置缓存与整合Redis作为缓存
  • 7-12 检查密码
  • LeetCode 203. 移除链表元素(java)
  • Android面试整理