【JDBC练习二】用事务编写转账代码

0. 数据库中表的创建

在这里插入图片描述

1. 配置文件

文件名:jdbc.properties
文件在src目录下,本程序用到了动态查询文件路径的方式读取文件的

url=jdbc:mysql:///db4
user=root
password=root
driver=com.mysql.cj.jdbc.Driver

2.自创JDBC工具类

文件名:JDBCutils.java

package com.otkur.util;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

public class JDBCutils {
    private static String url;
    private static String user;
    private static String password;
    public static String Driver;


    static {

        try {
            //读取资源文件,获取值
            Properties pro = new Properties();
            //获取src路径下的文件的方式---->ClassLoader类加载器
            ClassLoader classLoader = JDBCutils.class.getClassLoader();
            URL res = classLoader.getResource("jdbc.properties");
            String path = res.getPath();



            //加载文件
            pro.load(new FileReader(path));
            //3.获取数据,赋值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            Driver = pro.getProperty("driver");
            Class.forName(Driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return  连接对象
     */
    public static Connection getConnection(){
        try {
            return DriverManager.getConnection(url,user,password);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return null;
        }
    }

    /**
     * 释放资源
     * @param p1
     * @param p2
     * @param conn
     */
    public static void close(PreparedStatement p1,PreparedStatement p2, Connection conn){
        if(p1 != null){
            try {
                p1.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(p2 != null){
            try {
                p2.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }


}


3. 主程序

package com.otkur.jdbc2;

import com.otkur.util.JDBCutils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 事务操作
 */
public class JDBCDemo12 {
    public static void main(String[] args) {
        Connection c = null;
        PreparedStatement p1 = null;
        PreparedStatement p2 = null;

        try {
            //1.获取连接
            c = JDBCutils.getConnection();
            //开启事务
            c.setAutoCommit(false);

            //2.定义sql
            //2.1 张三-500
            String sql1 = "update account set money = money - ? where id =?";
            //2.2 李四+500
            String sql2 = "update account set money = money + ? where id =?";
            //3.获取执行对象
            p1 = c.prepareStatement(sql1);
            p2 = c.prepareStatement(sql2);
            //4.设置参数
            p1.setDouble(1, 500);
            p1.setInt(2, 1);

            p2.setDouble(1, 500);
            p2.setInt(2, 2);
            //5.执行SQL
            p1.executeUpdate();
            p2.executeUpdate();

            //提交事务
            c.commit();

        } catch (Exception throwables) {
            //事务的回滚
            try {
                if (c != null)
                    c.rollback();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            throwables.printStackTrace();
        } finally {
            JDBCutils.close(p1, p2, c);
        }

    }

}


4. 结果

结果1
当两个语句执行中间出现了异常结果是:
在这里插入图片描述
数据库中的结果:
在这里插入图片描述
结果没有变,说明事务的操作用对了。

结果1

去掉中间会抛出异常的代码,程序正常运行
在这里插入图片描述
数据库中的结果:
在这里插入图片描述
成功实现转账!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值