我们在使用Dao时,如以下代码,先插入新记录,再进行更新:
personDao.insertPerson (person); // Starts transaction
person.setLastName("Begin");
personDao.updatePerson (person); // Starts a new transaction
因为没有显式地启动事务,iBatis会认为这是两次事务,分别从连接池中取两次Connection。
我们所写的Dao子类(继承自com.ibatis.dao.client.template.SqlMapDaoTemplate)的每一个Dao方法已经默认为一个事务(通过动态代理)。
而在业务层,应该有一个类来统管Dao子类的事务,iBatis是通过DaoManager类来作这件事的,如下:
DaoManager provides access to all DAOs it manages and also allows transactions to be committed and ended (possibly rolled back)
众Dao子类由DaoManager产生,如:
DaoManager daoManager = DaoManagerBuilder.buildDaoManager(reader);
UserDao userDao = (UserDao) daoManager.getDao(UserDao.class);
UserDao是用户自己定义的接口,获得的其实是在dao.xml中指定的相对应的 SqlMapDao实现类,从而实现了松藕合。在良好的分层设计中,业务层(service包)只需要知道Dao接口,而不去关心其具体怎么实现。如果显式地声明事务处理语句,如下:
try {
daoManager.startTransaction();
personDao.insertPerson (person);
person.setLastName("Begin");
personDao.updatePerson(person);
otherDao.doSomething(other);
...
daoManager.commitTransaction();
} finally {
daoManager.endTransaction();
}
这样就保持了原子性,整体为一个事务,要么全部执行成功,否则回滚。
现在唯一的问题就是,dao层的事务是否已经放弃,否则产生事务嵌套问题对性能会有影响(杞人忧天?)
当然,iBatis 完全可以这么做:建一个声明式接口:IService,再使用动态代理,将用户自己的Serivce子类通过动态代理自动包上事务处理的代码,默认每一个业务方法为一个事务。
大师的心如果能轻易揣测,就是不大师了:),估计大师认为这样属于过度设计,他认为把这种灵活性交给用户是合适的,相当多的service 方法只调用一个Dao方法,例如CRUD操作。
再补充一下,iBatis中对事务的处理是可配置的,最常用的Type是"JDBC",也可以声明为"JTA"或"EXTERNAL".
分享到:
相关推荐
标题 "Ibatis 事务处理" 涉及到的是在Java Web开发中使用Ibatis框架进行数据访问时的事务管理。Ibatis是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或者Java注解中,从而提供了灵活的数据...
根据提供的文件信息,本文将详细解析如何在Spring与ibatis框架整合时,通过特定配置来保留ibatis事务处理机制,并实现对事务的自定义控制。文章将围绕标题、描述及部分代码片段展开讨论。 ### Spring与ibatis整合...
在Java应用中,Ibatis与SQL Server、MySQL等数据库配合,可以实现高效的数据库访问和事务处理。 **1. 什么是事务** 事务是一组数据库操作,这些操作被视为一个整体,要么全部成功,要么全部回滚。在数据库管理系统...
根据提供的文件信息,本文将详细解析Spring与iBatis整合时如何保留并使用iBatis事务管理机制,以及如何在应用程序中实现手动控制事务的方法。 ### Spring与iBatis整合 Spring框架是一个全面的企业级应用开发框架,...
本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与Spring及Struts2的集成。 首先,让我们来看一下“一对多”关系。在数据库设计中,一对多关系很常见,比如一个用户可以有多个订单。在Ibatis中,...
它有助于开发者理解和掌握在实际项目中如何优雅地处理数据库事务,提高代码质量。通过分析和实践这样的Demo,我们可以更好地理解Spring的声明式事务管理以及如何与iBatis协同工作,提升我们的编程技能。
iBatis事务处理 iBatis提供了两种事务管理方式:JDBC事务管理和MANAGED事务管理。默认情况下,iBatis使用JDBC事务管理。开发者可以通过配置`<transactionManager>`元素来选择合适的事务管理策略,并确保事务的一致...
在JTA分布式事务的场景下,iBATIS作为数据访问层,参与到事务处理中,其执行的SQL操作会受到JTA的控制,确保在事务中的所有数据库操作要么全部成功,要么全部回滚。 MySQL是广泛使用的开源关系型数据库管理系统,它...
本示例“spring+ibatis声明式事务Demo”将探讨如何在Spring与iBatis集成环境中使用声明式事务管理。声明式事务管理允许开发者通过配置来控制事务,无需在代码中显式处理事务开始、提交和回滚。 **Spring框架** 是一...
### iBatis批量处理知识点详解 #### 一、iBatis基本实现 iBatis(现已更名为MyBatis)是一款优秀的持久层框架,它支持定制化SQL、存储过程及高级映射。iBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果...
本文将深入探讨如何在Spring、Struts和iBATIS这三大流行框架的集成环境中实现数据读写分离以及事务控制。我们将不涉及具体的代码实现,而是侧重于理论背景和设计原则。 首先,让我们理解数据读写分离的概念。数据...
本工程以“银行账号转账”为例子演示了如何处理Spring、Ibatis结合MySQL数据库使用时的事务操作 本工程编码方式:UTF-8 须执行的SQL语句: CREATE DATABASE `test`; USE `test`; CREATE TABLE `lm_bank_card` ( `...
- 事务配置问题(如`spring&ibatis事务配置问题.htm`):整合过程中常见的问题可能涉及到事务的隔离级别、事务超时、回滚规则等,需要正确配置Spring的事务管理器以确保事务正确运行。 3. 文件编码转换: - 在...
Ibatis的配置文件`sqlmapConfig.xml`包含了数据源、事务管理器、SqlSessionFactory等核心设置。在Java代码中,可以使用如下的方式加载配置文件: ```java String resource = ...
在源码中,`org.apache.ibatis.transaction.jdbc.JdbcTransaction`和`org.apache.ibatis.transaction.managed.ManagedTransaction`分别对应JDBC和Spring的事务管理。 十、缓存机制 iBatis提供了本地缓存和二级缓存...
"spring+iBatis处理1对多数据表实例"展示了如何将iBatis与Spring框架集成,实现更高级的数据操作。Spring的依赖注入可以简化iBatis的配置,而Spring的事务管理则能确保数据的一致性。1对多关系的处理通常涉及到集合...
5. 事务管理:介绍如何使用Ibatis进行事务控制,包括手动和自动事务。 6. 缓存:Ibatis提供了本地缓存和二级缓存机制,有助于提高性能。 7. 执行性能:提供优化建议,如批处理、缓存使用等,以提升应用程序的运行...
1. 映射关系:Hibernate提供了一种对象关系映射(ORM)机制,自动处理对象与数据库之间的转换,而iBATIS需要开发者手动编写SQL语句。 2. 开发效率:在相同需求下,iBATIS的工作量可能大于Hibernate,因为需要手写SQL...
`SqlMapClient`是ibatis的核心接口,用于执行SQL语句和处理结果集。开发者可以通过`SqlMapClient`实例来执行预定义的SQL语句,并将结果集转换为Java对象。此外,`SqlMapClient`还提供了事务管理和缓存管理等功能,以...