本文共 2613 字,大约阅读时间需要 8 分钟。
在前面的文档中,我们已经详细介绍了MyBatis的初始化和执行SQL的过程。在执行SQL的过程中,还存在着一些疑问,例如SqlSession会话在MyBatis中是如何被创建的?如何调用Executor执行器执行SQL的?接下来,我们将探讨这两个问题。
在MyBatis中,SqlSession会话是用户进行数据库操作的主要入口。通常的操作流程如下:
构建SqlSessionFactory:通过SqlSessionFactoryBuilder构建一个SqlSessionFactory对象。SqlSessionFactoryBuilder通过解析配置文件(如mybatis-config.xml)生成全局配置对象Configuration,然后构建一个DefaultSqlSessionFactory对象。
创建SqlSession:通过SqlSessionFactory的openSession方法创建一个DefaultSqlSession对象。openSession方法有多个重载版本,主要参数包括autoCommit(是否自动提交事务)、ExecutorType(执行器类型)、TransactionIsolationLevel(事务隔离级别)和Connection(数据库连接)。
获取Mapper代理:通过SqlSession的getMapper方法获取Mapper接口的动态代理对象。getMapper方法通过Configuration对象获取MapperRegistry,然后通过工厂方法创建MapperProxy动态代理对象。
执行SQL操作:通过Mapper代理对象调用Mapper接口的方法,进入相应的MapperProxy代理类的invoke方法。invoke方法会获取MapperMethod对象,并通过execute方法执行SQL操作。
SqlSessionFactoryBuilder是构建SqlSessionFactory的核心类。它提供了多个build方法,用于根据不同的输入源(如Reader、InputStream或Configuration)构建SqlSessionFactory对象。内部逻辑主要包括以下步骤:
XMLConfigBuilder解析配置文件,生成Configuration对象。build方法,将Configuration对象传递给DefaultSqlSessionFactory构建一个SqlSessionFactory对象。SqlSessionFactoryBuilder还支持环境(environment)和属性(properties)的设置,这些参数会被传递到XMLConfigBuilder中,用于解析配置文件。
DefaultSqlSessionFactory实现了SqlSessionFactory接口,其主要职责是创建SqlSession对象。openSession方法通过openSessionFromDataSource或openSessionFromConnection创建DefaultSqlSession对象。
.newTransaction(),然后创建Executor执行器,最后创建DefaultSqlSession对象。Connection对象创建事务,创建Executor执行器,进而创建DefaultSqlSession对象。DefaultSqlSessionFactory还提供了多种openSession方法,允许用户根据需求选择不同的配置。
DefaultSqlSession是SqlSession接口的默认实现类,主要职责是通过Executor执行器执行数据库操作。它的主要方法包括:
select、selectList、selectOne、selectMap等,通过Executor的query方法执行查询操作。update、insert、delete等,通过Executor的update方法执行更新操作。commit、rollback、flushStatements等方法管理事务。close方法关闭当前会话,getConnection方法获取数据库连接。DefaultSqlSession内部通过dirty标志位判断是否需要自动提交事务,并通过Executor执行器执行具体的数据库操作。
MapperMethod是Mapper接口方法对应的执行器。当调用Mapper接口的方法时,会进入MapperProxy代理类的invoke方法。invoke方法主要完成以下步骤:
cachedMapperMethod方法获取当前方法对应的MapperMethod对象。execute方法,根据SqlCommand类型(如INSERT、UPDATE、DELETE、SELECT等)执行相应的数据库操作。execute方法根据SqlCommand类型决定执行方式,对于更新操作(如INSERT、UPDATE、DELETE),直接调用SqlSession的update方法并返回受影响的行数;对于查询操作,则根据返回类型(如单个对象、列表、Map等)调用相应的查询方法。
通过上述分析可以看出,SqlSession会话在MyBatis中的核心作用是作为数据库操作的入口。它通过动态代理技术获取Mapper接口的实现类,并通过Executor执行器执行具体的数据库操作。整个流程涵盖了从配置解析到SQL执行的多个层次,确保了MyBatis框架的高效和灵活。
转载地址:http://szsyz.baihongyu.com/