package dao.oracleImpl;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.log4j.Logger;
import dao.Transactable;
import dao.TransactionInterface;
/**
* 实现了事务接口的DAO帮助类
* @author Administrator
*
*/
abstract class BaseDAO implements Transactable {
private Logger logger = Logger.getLogger(this.getClass()); //Log4j日志工具
private Transaction trans; //与该帮助类关联的事务对象
private static final String DRIVER="oracle.jdbc.driver.OracleDriver";
private static final String URL="jdbc:oracle:thin:@127.0.0.1:1521:SZSX";
private static final String USERNAME="system";
private static final String PASSWORD="ok";
/**
* 获取Connection 若要实现事务,必须使用该方法获取Connection而不是自己创建
* @return 获取到的Connection,若当前已启用事务,则获取的将是各DAO共用的Connection以实现事务操作
* @throws Exception 各种原因导致的获取Connection失败
*/
Connection getConnection() throws Exception{
logger.debug("正在准备获取Connection");
if(trans !=null && trans.getConnection() !=null){
logger.debug("当前已开启事务,返回事务用Connection");
return trans.getConnection();
}else {
logger.debug("判断Connection为空,构建Connection");
try {
logger.debug("正在加载驱动");
Class.forName(DRIVER);
logger.debug("驱动加载成功,正在构建Connection");
Connection con = DriverManager.getConnection(URL,USERNAME,PASSWORD);
logger.debug("Connection构建成功");
return con;
} catch (ClassNotFoundException e) {
logger.warn("JDBC驱动加载失败");
throw e;
} catch (SQLException e) {
logger.warn("构建Connection失败");
throw e;
}
}
}
/**
* 通过SQL语句构造PreparedStatement
* @param sql 构造PreparedStatment所使用的SQL语句
* @return 构造完成的PreparedStatement
* @throws Exception 各种原因导致的构造PreparedStatement失败
*/
PreparedStatement getPreparedStatement(String sql) throws Exception{
logger.debug("即将通过SQL语句:"+sql+"\t构建PreparedStatement");
Connection con =null;
PreparedStatement pst=null;
try {
con = getConnection();
pst = con.prepareStatement(sql);
logger.debug("构建PreparedStatement成功");
return pst;
} catch (Exception e) {
logger.warn("构建PreparedStatement失败");
throw e;
}
finally{
if(con !=null && pst ==null){
logger.debug("为了保证系统正常运行,即将关闭已获取的Connection并返回空PreparedStatement");
closeAll(null, con);
logger.debug("系统已经从异常中恢复");
}
}
}
/**
* 执行一个SQL语句(若已启用事务,则该方法不会关闭关联的Connection连接)
* @param sql 要执行的SQL语句
* @return 该语句影响的行数
* @throws Exception 各种原因导致的执行失败
*/
int executeUpdate(String sql) throws Exception{
logger.debug("即将执行SQL语句:"+sql);
PreparedStatement pst =null;
try {
pst = getPreparedStatement(sql);
int count = pst.executeUpdate();
logger.debug("SQL语句执行成功,返回结果:"+count);
return count;
} catch (Exception e) {
logger.warn("SQL语句:"+sql+"\t执行失败");
throw e;
}finally{
if(pst !=null){
closeAll(pst);
}
}
}
/**
* 执行一个PreparedStatement(若已启用事务,则该方法不会关闭关联的Connection连接)
* @param pst 要执行的PreparedStatement语句
* @return 该操作影响的行数
* @throws Exception 各种原因导致的执行失败
*/
int executeUpdate(PreparedStatement pst) throws Exception{
logger.debug("即将执行PreparedStatement");
if(pst ==null){
logger.warn("发生异常:executeUpdate方法传入的PreparedStatement为null");
throw new NullPointerException("PreparedStatment不能为null");
}
try {
int count = pst.executeUpdate();
logger.debug("PreparedStatement执行成功,正在返回结果:"+count);
return count;
} catch (Exception e) {
logger.warn("PreparedStatement执行失败");
throw e;
}finally{
closeAll(pst);
}
}
/**
* 通过SQL语句执行查询(若已启用事务,则该方法不会关闭关联的Connection连接)
* 若该操作执行失败,且未启用事务,则关联的Connection连接将自动关闭
* 若该操作执行成功,则关联的Connection连接不会自动关闭,必须手动调用本帮助类提供的closeAll方法来关闭ResultSet
* @param sql 要执行的SQL语句
* @return ResultSet 返回结果集(需要调用closeAll方法手动关闭)
* @throws Exception 各种原因导致的执行失败
*/
ResultSet executeQuery(String sql) throws Exception{
logger.debug("即将执行SQL语句:"+sql);
PreparedStatement pst =null;
try {
pst = getPreparedStatement(sql);
ResultSet rs = pst.executeQuery();
logger.debug("SQL语句执行成功,返回ResultSet");
return rs;
} catch (Exception e) {
logger.warn("执行SQL语句产生异常,异常SQL语句为:"+sql);
logger.debug("为了保证系统正常运行,即将关闭已获取的Connection");
if(pst !=null){
closeAll(pst);
}
logger.debug("系统已经从异常中恢复");
throw e;
}
}
/**
* 通过PreparedStatement执行查询(若已启用事务,则该方法不会关闭关联的Connection连接)
* 若该操作执行失败,且未启用事务,则关联的Connection连接将自动关闭
* 若该操作执行成功,则关联的Connection连接不会自动关闭,必须手动调用本帮助类提供的closeAll方法来关闭ResultSet
* @param pst 要执行的PrepredStatement
* @return ResultSet 返回结果集(需要调用closeAll方法手动关闭)
* @throws Exception 各种原因导致的执行失败
*/
ResultSet executeQuery(PreparedStatement pst) throws Exception{
logger.debug("即将执行PreparedStatement");
if(pst ==null){
logger.warn("发生异常:executeQuery方法传入的PreparedStatement为null");
throw new NullPointerException("PreparedStatment不能为null");
}
try {
ResultSet rs = pst.executeQuery();
logger.debug("PreparedStatement执行成功,正在返回ResultSet");
return rs;
} catch (Exception e) {
logger.warn("执行PreparedStatement产生异常");
logger.debug("为了保证系统正常运行,即将关闭已获取的Connection");
closeAll(pst);
logger.debug("系统已经从异常中恢复");
throw e;
}
}
/**
* 通过Statement关闭所有连接,若该Statement关联的Connection已通过本帮助类启用事务,则该Statement关联的Connection不会自动关闭
* @param st 需要关闭的Statement
*/
void closeAll(Statement st){
logger.debug("即将通过Statement关闭连接");
if(st !=null){
Connection con =null;
try {
con = st.getConnection();
logger.debug("通过Statement获取Connection成功,正在准备关闭连接");
} catch (SQLException e) {
logger.warn("通过Statement获取Connection失败");
}finally{
closeAll(st,con);
}
}else{
logger.info("Statment为null,不需要关闭");
}
}
/**
* 通过ResultSet关闭所有连接,若该ResultSet关联的Connection已通过本帮助类启用事务,则该ResultSet关联的Connection不会自动关闭
* @param rs 需要关闭的ResultSet
*/
void closeAll(ResultSet rs){
logger.debug("即将通过ResultSet关闭连接");
if(rs==null){
logger.info("ResultSet为null,不需要关闭");
}else{
Statement st =null;
try {
st = rs.getStatement();
logger.debug("通过ResultSet获取Statement成功,正在准备关闭连接");
closeAll(st);
} catch (SQLException e) {
logger.warn("通过ResultSet获取Statement失败");
}
}
}
/**
* 关闭所有连接,若该Connection已通过本帮助类启用事务,则Connection不会自动关闭
* @param st 需要关闭的Statement
* @param con 需要关闭的Connection
*/
void closeAll(Statement st,Connection con) {
logger.debug("即将关闭所有连接");
try{
if(st !=null){
st.close();
logger.debug("Statement成功关闭");
}
if(this.trans ==null || this.trans.getConnection() ==null){
con.close();
logger.debug("Connection成功关闭");
}else{
logger.info("因存在事务,Connection未关闭");
}
}catch (Exception err){
logger.warn("关闭连接发生异常");
}
}
/**
* 启用事务(启用以后所有调用了LinkTransaction方法的DAO所实现的方法都需要手动提交)
* @return 生成的用于在DAO之间实现事务关联与执
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
自己写的一个java示例 该示例用jdbc与java事务来实现DAO层的各个DAO的各方法之间的事务关联 使上层可以保证各数据访问的原子性 该示例包含了一个方便调用的数据库访问工具类,该工具类实现了调用SQL语句,调用PreparedStatement对象,并对可能产生的异常进行了处理,保证了各DAO子类调用的简便性
资源推荐
资源详情
资源评论
收起资源包目录
DAO实现事务.rar (37个子文件)
ojdbc14.jar 1.47MB
DaoWithTransaction
bin
dao
PetStoreDAO.class 382B
oracleImpl
BaseDAO.class 8KB
PetStoreDAOImpl.class 3KB
PetDAOImpl.class 4KB
Transaction.class 2KB
TransactionInterface.class 241B
factory
DaoFactory.class 765B
PetDAO.class 354B
Transactable.class 283B
test
Test.class 1KB
log4j.properties 776B
entity
Account.class 2KB
PetOwner.class 1KB
PetStore.class 1KB
Pet.class 2KB
.settings
org.eclipse.core.resources.prefs 69B
org.eclipse.jdt.ui.prefs 5KB
org.eclipse.jdt.core.prefs 629B
src
dao
Transactable.java 601B
oracleImpl
Transaction.java 2KB
PetStoreDAOImpl.java 1KB
BaseDAO.java 9KB
PetDAOImpl.java 2KB
factory
DaoFactory.java 487B
PetDAO.java 618B
PetStoreDAO.java 677B
TransactionInterface.java 580B
test
Test.java 829B
log4j.properties 776B
entity
Account.java 2KB
PetOwner.java 1KB
PetStore.java 1KB
Pet.java 2KB
.project 394B
.classpath 472B
log4j-1.2.15.jar 383KB
共 37 条
- 1
资源评论
- 破晓前的彷徨2014-06-13还不错 代码可用,仔细看
RenYueHD
- 粉丝: 10
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功