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