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

创建JDBC工具类

 1 package cn.aa4_2.JDBCUtils;
 2 
 3 
 4 import java.io.FileReader;
 5 import java.io.IOException;
 6 import java.net.URL;
 7 import java.sql.*;
 8 import java.util.Properties;
 9 
10 /**
11  * JDBC工具类
12  */
13 public class JDBCUtils {
14     private static String url;
15     private static  String user;
16     private static String password;
17     private static String driver;
18     //文件的读取 读取一次拿到所有值
19    static {
20 
21        try {
22            //读取资源文件 获取值 创建Properties集合类
23            Properties pro=new Properties();
24            //获取src的路径   ClassLoader 类加载器
25            ClassLoader cl= JDBCUtils.class.getClassLoader();
26            URL res = cl.getResource("jdbc.properties");
27            String path = res.getPath();
28            pro.load(new FileReader(path));
29            url=pro.getProperty("url");
30            user=pro.getProperty("user");
31            password=pro.getProperty("password");
32            driver=pro.getProperty("driver");
33        } catch (IOException e) {
34            e.printStackTrace();
35        }
36 
37    }
38    //获取连接对象
39    public static Connection getConnection() throws SQLException {
40        return DriverManager.getConnection(url,user,password);
41    }
42    //释放资源
43    public static void colse(Statement state,Connection con){
44        if (state!=null){
45            try {
46                state.close();
47            } catch (SQLException e) {
48                e.printStackTrace();
49            }
50        }
51        if (con!=null){
52            try {
53                con.close();
54            } catch (SQLException e) {
55                e.printStackTrace();
56            }
57        }
58    }
59    //释放资源
60     public static void colse(ResultSet rs,Statement state, Connection con){
61        if (rs!=null){
62            try {
63                rs.close();
64            } catch (SQLException e) {
65                e.printStackTrace();
66            }
67        }
68        if (state!=null){
69             try {
70                 state.close();
71             } catch (SQLException e) {
72                 e.printStackTrace();
73             }
74         }
75         if (con!=null){
76             try {
77                 con.close();
78             } catch (SQLException e) {
79                 e.printStackTrace();
80             }
81         }
82     }
83 
84 }

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

1 获取链接 

2 开启事物

3 获取PreparedStatement

4 使用PreparedStatement 两次更新操作

5 正常情况下提交事物

6 出现异常 回滚事物

 1 package cn.aa4_2.Demo;
 2 
 3 import cn.aa4_2.JDBCUtils.JDBCUtils;
 4 
 5 import java.sql.Connection;
 6 import java.sql.PreparedStatement;
 7 import java.sql.SQLException;
 8 
 9 /**
10  * 模拟银行的转账业务
11  */
12 public class Transactionthree {
13     public static void main(String[] args)  {
14         Connection con=null;
15         PreparedStatement pre=null;
16         try {
17             //获取连接
18              con = JDBCUtils.getConnection();
19              //开启事物
20             con.setAutoCommit(false);
21             //获取PreparedStatement
22              pre = con.prepareStatement("UPDATE coount SET money=money-? WHERE cname=?");
23             //更新操作
24              pre.setDouble(1,1);
25             pre.setString(2,"wang");
26             pre.executeUpdate();
27             pre = con.prepareStatement("UPDATE coount SET money=money+? WHERE cname=?");
28             pre.setDouble(1,1);
29             pre.setString(2,"zhang");
30             pre.executeUpdate();
31             //提交事物
32             con.commit();
33             System.out.println("转账成功");
34         } catch (SQLException e) {
35             try {
36                 //事物回滚
37                 con.rollback();
38             } catch (SQLException e1) {
39                 e1.printStackTrace();
40             }
41             System.out.println("转账失败");
42         }finally {
43             //关闭资源
44             JDBCUtils.colse(pre,con);
45         }
46     }
47 }

7  关闭资源

猜你喜欢

转载自www.cnblogs.com/shu06/p/10645124.html