您的位置:首页 > 运维架构 > 网站架构

分层架构下的纯JDBC事务控制简单解决方案

2010-05-11 09:00 281 查看
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);
}
});
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: