Jdbc来操作事物 完成模拟银行的转账业务

时间:2023-03-09 13:29:17
Jdbc来操作事物 完成模拟银行的转账业务

创建JDBC工具类

 package cn.aa4_2.JDBCUtils;

 import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties; /**
* JDBC工具类
*/
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
//文件的读取 读取一次拿到所有值
static { try {
//读取资源文件 获取值 创建Properties集合类
Properties pro=new Properties();
//获取src的路径 ClassLoader 类加载器
ClassLoader cl= JDBCUtils.class.getClassLoader();
URL res = cl.getResource("jdbc.properties");
String path = res.getPath();
pro.load(new FileReader(path));
url=pro.getProperty("url");
user=pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
} catch (IOException e) {
e.printStackTrace();
} }
//获取连接对象
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
//释放资源
public static void colse(Statement state,Connection con){
if (state!=null){
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//释放资源
public static void colse(ResultSet rs,Statement state, Connection con){
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (state!=null){
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} }

模拟银行的转账业务的实现步骤和代码如下

1 获取链接

2 开启事物

3 获取PreparedStatement

4 使用PreparedStatement 两次更新操作

5 正常情况下提交事物

6 出现异常 回滚事物

 package cn.aa4_2.Demo;

 import cn.aa4_2.JDBCUtils.JDBCUtils;

 import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException; /**
* 模拟银行的转账业务
*/
public class Transactionthree {
public static void main(String[] args) {
Connection con=null;
PreparedStatement pre=null;
try {
//获取连接
con = JDBCUtils.getConnection();
//开启事物
con.setAutoCommit(false);
//获取PreparedStatement
pre = con.prepareStatement("UPDATE coount SET money=money-? WHERE cname=?");
//更新操作
pre.setDouble(1,1);
pre.setString(2,"wang");
pre.executeUpdate();
pre = con.prepareStatement("UPDATE coount SET money=money+? WHERE cname=?");
pre.setDouble(1,1);
pre.setString(2,"zhang");
pre.executeUpdate();
//提交事物
con.commit();
System.out.println("转账成功");
} catch (SQLException e) {
try {
//事物回滚
con.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
System.out.println("转账失败");
}finally {
//关闭资源
JDBCUtils.colse(pre,con);
}
}
}

7  关闭资源