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