MyBatis源码分析(三)-SqlSession理解

SqlSession理解

一、创建SqlSession

1.创建事务

a.事务工厂根据DataSource创建一个事务对象(Connection对象,事务级别,是否自动提交)
b.事务工厂根据Connection创建一个事务对象(事务级别和是否自动提交已经被设置在Connection对象中)
c.系统默认的事务工厂是ManagedTransactionFactory,默认是关闭连接的 private boolean closeConnection = true;

2.创建Executor(statement)对象

a.根据配置文件中的ExecutorType决定创建Executor的类型(SIMPLE【SimpleExecutor】, REUSE【ReuseExecutor】, BATCH【BatchExecutor】)

b.如果配置cacheEnabled=true,则创建executor = new CachingExecutor(executor);

3.返回SqlSession,默认返回的是DefaultSqlSession对象(该对象维护Configuration对象、Executor对象、是否自动提交)

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {

Transaction tx = null;

try {

final Environment environment = configuration.getEnvironment();

final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);

tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);

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();

}

}

private SqlSession openSessionFromConnection(ExecutorType execType, Connection connection) {

try {

boolean autoCommit;

try {

autoCommit = connection.getAutoCommit();

} catch (SQLException e) {

// Failover to true, as most poor drivers

// or databases won‘t support transactions

autoCommit = true;

}

final Environment environment = configuration.getEnvironment();

final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);

final Transaction tx = transactionFactory.newTransaction(connection);

final Executor executor = configuration.newExecutor(tx, execType);

return new DefaultSqlSession(configuration, executor, autoCommit);

} catch (Exception e) {

throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);

} finally {

ErrorContext.instance().reset();

}

二.DefaultSqlSession对象,SqlSession对象的使用

(一)在使用DefaultSqlSession之前要现要求Mapper.xml的加载过程
对mapper节点的解析,XMLMapperBuilder对象进行xml文件解析和MapperBuilderAssistant对象将解析后的数据组装成对象交付给Configuration对象

1.传递mapper.xml文件路径、inputstream、Configuration对象

2.XMLMapperBuilder对象的configurationElement(parser.evalNode("/mapper"));解析mpper.xml文件

3.XMLMapperBuilder对象以buildStatementFromContext(context.evalNodes("select|insert|update|delete"));为例进行分析

4.XMLMapperBuilder对象的buildStatementFromContext(List<XNode> list, String requiredDatabaseId),主要是XMLStatementBuilder对象在干活

5.final XMLStatementBuilder statementParser = new XMLStatementBuilder(configuration, builderAssistant, context, requiredDatabaseId);

6.XMLStatementBuilder对象开始干活:statementParser.parseStatementNode();最终将所有的配置信息放到MapperBuilderAssistant对象中,然后由MapperBuilderAssistant把真实的MappedStatement放到Configuration对象中

(二)使用SqlSession的重要一步就是首先要根据ID获取MappedStatement

1.SqlSession session = sqlSessionFactory.openSession();

2.BoundBlogMapper mapper = session.getMapper(BoundBlogMapper.class);//真实是从Configuration对象中进行查找的

3.Blog b = mapper.selectSomething(1);

4.session.close();

时间: 2024-10-08 07:05:09

MyBatis源码分析(三)-SqlSession理解的相关文章

mybatis源码分析(四) mybatis与spring事务管理分析

mybatis源码分析(四) mybatis与spring事务管理分析 一丶从jdbc的角度理解什么是事务 从mysql获取一个连接之后, 默认是自动提交, 即执行完sql之后, 就会提交事务. 这种事务的范围是一条sql语句. 将该连接设置非自动提交, 可以执行多条sql语句, 然后由程序决定是提交事务, 还是回滚事务. 这也是我们常说的事务. Connection connection = dataSource.getConnection(); // connection.setTransa

MyBatis 源码分析 - 配置文件解析过程

* 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAliases和typeHandlers等,本文的篇幅也主要在对这三个配置解析过程的分析上.下面,我们来一起看一下本篇文章的目录结构. 从目录上可以看出,2.3节.2.5节和2.8节的内容比较多.其中2.3节是关于settings配置解析过程的分析,除了对常规的 XML 解析过程分析,本节额外的分析了元

mybatis源码分析(一)

mybatis源码分析(sqlSessionFactory生成过程) 1. mybatis框架在现在各个IT公司的使用不用多说,这几天看了mybatis的一些源码,赶紧做个笔记. 2. 看源码从一个demo引入如下: public class TestApp { private static SqlSessionFactory sqlSessionFactory; static { InputStream inputStream; String resource = "mybatis-confi

MyBatis源码分析-MyBatis初始化流程

MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.如何新建MyBatis源码工程请点击MyBatis源码分析-IDEA新建MyBatis源码工程. MyBatis初始化的过程也就是创建Configura

MyBatis源码分析-SQL语句执行的完整流程

MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.如何新建MyBatis源码工程请点击MyBatis源码分析-IDEA新建MyBatis源码工程. MyBatis框架主要完成的是以下2件事情: 根据JD

MyBatis 源码分析 - 插件机制

1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 MyBatis 为例,我们可基于 MyBatis 插件机制实现分页.分表,监控等功能.由于插件和业务无关,业务也无法感知插件的存在.因此可以无感植入插件,在无形中增强功能. 开发 MyBatis 插件需要对 MyBatis 比较深了解才行,一般来说最好能够掌握 MyBatis 的源码,门槛相对较高.本篇

Mybatis源码分析

MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.如何新建MyBatis源码工程请点击MyBatis源码分析-IDEA新建MyBatis源码工程. MyBatis框架主要完成的是以下2件事情: 根据JD

Mybatis源码解析(四) —— SqlSession是如何实现数据库操作的?

Mybatis源码解析(四) -- SqlSession是如何实现数据库操作的? ??如果拿一次数据库请求操作做比喻,那么前面3篇文章就是在做请求准备,真正执行操作的是本篇文章要讲述的内容.正如标题一样,本篇文章最最核心的要点就是 SqlSession实现数据库操作的源码解析.但按照惯例,我这边依然列出如下的问题: 1. SqlSession 是如何被创建的? 每次的数据库操作都会创建一个新的SqlSession么?(也许有很多同学会说SqlSession是通过 SqlSessionFactor

Mybatis源码分析之Cache二级缓存原理 (五)

一:Cache类的介绍 讲解缓存之前我们需要先了解一下Cache接口以及实现MyBatis定义了一个org.apache.ibatis.cache.Cache接口作为其Cache提供者的SPI(ServiceProvider Interface) ,所有的MyBatis内部的Cache缓存,都应该实现这一接口 Cache的实现类中,Cache有不同的功能,每个功能独立,互不影响,则对于不同的Cache功能,这里使用了装饰者模式实现. 看下cache的实现类,如下图: 1.FIFOCache:先进

Nouveau源码分析(三):NVIDIA设备初始化之nouveau_drm_probe

Nouveau源码分析(三) 向DRM注册了Nouveau驱动之后,内核中的PCI模块就会扫描所有没有对应驱动的设备,然后和nouveau_drm_pci_table对照. 对于匹配的设备,PCI模块就调用对应的probe函数,也就是nouveau_drm_probe. // /drivers/gpu/drm/nouveau/nouveau_drm.c 281 static int nouveau_drm_probe(struct pci_dev *pdev, 282 const struct