Mybatis是一个支持自定义SQL语句,存储过程,高级映射的数据持久化框架。
它封装了JDBC,在框架中隐藏了几乎所有的JDBC的API,这里说下从源码的角度Mybatis 3.x (笔者用的是3.2.8)是如何封装JDBC来实现事务处理的。
回忆下mybatis是怎么使用事务管理的,session.commit(),session.rollback(), JDBC呢,是connection.commit(),connection.rollback()。所以这篇文章的内容就变成了如何从session.commit()到connection.commit()。
首先从session来看看,我们获得一个session对象其实是DefaultSqlSession对象,这个类中的commit() 方法如下。
public void commit() { commit(false); } public void commit(boolean force) { try { executor.commit(isCommitOrRollbackRequired(force)); dirty = false; } catch (Exception e) { throw ExceptionFactory.wrapException("Error committing transaction. Cause: " + e, e); } finally { ErrorContext.instance().reset(); } } private boolean isCommitOrRollbackRequired(boolean force) { return (!autoCommit && dirty) || force; }
然后到CachingExecutor 中的方法
public void commit(boolean required) throws SQLException { delegate.commit(required); tcm.commit(); } //也许对这执行commit的对象不熟悉,看下面 private Executor delegate; private TransactionalCacheManager tcm = new TransactionalCacheManager();
所以真正我们关心的事务是另外一个Executor,BaseExecutor中commit()方法
public void commit(boolean required) throws SQLException { if (closed) throw new ExecutorException("Cannot commit, transaction is already closed"); clearLocalCache(); flushStatements(); if (required) { transaction.commit(); } }
前面两个方法是跟缓存相关,只有最后一个才是我们关心的,JDBCTransaction类中的commit()
public void commit() throws SQLException { if (connection != null && !connection.getAutoCommit()) { if (log.isDebugEnabled()) { log.debug("Committing JDBC Connection [" + connection + "]"); } connection.commit(); } }
现在我们明白了,JDBCTransaction中包装了一个connection的对象。这也是我们在使用mybatis配置文件时设置的事务管理类。
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <!--这里--> <property name="..." value="..."/> </transactionManager> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
相关推荐
MyBatis源码分析 MyBatis是一款流行的Java持久层框架,提供了强大的数据库访问能力,本文将对MyBatis的源码进行深入分析,从而帮助读者更好地理解MyBatis的工作机理。 1. MyBatis入门 MyBatis是一款基于Java的...
本资源“mybatis源码分析视频”是针对MyBatis框架进行深入剖析的教程,通过视频和文档的形式帮助学习者理解其内部工作机制。 1. **MyBatis简介** MyBatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集。...
MyBatis是一款优秀的持久层框架,它的源码分析对于深入理解其工作原理和优化数据库操作至关重要。MyBatis的核心设计理念是简化SQL操作,通过XML或注解的方式将SQL与Java代码分离,同时提供强大的动态SQL功能。 首先...
本系列源码解析的方式将从 MyBatis 的源码入手,深入分析 MyBatis 的设计思路和实现机制。 2. 容器的加载与初始化 2.1 config 文件解析 XMLConfigBuilder.parseConfiguration 方法是 MyBatis 中的核心方法之一,...
MyBatis的源码分析对于理解其工作原理、优化数据库交互以及进行二次开发至关重要。通过思维导图的方式,我们可以更直观、系统地理解MyBatis的架构和流程。 首先,MyBatis的核心概念包括SqlSessionFactory、...
- 分析MyBatis的源码,了解其内部实现机制,如如何解析XML配置文件,如何生成动态代理等。 - 学习如何配置MyBatis环境,包括设置数据源、创建SqlSessionFactory等。 - 熟悉Mapper接口和XML映射文件的编写,理解SQL与...
通过对MyBatis源码的分析,开发者可以更深入地理解其内部运作机制,从而更好地优化应用,解决实际问题。同时,这也是一种提升个人技术水平和解决问题能力的有效途径。在阅读源码过程中,可能会遇到各种设计模式和...
源码分析有助于理解MyBatis如何根据结果集和结果映射配置创建目标对象。 8. **TypeHandler** TypeHandler是MyBatis中处理Java类型和JDBC类型之间转换的关键组件。通过自定义TypeHandler,我们可以实现对特殊类型的...
源码分析可以从以下几个主要方面展开: 1. **架构设计**:Mybatis 的核心组件包括SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession和Executor等。SqlSessionFactoryBuilder用于创建SqlSessionFactory,它...
- MyBatis提供了一个强大的插件机制,用户可以自定义拦截器实现SQL执行前后的增强功能,如日志、性能分析等。 7. MyBatis的Spring整合 - MyBatis与Spring整合后,可以使用Spring的事务管理,简化了事务控制和依赖...
通过对MyBatis 3.4.1源码的阅读和分析,开发者可以掌握MyBatis的内部工作流程,了解如何编写更高效、更灵活的数据访问代码。同时,对于想要深入持久层框架开发或者定制MyBatis功能的人来说,源码学习是必不可少的。
综上所述,Mybatis源码分析涵盖了大量的知识点,包括设计思想、架构组件、缓存机制、事务处理以及与Spring的整合等。通过深入源码的学习,开发者能够更加精准地掌握Mybatis的内部机制,以及如何在实际项目中高效地...
通过分析这些源码,初学者不仅可以理解MyBatis的基本工作流程,还能深入学习到Java编程、反射、AOP(面向切面编程)等相关知识。同时,这也有助于掌握实际项目中如何优雅地集成MyBatis,提升数据库操作的灵活性和...
MyBatis3是一款著名的Java持久层框架,它简化了数据库操作并与对象...通过对MyBatis3源码的深入理解和分析,我们可以更高效地利用其特性,提高开发效率,同时也能了解其内部的工作原理,有助于解决实际问题和优化性能。
在深入探讨MyBatis-Plus源码之前,我们先了解一下MyBatis-Plus的基本概念和作用。 MyBatis-Plus是对MyBatis框架的一种增强,它在MyBatis的基础上进行了功能扩展,比如自动填充字段、条件构造器、一键生成代码等,极...
在深入分析MyBatis 3.4.5源码之前,我们先理解一下框架的核心概念: 1. **SqlSessionFactory**: 是MyBatis的核心,它是一个工厂类,用于创建SqlSession对象。SqlSessionFactory由SqlSessionFactoryBuilder通过读取...
源码分析是理解框架工作原理的重要途径,通过阅读MyBatis的源码,我们可以深入学习其内部机制,包括SQL动态生成、结果映射、事务管理等方面。 1. SQL动态生成:MyBatis的核心之一是SQL动态语句。在XML配置文件或...
2. **源码分析** `mybatis-3.2.2-sources.jar` 包含了MyBatis的源代码,开发者可以通过阅读源码了解MyBatis内部的工作原理,如SqlSession、Executor、Mapper接口等核心组件的实现,以及动态SQL的处理方式。这对于...
源码分析时,会了解到SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession等关键类的作用,它们构成了MyBatis的主要工作流程。 SqlSessionFactoryBuilder用于构建SqlSessionFactory,这是MyBatis的核心工厂,...