博客
关于我
精尽MyBatis源码分析 - SqlSession 会话与 SQL 执行入口
阅读量:435 次
发布时间:2019-03-06

本文共 2613 字,大约阅读时间需要 8 分钟。

SqlSession会话与SQL执行入口

在前面的文档中,我们已经详细介绍了MyBatis的初始化和执行SQL的过程。在执行SQL的过程中,还存在着一些疑问,例如SqlSession会话在MyBatis中是如何被创建的?如何调用Executor执行器执行SQL的?接下来,我们将探讨这两个问题。


SqlSession的创建与使用

在MyBatis中,SqlSession会话是用户进行数据库操作的主要入口。通常的操作流程如下:

  • 构建SqlSessionFactory:通过SqlSessionFactoryBuilder构建一个SqlSessionFactory对象。SqlSessionFactoryBuilder通过解析配置文件(如mybatis-config.xml)生成全局配置对象Configuration,然后构建一个DefaultSqlSessionFactory对象。

  • 创建SqlSession:通过SqlSessionFactoryopenSession方法创建一个DefaultSqlSession对象。openSession方法有多个重载版本,主要参数包括autoCommit(是否自动提交事务)、ExecutorType(执行器类型)、TransactionIsolationLevel(事务隔离级别)和Connection(数据库连接)。

  • 获取Mapper代理:通过SqlSessiongetMapper方法获取Mapper接口的动态代理对象。getMapper方法通过Configuration对象获取MapperRegistry,然后通过工厂方法创建MapperProxy动态代理对象。

  • 执行SQL操作:通过Mapper代理对象调用Mapper接口的方法,进入相应的MapperProxy代理类的invoke方法。invoke方法会获取MapperMethod对象,并通过execute方法执行SQL操作。


  • SqlSessionFactoryBuilder的作用

    SqlSessionFactoryBuilder是构建SqlSessionFactory的核心类。它提供了多个build方法,用于根据不同的输入源(如Reader、InputStream或Configuration)构建SqlSessionFactory对象。内部逻辑主要包括以下步骤:

  • 解析配置文件:通过XMLConfigBuilder解析配置文件,生成Configuration对象。
  • 构建SessionFactory:调用build方法,将Configuration对象传递给DefaultSqlSessionFactory构建一个SqlSessionFactory对象。
  • SqlSessionFactoryBuilder还支持环境(environment)和属性(properties)的设置,这些参数会被传递到XMLConfigBuilder中,用于解析配置文件。


    DefaultSqlSessionFactory的职责

    DefaultSqlSessionFactory实现了SqlSessionFactory接口,其主要职责是创建SqlSession对象。openSession方法通过openSessionFromDataSourceopenSessionFromConnection创建DefaultSqlSession对象。

    • openSessionFromDataSource:从数据源中获取连接,创建事务并执行.newTransaction(),然后创建Executor执行器,最后创建DefaultSqlSession对象。
    • openSessionFromConnection:直接使用传入的Connection对象创建事务,创建Executor执行器,进而创建DefaultSqlSession对象。

    DefaultSqlSessionFactory还提供了多种openSession方法,允许用户根据需求选择不同的配置。


    DefaultSqlSession的实现

    DefaultSqlSessionSqlSession接口的默认实现类,主要职责是通过Executor执行器执行数据库操作。它的主要方法包括:

  • 查询操作:如selectselectListselectOneselectMap等,通过Executorquery方法执行查询操作。
  • 更新操作:如updateinsertdelete等,通过Executorupdate方法执行更新操作。
  • 事务管理:提供commitrollbackflushStatements等方法管理事务。
  • 关闭资源:提供close方法关闭当前会话,getConnection方法获取数据库连接。
  • DefaultSqlSession内部通过dirty标志位判断是否需要自动提交事务,并通过Executor执行器执行具体的数据库操作。


    MapperMethod的执行流程

    MapperMethod是Mapper接口方法对应的执行器。当调用Mapper接口的方法时,会进入MapperProxy代理类的invoke方法。invoke方法主要完成以下步骤:

  • 获取MapperMethod:通过cachedMapperMethod方法获取当前方法对应的MapperMethod对象。
  • 执行SQL:调用execute方法,根据SqlCommand类型(如INSERT、UPDATE、DELETE、SELECT等)执行相应的数据库操作。
  • 处理结果:根据方法返回类型(如单个对象、列表、Map等)处理查询结果。
  • execute方法根据SqlCommand类型决定执行方式,对于更新操作(如INSERT、UPDATE、DELETE),直接调用SqlSessionupdate方法并返回受影响的行数;对于查询操作,则根据返回类型(如单个对象、列表、Map等)调用相应的查询方法。


    总结

    通过上述分析可以看出,SqlSession会话在MyBatis中的核心作用是作为数据库操作的入口。它通过动态代理技术获取Mapper接口的实现类,并通过Executor执行器执行具体的数据库操作。整个流程涵盖了从配置解析到SQL执行的多个层次,确保了MyBatis框架的高效和灵活。

    转载地址:http://szsyz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现堆排序(附完整源码)
    查看>>
    Objective-C实现声音录制播放程序(附完整源码)
    查看>>
    Objective-C实现备忘录模式(附完整源码)
    查看>>
    Objective-C实现复制粘贴文本功能(附完整源码)
    查看>>
    Objective-C实现复数类+-x%(附完整源码)
    查看>>
    Objective-C实现外观模式(附完整源码)
    查看>>
    Objective-C实现多尺度MSR算法(附完整源码)
    查看>>
    Objective-C实现多种方法求解定积分(附完整源码)
    查看>>
    Objective-C实现多组输入(附完整源码)
    查看>>
    Objective-C实现多项式函数在某个点的评估算法(附完整源码)
    查看>>
    Objective-C实现多项式哈希算法(附完整源码)
    查看>>
    Objective-C实现大位数乘法(附完整源码)
    查看>>
    Objective-C实现大根堆(附完整源码)
    查看>>
    Objective-C实现奇偶检验码(附完整源码)
    查看>>
    Objective-C实现奇偶转置排序算法(附完整源码)
    查看>>
    Objective-C实现奇异值分解SVD(附完整源码)
    查看>>
    Objective-C实现子集总和算法(附完整源码)
    查看>>
    Objective-C实现字符串boyer moore search博耶摩尔搜索算法(附完整源码)
    查看>>
    Objective-C实现字符串IP地址转DWORD地址(附完整源码)
    查看>>
    Objective-C实现字符串jaro winkler算法(附完整源码)
    查看>>