JDBC事务的处理

1.准备数据

CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), balance DOUBLE ); -- 添加数据 INSERT INTO account (NAME, balance) VALUES ('Jack', 1000), ('Rose', 1000);

2.API介绍

Connection接口中与事务有关的方法说明
void setAutoCommit(boolean autoCommit)参数是true或false如果设置为false,表示关闭自动提交,相当于开启事务
void commit()提交事务
void rollback()回滚事务

3.开发步骤

  1. 获取连接
  2. 开启事务
  3. 获取到PreparedStatement
  4. 使用PreparedStatement执行两次更新操作
  5. 正常情况下提交事务
  6. 出现异常回滚事务
  7. 最后关闭资源

JdbcUtils.java

/**
 * @Author:gaoyuan
 * @Description:访问数据库的工具类
 * @DateTime:2021/3/9 10:58
 **/
public class JdbcUtils {
//可以把字符串定义成常量:用户名,密码,URL,驱动类
    private static final String USER="root";
    private static final String PWD="123456";
    private static final String URL="jdbc:mysql://localhost:3306/testdb1";
    private  static final String DRIVER="com.mysql.jdbc.Driver";

/**
 * 注册驱动
 */
static {

        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
}

/**
 * 得到数据库的连接
 */
public static Connection getConnection() throws SQLException {
    return DriverManager.getConnection(URL,USER,PWD);
}

/**
 * 关闭所有打开的资源
 */

public static void close(Connection conn, Statement stmt){
    if (stmt!=null){
        try {
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (conn!=null){
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
/**
 * 关闭所有打开的资源
 */
public static void close(Connection conn, Statement stmt, ResultSet rs) {
    if (rs!=null) {
        try {
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    close(conn, stmt);
}
}

public class Demo11Transaction {
    //没有异常,提交事务,出现异常回滚事务
    public static void main(String[] args) {
//1) 注册驱动
        Connection connection = null;
        PreparedStatement ps = null;
        try {
//2) 获取连接
            connection = JdbcUtils.getConnection();
//3) 开启事务
            connection.setAutoCommit(false);


//4) 获取到PreparedStatement
//从jack扣钱
            ps = connection.prepareStatement("update account set balance = balance - ? where name=?");
            ps.setInt(1, 500);
            ps.setString(2,"Jack");
            ps.executeUpdate();
//出现异常
            //System.out.println(100 / 0);
//给rose加钱
            ps = connection.prepareStatement("update account set balance = balance + ? where name=?");
            ps.setInt(1, 500);
            ps.setString(2,"Rose");
            ps.executeUpdate();
//提交事务
            connection.commit();
            System.out.println("转账成功");
        } catch (Exception e) {
            e.printStackTrace();
//事务的回滚
            try {
                connection.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            System.out.println("转账失败");
        }
        finally {
//7) 关闭资源
            JdbcUtils.close(connection,ps);
        }
    }
}

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值