JDBC事务工具类

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值