日期:2014-05-16  浏览次数:20447 次

一个dao模型,带事务和异常处理,请指正!

简介:
一个纯jdbc的dao模型,参考网上多篇相关技术文章,重点包括:
1.事务处理;
2.模板设计;
3.异常处理;
其中事务和异常方面一直也是争议比较大的地方,希望大家多指正,提出宝贵的意见。

首先是dao的结构描述:

首先是一些基础类,包括:

dbutil: 数据库操作基础类(获取数据库连接、获取事务管理器等)

transactionTemplate: 事务处理模板类

transactionManager: 事务管理器

transactionCallback: 事务处理回调方法(返回结果)

transactionCallbackWithoutResult: 事务处理回调方法(不返回结果)

详细类容请参考源码:


?

DBUtil:

?

package com.bts.db;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.apache.log4j.Logger;

import com.bts.exception.dao.DaoException;
import com.bts.util.LogUtil;
import com.bts.util.PropertiesRW;

/**
 * @author huangfox
 * @serial 数据库连接池 采用dbcp组件。 <br>
 * 
 */
public class DBUtil {
	private static Logger logger = Logger.getLogger(DBUtil.class);
	private static BasicDataSource ds = null;
	private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

	static {
		try {
			PropertiesRW proRW = new PropertiesRW("src/dbcpParamter.properties");
			Properties conf = proRW.getProperties();
			ds = (BasicDataSource) BasicDataSourceFactory
					.createDataSource(conf);
		} catch (Exception e) {
			logger.error(LogUtil.logInfo("初始化数据库连接池时发生异常!", e));
		}
	}

	/**
	 * 根据数据库的默认连接参数获取数据库的Connection对象,并绑定到当前线程上
	 * 
	 * @return 成功,返回Connection对象,否则返回null
	 * @throws DaoException
	 */
	public static synchronized Connection getConnection() throws DaoException {
		// 先从当前线程上取出连接实例
		Connection conn = tl.get();

		// 如果当前线程上没有Connection的实例
		if (null == conn) {
			try {
				// 从连接池中取出一个连接实例
				conn = ds.getConnection();
				// 把它绑定到当前线程上
				tl.set(conn);
			} catch (SQLException e) {
				throw new DaoException("获取数据库连接时发生异常!", e);
			}
		}
		return conn;
	}

	/**
	 * 获取事务管理器
	 * 
	 * @return 事务管理实例
	 * @throws DaoException
	 */
	public static synchronized TransactionManager getTranManager()
			throws DaoException {
		return new TransactionManager(getConnection());
	}

	/**
	 * 关闭数据库连接,并卸装线程绑定
	 * 
	 * @param conn
	 *            要关闭数据库连接实例
	 * @throws DaoException
	 */
	protected static void close(Connection conn) throws DaoException {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				throw new DaoException("关闭连接时出现异常!", e);
			} finally {
				// 卸装线程绑定
				tl.remove();
			}
		}
	}

	/**
	 * 关闭ResultSet、Statement。
	 * 
	 * @param rs
	 * @param stat
	 * @throws DaoException
	 */
	public static void free(ResultSet rs, Statement stat) throws DaoException {
		try {
			if (rs != null)
				rs.close();
			if (stat != null)
				stat.close();
		} catch (SQLException e) {
			throw new DaoException("关闭ResultSet/Statement时出现异常!", e);
		}
	}
}
?

TransactionCallback

?

package com.bts.db;

import com.bts.exception.dao.DaoException;

/**
 * @author huangfox
 * @serial 事务回调接口
 */
public interface TransactionCallback<T> {
	/**
	 * 要在事务中回调执行的方法
	 * 
	 * @return 所指定类型的数据
	 * @throws DaoException 
	 */
	T doInTransaction() throws DaoException;
}
?

TransactionCallbackWithoutResult:

?

package com.bts.db;

import com.bts.exception.dao.DaoException;


/**
 * @author huangfox
 * @serial 无返回值的事务回调接口
 */
public interface TransactionCallbackWithoutResult {
	/**
	 * 要在事务中回调执行的方法
	 * @throws DaoException 
	 * 
	 */
	public void doInTransaction() throws DaoException;
}
?

TransactionManager:

?

package com.bts.db;

import java.sql.Connection;
import java.sql.SQLException;

import com.bts.exception.dao.DaoException;

/**
 * @author huangfox
 * @serial 事务管理器
 */
public class TransactionManager {