`
kang
  • 浏览: 472818 次
  • 性别: 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应用程序至关重要。

    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`类来创建...

    子线程任务发生异常,主线程事务如何回滚

    子线程任务发生异常,主线程事务如何回滚? 本文将详细探讨当子线程任务发生异常时,如何让主线程捕获到该异常并进行事务的回滚。...在主线程中,我们可以使用 try-catch 语句来捕获异常,并进行事务的回滚。

Global site tag (gtag.js) - Google Analytics