日期:2014-05-16 浏览次数:20513 次
简介:
一个纯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 {