上篇文章《分层架构下的纯JDBC事务控制简单解决方案》中对四层架构应用中使用纯JDBC时的事务控制进行了论述,并提供了一个简单解决方案,有些网友也应该看到:在编写业务层中的方法时,事务处理的代码框架都一样,只是把持久层的操作组合起来,针对这种情况,我使用了【模板方法】模式对它进行了再度封装。添加以下几个接口和类:
1. 事务回调接口(回调方法有返回值):TransactionCallback.java
package com.tjitcast.common;
import com.tjitcast.dao.DaoException;
/**
* 事务回调接口
* @author qiujy
*/
public interface TransactionCallback<T> {
/**
* 要在事务中回调执行的方法
* @return 所指定类型的数据
* @throws DaoException 数据访问异常
*/
T doInTransaction() throws DaoException;
}
2. 事务回调接口(回调方法没有返回值):TransactionCallbackWithoutResult.java
package com.tjitcast.common;
import com.tjitcast.dao.DaoException;
/**
* 无返回值 的事务回调接口
* @author qiujy
*/
public interface TransactionCallbackWithoutResult {
/**
* 要在事务中回调执行的方法
* @throws DaoException 数据访问异常
*/
public void doInTransaction() throws DaoException;
}
3. 在事务中执行指定回调接口方法的模板类:TransactionTemplate.java
package com.tjitcast.common;
import com.tjitcast.dao.DaoException;
/**
* 在事务中执行指定回调接口方法的模板类
* @author qiujy
*/
public class TransactionTemplate {
/**
* 在事务里执行回调接口实现类中有返回值的方法
* @param <T> 返回值类型
* @param callback 回调接口
* @return 指定类型的返回值
* @throws DaoException 数据访问异常
*/
public static <T> T execute(TransactionCallback<T> callback) throws DaoException {
T result = null;
TransactionManager tx = ConnectionFactory.getTranManager();
try{
tx.beginTransaction();
result = callback.doInTransaction();
tx.commitAndClose();
}catch (DaoException e) {
tx.rollbackAndClose();
throw e;
}
return result;
}
/**
* 在事务里执行回调接口实现类中没有返回值的方法
* @param callback 回调接口
* @throws DaoException 数据访问异常
*/
public static void execute(TransactionCallbackWithoutResult callback) throws DaoException {
TransactionManager tx = ConnectionFactory.getTranManager();
try{
tx.beginTransaction();
callback.doInTransaction();
tx.commitAndClose();
}catch (DaoException e) {
tx.rollbackAndClose();
throw e;
}
}
}
添加以上几个接口和类后,业务逻辑层ServiceFacade类的代码可以修改成如下格式:
package com.tjitcast.service;
import java.util.List;
import com.tjitcast.common.TransactionCallback;
import com.tjitcast.common.TransactionCallbackWithoutResult;
import com.tjitcast.common.TransactionTemplate;
import com.tjitcast.dao.DaoException;
import com.tjitcast.dao.DaoFactory;
import com.tjitcast.dao.DeptDao;
import com.tjitcast.dao.EmployeeDao;
import com.tjitcast.entity.Dept;
import com.tjitcast.entity.Employee;
import com.tjitcast.entity.PageModel;
/**
* 业务层门面 --> 添加事务控制
* JDBC的事务默认自动提交方式,
* @author qiujy
*/
public class ServiceFacade {
private DeptDao deptDao = DaoFactory.getInstance("deptDao", DeptDao.class);
private EmployeeDao empDao = DaoFactory.getInstance("empDao", EmployeeDao.class);
/**
* 新增部门
* @param dept
*/
public void insertDept(final Dept dept){
TransactionTemplate.execute(new TransactionCallbackWithoutResult() {
public void doInTransaction() throws DaoException {
deptDao.insert(dept);
}
});
}
public void insertEmp(final Employee emp){
TransactionTemplate.execute(new TransactionCallbackWithoutResult() {
public void doInTransaction() throws DaoException {
empDao.insert(emp);
}
});
}
/**
* 获取所有部门的列表
* @return
*/
public List<Dept> getDeptList(){
return TransactionTemplate.execute(new TransactionCallback<List<Dept>>() {
public List<Dept> doInTransaction() throws DaoException {
return deptDao.getDeptList();
}
});
}
/**
* 获取指定部门下的员工分页列表
* @param deptId
* @param pageNo
* @param pageSize
* @return
*/
public PageModel<Employee> getEmpListByDeptId(final int deptId, final int pageNo, final int pageSize){
return TransactionTemplate.execute(new TransactionCallback<PageModel<Employee>>() {
public PageModel<Employee> doInTransaction() throws DaoException {
return empDao.getEmpListByDeptId(deptId, pageNo, pageSize);
}
});
}
/**
* 删除指定ID的部门
* @param id
*/
public void deleteDept(final int id){
TransactionTemplate.execute(new TransactionCallbackWithoutResult() {
public void doInTransaction() throws DaoException {
empDao.deleteByDeptId(id);
deptDao.delete(id);
}
});
}
}
这样,业务层的事务处理也被透明化了,你又只需要关注业务逻辑的组合,是不是写起来更爽啦。。
不理解??那就得先去学看看GOF设计模式之模板方法;Java核心技术之匿名内部类。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qjyong/archive/2010/04/21/5513638.aspx#1353354
分享到:
相关推荐
非常常用的JavaEE四层架构下的纯JDBC事务控制简单解决方案。Eclipse工程。详情参看:http://blog.csdn.net/qjyong/archive/2010/04/08/5464835.aspx
2. **技术实现架构**:系统采用分层架构,包括资源层、业务层、集成层、管理与控制层、表现层和客户层。技术组件包括JDBC、Hibernate、XML配置、日志管理、安全控制、任务/事务处理、分析引擎等,支持数据导入导出、...
"生产调度管理信息系统解决方案" 智能生产调度管理系统是基于生产计划的实时工艺信息和设备运行状态信息,提供包括计划执行与修正、资源合理利用、产量与质量统计分析、平稳工况的优化调度、异常工况的动态调度、...
SSH2的整合使用,使得Java EE应用的分层架构更加清晰,通常分为表现层(Struts 2)、业务逻辑层(Spring)、数据访问层(Hibernate)。这样的分层设计有利于团队协作,每个层次可以独立开发和测试,降低了复杂性。...
【中间件】是一种软件服务,它位于操作系统和应用程序...总的来说,WAS作为中间件解决方案,为电子商务平台提供了强大而灵活的基础,通过其丰富的功能和对企业级需求的支持,能够构建稳定、安全、高性能的Web应用系统。
文章中设计的数据迁移模块采用了分层架构,包括表示层、元数据层、业务逻辑层和数据访问层。这种结构有助于模块化和解耦,提高代码的可维护性和可扩展性。 【数据类型映射】 在迁移过程中,不同的数据库系统可能...
本资料集围绕“J2EE构建企业级应用解决方案”这一主题,旨在帮助开发者理解并掌握在J2EE平台上开发复杂企业应用的关键技术。 1. **J2EE架构**:J2EE架构由多个层次组成,包括客户端层、Web层、业务逻辑层(EJB)和...
【Java EE轻量级解决方案——SSH】是一种广泛应用于企业级应用开发的技术栈,它由三个主要部分组成:Spring、Struts和Hibernate。本章节重点讨论的是Spring框架的深入理解和应用。 Spring是Java EE平台的核心组件,...
1. **分层架构**:Spring 推荐采用 MVC(Model-View-Controller)架构,Action 层负责视图控制,Service 层处理业务逻辑,DAO 层专注数据访问。结构清晰,职责明确。 2. **依赖注入(DI)与组件扫描**:通过 @...
Spring 框架简介 Spring 是一个开源的 Java 应用框架,由 Mark Eagle 贡献并维护,他是一位在Atlanta...Spring还提供了丰富的数据库组件支持,如数据访问工具和ORM解决方案,进一步增强了其在企业应用开发中的实用性。
它提供了一个分层架构,将模型、视图和控制器分离,提高代码的可重用性和可测试性。 8. **Spring Boot**:为了简化Spring应用程序的初始化和配置,Spring推出了Spring Boot。它通过默认配置和自动配置机制,使得...
它以其轻量级、松散耦合的特性著称,拥有一个分层架构,允许用户根据需求选择组件,同时也为J2EE应用提供了一体化的解决方案。Spring可以与其他框架如Struts、Hibernate、EJB等无缝集成,因此被称为“框架的框架”。...
总结起来,SSH架构结合了Spring的灵活控制反转和面向切面编程、Struts2的MVC设计模式和拦截器机制,以及Hibernate的对象关系映射能力,形成了一个全面、高效的Java Web开发解决方案。这个架构能够帮助开发者更专注于...
其次,Spring MVC是用于构建Web应用程序的模块,它提供了一种分层架构,使得控制器、视图、模型可以松耦合地工作。在4.0版本中,Spring MVC引入了更好的异步处理支持,增强了模板引擎集成,以及对Servlet 3.0 API的...
总结来说,本解决方案提供了一种基于配置文件的Java三层架构,用于对数据库进行增删改查操作。这种设计使系统更具有灵活性、可扩展性和可维护性,同时也简化了数据库环境的管理和变更。通过合理地划分各层职责,以及...
Spring的事务管理抽象提供了一致的编程模型,无论底层使用何种事务技术,如JTA或JDBC事务。Spring还提供了一个轻量级的数据访问框架,使得开发者可以以面向对象的方式操作数据库,不必直接与JDBC打交道。同时,...
Spring 是一个广泛应用于企业级 Java 开发的开源框架,它以其分层架构、全面的 JavaEE 解决方案和轻量级特性而受到开发者喜爱。Spring 的核心理念是控制反转(IoC)和面向切面编程(AOP),这两个概念有助于降低系统...
1. **分层架构**:Spring 框架采用了高度模块化的设计,提供了多种层次的服务,用户可以根据项目需求选择性地使用其中的一部分功能。这种灵活性使得 Spring 成为了许多 Java 开发项目的首选。 2. **POJO 编程**:...