• 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  关闭资源

  • 相关阅读:
    Verilog --序列检测器(采用移位寄存器实现)
    SV -- Randomization 随机化
    SV -- Interprocess Communication (IPC 线程间通信)
    SV -- Class 类
    Verilog -- 序列模三(整除3)检测器
    VSCode+C++环境搭建
    在次线性时间内计算线性递归数列
    Codefest19受虐记
    ABC135记录
    Paint.NET软件分享
  • 原文地址:https://www.cnblogs.com/shu06/p/10645124.html
Copyright © 2020-2023  润新知