目录

  1 Connection中的重用方法

  2 JDBC事务管理经典案例

1 Connection类中常用的方法回顾

  1.1 Statement createStatement() throws SQLException;

    创建一个Statement实例(即:创建一个SQL执行对象)

  1.2 PreparedStatement prepareStatement(String sql) throws SQLException;

    创建一个PreparedStatement对象(即:创建一个预编译SQL执行对象)

  1.3 void setAutoCommit(boolean autoCommit) throws SQLException;

    设置事务的自动提交(false为关闭自动提交,true为启动自动提交)

  1.4 void commit() throws SQLException;

    手动提交事务

  1.5 void rollback() throws SQLException;

    手动回滚事务

 

2 需要用到事务回滚的经典案例:银行转账案例

  转出和转入是一个事务,如果转出成功但是转入失败的会就需要进行事务回滚,否则就出出现转出者余额减少但是转入者余额没有增加

  注意:事务的提交与回滚是通过Connection提供的方法来调用的;本质上事务还是依赖数据库的实现;Connection的方法实质上也是调用了数据库事务机制.

  2.1 不使用事务控制的转账业务

    缺点:如果转入成功,但是转入失败的话,会造成转出者余额减少,但是转入者余额不变

    项目结构图

      JDBC03 利用JDBC实现事务提交与回滚【调用Connection中的方法实现事务管理】

 1 package cn.xiangxu.entity;
 2 
 3 import java.sql.Connection;
 4 import java.sql.PreparedStatement;
 5 import java.util.Scanner;
 6 
 7 import cn.xiangxu.tools.DBUtil;
 8 
 9 public class Test {
10     public static void main(String[] args) {
11         Scanner scanner = new Scanner(System.in);
12         System.out.println("请输入转出用户名:");
13         String outName = scanner.nextLine();
14         System.out.println("请输入需要转出的资金额度:");
15         Double money = Double.parseDouble(scanner.nextLine());
16         System.out.println("请输入转入用户名:");
17         String inName = scanner.nextLine();
18         System.out.println("转出账户为:" + outName + "转出金额为:" + money + "转入账户为:" + inName);
19         
20         
21         Connection conn = null;
22         try {
23             conn = DBUtil.getConnection(); // 实例化连接对象
24             
25 //            conn.setAutoCommit(false); // 关闭自动提交事务功能
26             
27             String sql = "UPDATE client "
28                     + "SET account = account - ? " 
29                     + "WHERE name = ? ";
30             PreparedStatement ps = conn.prepareStatement(sql);
31             ps.setDouble(1, money);
32             ps.setString(2, outName);
33             Integer rs = ps.executeUpdate();
34             if(rs > 0) {
35                 System.out.println("转出成功");
36             } else {
37                 System.out.println("转出失败");
38                 return; // 转出失败跳出函数,不再执行下面的语句;但是finally中的语句还是会执行的,因为就算天塌下来finally中的语句都会执行
39             }
40             
41             System.out.println("======分割线=======");
42             
43             String sql_in = "UPDATE client "
44                     + "SET account = account + ? " 
45                     + "WHERE name = ? ";
46             PreparedStatement ps_in = conn.prepareStatement(sql_in);
47             ps_in.setDouble(1, money);
48             ps_in.setString(2, inName);
49             Integer judge_in = ps_in.executeUpdate();
50             if(judge_in > 0) {
51                 System.out.println("转入成功");
52 //                conn.commit(); // 转出、转入都成功就提交事务
53             } else {
54                 System.out.println("转入失败");
55 //                conn.rollback(); // 转出成功、转入失败就回滚事务
56             }
57             
58 //            conn.setAutoCommit(true); // 打开自动提交事务
59             
60         } catch (Exception e) {
61             // TODO Auto-generated catch block
62             e.printStackTrace();
63         } finally {
64             System.out.println("我是finally中的语句哟");
65             try {
66                 DBUtil.closeConnection();
67             } catch (Exception e) {
68                 // TODO Auto-generated catch block
69                 e.printStackTrace();
70             }
71         }
72     }
73 }
转账业务java源代码

相关文章: