JDBC-数据库事务(转账实例)

1.数据库设计

CREATE TABLE t_bank(
   id INT PRIMARY KEY AUTO_INCREMENT COMMENT '账号主键',
   account VARCHAR(20) NOT NULL UNIQUE COMMENT '账号',
   money  INT UNSIGNED COMMENT '金额,不能为负值') ;
   
INSERT INTO t_bank(account,money) VALUES
  ('张三',1000),('李四',1000);

2.代码结构设计

在这里插入图片描述

3.代码实现

  • BankService
//在Service层统一注册驱动和创建连接
public class BankService {
    public void Transfer(String addAcount,String subAccount,int num) throws  Exception{
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu?user=root&password=123456");
        int flag=0;
        try {
            connection.setAutoCommit(false); //关闭自动提交
            BankDao bankDao = new BankDao();
            bankDao.addAMoney(num, addAcount, connection);
            bankDao.subAMoney(num, subAccount, connection);
            connection.commit(); //提交事务
            System.out.println(addAcount+"转入"+num+"  "+subAccount+"转出"+num);
            flag=1;
        }catch (Exception e){
            connection.rollback();//如果出错就事务回滚,否则可能出现加钱账户加钱成功,但是减钱账户减钱失败
            throw e;
        }finally {
            if (flag==1){
                System.out.println("转账成功");
            }else {
                System.out.println("转账失败");
            }
            connection.close();
        }
    }
}
  • BankDao
public class BankDao {
    public void addAMoney(int num,String addAccount,Connection connection) throws Exception {
        String sql="update t_bank set money=money+ ? where account=?;";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setObject(1,num);
        preparedStatement.setObject(2,addAccount);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }
    public void subAMoney(int num,String subAccount,Connection connection) throws Exception {
        String sql="update t_bank set money=money- ? where account=?;";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setObject(1,num);
        preparedStatement.setObject(2,subAccount);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }
}
  • BankTest
public class BankTest {
    public static void main(String[] args) throws Exception {
        String addAccount="张三";
        String subAccount="李四";
        int num=500;
        BankService bankService = new BankService();
        bankService.Transfer(addAccount,subAccount,num);
    }
}
  • 运行结果(这是转账成功的图像,如果失败则只显示转账失败)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值