目录
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 不使用事务控制的转账业务
缺点:如果转入成功,但是转入失败的话,会造成转出者余额减少,但是转入者余额不变
项目结构图
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 }