JDBC事务工具类
工具类(使用c3p0默认配置)
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class JDBCUtils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
* 它是事务专用连接
*/
private static Connection con = null;
/**
* 使用连接池返回一个连接对象
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
// 当con不等于null,说明已经调用beginTransaction()方法,表示开启了事务
if(con != null) {
return con;
}
return dataSource.getConnection();
}
/**
* 返回连接池对象
* @return
*/
public static DataSource getDataSource() {
return dataSource;
}
/**
* 开启事务
* 1.获取一个Connection对象,设置它的setAutoCommit(false)
* 2.还要保证dao中使用的连接对象与工具类中的保持一致。
* 要点:
* 1.创建一个Connection对象
* 2.把这个Connection对象给dao用
* 3.还要让commitTransaction或rollbackTransaction获取
*/
public static void beginTransaction() throws SQLException {
if(con != null) {
throw new SQLException("事务已经开启!");
}
/*
* 1.给con赋值
* 2.给con设置为手动提交
* */
con = getConnection();
con.setAutoCommit(false);
}
/**
* 提交事务
* 获取beginTransaction提供的Connection,然后调用commit方法
*/
public static void commitTransaction() throws SQLException {
if(con == null) {
throw new SQLException("还没有开启事务,无法提交");
}
/*
* 1.直接使用con.commit()
* */
con.commit();
con.close();
// 把它设置为null,表示事务已经结束了
con = null;
}
/**
* 回滚事务
* 获取beginTransaction提供的Connection,然后调用rollback方法
*/
public static void rollbackTransaction() throws SQLException {
if(con == null) {
throw new SQLException("还没有开启事务,无法回滚");
}
/*
* 直接使用con.rollback()方法
* */
con.rollback();
con.close();
con = null;
}
}
模拟Service层
import java.sql.SQLException;
public class Test {
private TestDao td = new TestDao();
@org.junit.Test
public void test() throws SQLException {
try {
JDBCUtils.beginTransaction();
td.moneyDao("李四",-400);
td.moneyDao("张三",400);
JDBCUtils.commitTransaction();
} catch (Exception e) {
JDBCUtils.rollbackTransaction();
}
}
}
模拟DAO层
import org.apache.commons.dbutils.QueryRunner;
import java.sql.Connection;
import java.sql.SQLException;
public class TestDao {
public void moneyDao(String uname,double money) throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "update testmoney set umoney=umoney+? where uname=?";
Object[] params = {money,uname};
// 我们需要自己来提供连接,保证多次调用使用的是同一个连接
Connection con = JDBCUtils.getConnection();
qr.update(con,sql,params);
}
}