`
kang
  • 浏览: 474660 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在S2DAO例子程序基础上实现事务管理(JDBC中的事务管理,出错时进行回滚)

    博客分类:
  • NBS
阅读更多

<!-- --><!-- --> <!-- -->

要求能 BL的方法 访问 多少个 DAO,一旦失 都能

解决方案:在 S2DAO 例子程序基础上实现事务管理( JDBC 中的事务管理,出错时进行回滚)

 

核心问题:只使用一个 container (该容器内不仅可以装 DAO ,比如我们前面熟知的 EmployeeDao DepartmentDao ;还可以装业务逻辑,比如 HogeImpl 类的 foo 方法)

 

核心配置文件 HogeClient.dicon

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"

"http://www.seasar.org/dtd/components24.dtd">

 

<components>

 

    <include path="dao.dicon"/>

       <include path="j2ee.dicon"/>

      

       <component class="examples.dao.EmployeeDao ">

              <aspect>dao.interceptor</aspect>

       </component>

       <component class="examples.dao.DepartmentDao ">

              <aspect>dao.interceptor</aspect>

       </component>

      

    <component class="examples.tx.HogeImpl ">

        <aspect>j2ee.requiredTx </aspect>

    </component>

   

</components>
 

 

测试类 HogeClient.java:

package  examples.tx;

 

import org.seasar.framework.container.S2Container;

import org.seasar.framework.container.factory.S2ContainerFactory;

 

import examples.dao.DepartmentDao;

import examples.dao.EmployeeDao;

 

public class HogeClient {

 

       private static final String PATH = "examples/tx/HogeClient.dicon" ;

 

       public static void main(String[] args) {

              S2Container container = S2ContainerFactory.create ( PATH );

              container.init();

 

              HogeImpl hoge = (HogeImpl) container.getComponent(Hoge. class );

 

              hoge.foo();

 

       }

}
 

 

 

接口 Hoge.java:

package  examples.tx;

 

public interface Hoge {

 

    public void foo();

   

} 
 

 

实现类 HogeImpl.java:

package  examples.tx;

 

import examples.dao.Department;

import examples.dao.DepartmentDao;

import examples.dao.Employee;

import examples.dao.EmployeeDao;

 

public class HogeImpl implements Hoge {

      

       private EmployeeDao empDao ;

       private DepartmentDao deptDao ;

 

       public void setEmpDao(EmployeeDao empDao) {

              this . empDao = empDao;

       }

 

       public void setDeptDao(DepartmentDao deptDao) {

              this . deptDao = deptDao;

       }

 

       public void foo () {

 

              try {

 

                     //insert emp

                     Employee emp = new Employee();

                     emp.setEmpno( 1 );

                     emp.setDeptno(10);

 

                     empDao.insert(emp);

 

                     System. out .println(emp);

 

                     //insert dept

                     Department dept = new Department();

                     dept.setDeptno( 1 );

                     dept.setDname( "foo" );

 

                     deptDao.insert(dept);

 

                     System. out .println(dept);

 

              } finally {

                     // container.destroy();

              }

       }

 

} 

-》在实现类的foo方法中,有两段跟数据库打交道的操作,算是一个事务。(20090519追加)


 

备注:J2ee.dicon文件的配置请参考前面一篇blog

(对于requiredTx的配置原先就有,不用动它;注释掉默认的HSQL,使用PostgreSQL数据库)。

 

-》HSQL是一种内存数据库,PostgreSQL是实实在在的数据库。(20090519追加)

 

 

说明:这个实现综合了官网上事务的自动控制部分<!-- --><!-- --> <!-- -->http://s2container.seasar.org/2.3/ja/tx.html

和下载的s2DAO示例程序。

 

首先自己在原先示例程序基础上再做个例子,合并两个dao的插入操作,然后将这段逻辑放入foo方法,在配置文件中对这个业务逻辑进行事务管理,从而实现了对两个dao的insert等操作进行事务处理。

 

BL Business Logic 的事 务处 测试结 果:
在下面的情况下 测试 2 dao insert方法,在一个 BL方法中先后 行,第一个 insert成功,第二个 insert 。判断 测试结 果的方法是 看数据 表里的数据。
测试 1:当不使用事 务时 ,第一个表插入成功,第二个表插入失
测试 2:当使用事 务时 ,第一个表插入失 ,第二个表插入失

 

结论 Dao BL层对 象从一个 S2Container DIContainer)中 取, BL 象添加事 要求

 

说明:实现思路和测试说明来源于部门首席技术专家!

 

 

<!-- --><!-- -->

<!-- -->

补充:

container.init(); 执行这句时,进行才初始化工作。

会调用 setEmpDao setDeptDao 方法,将从容器中拿出的 empDao deptDao 对象赋值给 HogeImpl 中的两个成员变量 empDao deptDao

 

分享到:
评论
3 楼 qbqopen 2008-12-26  
那真晕,我们还在继续
元旦过后就开始封闭开发
用鬼子的网络
2 楼 kang 2008-12-25  
qbqopen 写道

兄台表达能力真好
我想了半天也没总结出来这么一篇来
呵呵

呵呵,谢谢你的表扬哦!听着心里美滋滋的:)
可是我们不使用这个s2DAO了,不继续往下调查了,因为日本客户改变主意了,唉:(
1 楼 qbqopen 2008-12-25  
兄台表达能力真好
我想了半天也没总结出来这么一篇来
呵呵

相关推荐

    spring 简单实例 事务回滚

    在这个“spring简单实例 事务回滚”的案例中,我们将深入探讨Spring如何处理事务回滚,以及它是如何在Java源码层面实现这一功能的。 首先,让我们理解什么是事务。在数据库操作中,事务是确保数据一致性的重要机制...

    简单的c#事务回滚实例代码

    本实例将详细讲解如何在C#中实现简单的事务回滚功能,以应对在执行多条SQL语句时可能出现的错误。 首先,我们需要理解事务的基本概念。事务是数据库操作的基本单元,它包含一组操作,这些操作要么全部成功,要么...

    JDBC事务管理的简单实现

    "JDBC事务管理的简单实现" 在JDBC编程中,事务管理是非常重要的一部分。为了实现数据一致性,需要在代码中显示的调用Connection方法的事务相关API来完成工作。下面是关于JDBC事务管理的简单实现的知识点。 一、...

    Spring/SpringMVC/MyBatis整合+事务回滚

    7. **实现事务回滚**:当在@Transactional注解的方法中发生异常时,Spring会自动回滚事务。例如,如果在保存数据时发生错误,整个事务将被回滚,保证数据的一致性。 8. **测试与调试**:完成整合后,通过编写单元...

    spring JDBC事务管理

    标题中的“Spring JDBC事务管理”是指在Spring框架中如何利用JDBC进行数据库操作时的事务控制。Spring提供了多种方式来管理事务,使得开发者能够在复杂的业务逻辑中更好地控制数据的持久化过程,确保数据的一致性和...

    oracle 事务 回滚 存储过程

    在Oracle数据库环境中,事务管理与存储过程的结合是实现数据一致性、事务回滚以及错误处理的关键技术之一。本文将深入探讨“Oracle事务回滚存储过程”这一主题,旨在理解其核心概念、工作原理以及实际应用。 ### ...

    Spring事务管理A方法内部调用B方法的回滚问题测试代码

    在这个例子中,我们可能关注的是声明式事务管理,因为它是Spring中最常用的方式。 首先,我们需要在Spring配置文件中启用事务管理器,例如使用`&lt;tx:annotation-driven&gt;`标签。这将扫描带有@Transactional注解的方法...

    oracle 在java中的事务处理和异常回滚。

    在Java编程中,Oracle...总的来说,Oracle在Java中的事务处理和异常回滚是通过JDBC接口实现的,它保证了数据库操作的原子性、一致性、隔离性和持久性。理解并熟练掌握这些概念对于开发健壮的Java应用程序至关重要。

    NET 2.0中的事务处理、回滚处理

    回滚处理是事务管理的重要部分,它允许在事务执行过程中遇到错误或不满足业务规则时撤销所有变更。在.NET 2.0中,无论是显式还是隐式事务,都可以通过抛出异常或调用`Rollback`方法来触发回滚。回滚事务可以防止脏...

    JDBC的事务初探

    本篇将深入探讨JDBC中的事务处理,以及如何在Java应用程序中实现事务控制。 **一、JDBC事务的基本概念** 事务(Transaction)是数据库操作的一个逻辑单元,包含一组操作,这些操作要么全部执行,要么全部不执行。...

    JDBC中的 DAO

    5. **事务管理**:在业务层调用DAO时,包裹在try-catch-finally块中,进行事务的开启、提交或回滚。 **4. 示例代码** ```java // UserDAO.java public interface UserDAO { void addUser(User user); List&lt;User&gt;...

    java 数据库操作,事务回滚

    java 应用程序操作数据库实例,若出现sql异常则事务回滚。

    导入Excel到数据库的完整案例,带数据校验/事务回滚

    这可以通过在Web或Windows应用程序中创建一个数据网格视图来实现,将Excel数据动态加载到控件中展示。用户可以查看、编辑甚至排序数据,然后再决定是否导入。 日志功能是追踪系统运行状态的重要工具。在导入过程中...

    使用代理实现Hibernate Dao层自动事务

    1. Spring AOP:AOP允许我们在程序运行时,动态地将一些关注点(如事务管理)插入到目标对象的方法调用中。通过定义切面(Aspect),我们可以指定哪些方法需要进行事务管理,并定义事务的传播行为和异常回滚策略。 ...

    Spring+Mybatis整合事务回滚

    花了一晚上时间终于搞出来了Spring整合Mybatis事务回滚(Mysql数据库),控制Service层中的多次插入操作,多次操作整体是一个事务。 里面有缘嘛和jar包,资源为war包,导入即可。运行Test类中的测试代码即可。 建表...

    JDBC事务管理.docx

    JDBC事务管理是数据库操作的重要组成部分,特别是在多用户并发访问数据库的环境中,保证数据的一致性和完整性至关重要。本文主要探讨了事务的基本概念、ACID原则、数据库并发问题以及解决方案。 首先,事务是数据库...

    JDBC事务操作例子所需jar包

    在本例中,我们关注的是与MySQL数据库交互时使用JDBC进行事务处理所需的相关jar包。 首先,我们需要`mysql-connector-java.jar`,这是MySQL提供的驱动程序,用于建立Java应用程序与MySQL数据库之间的连接。这个jar...

    JDBC事务管理项目

    “JDBC事务管理项目”涵盖了如何在Java应用中利用JDBC进行事务控制,包括开启手动事务、提交、回滚以及设置事务隔离级别等。理解并掌握这些知识对于开发健壮的数据库应用至关重要,能够确保数据的完整性和一致性。

    基于JDBC实现的DAO

    基于JDBC实现的DAO(Data Access Object)是一种在Java编程中常见的数据访问模式,它用于封装对数据库的操作,使得业务逻辑层与数据访问层解耦,提高了代码的可复用性和可维护性。以下是关于基于JDBC实现DAO的一些...

    批量导入Excel数据到数据库,带数据校验/事务回滚

    3. **事务管理**:在导入过程中,使用数据库事务可以确保数据的一致性。事务可以包裹整个导入过程,一旦发生错误,所有更改都将被回滚,保持数据库状态不变。在.NET中,可以使用ADO.NET的`TransactionScope`类来创建...

Global site tag (gtag.js) - Google Analytics