JDBC 确保事务成功的方法
Posted twuxian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC 确保事务成功的方法相关的知识,希望对你有一定的参考价值。
|--问题点
如果涉及到事务的操作,务必要确保是在同一个连接对象下完成的,否则容易报错
|--解决办法
在一个工程里面写一个BaseDao,BaseDao的getconnection方法设置为静态方法,
其他各个实体类继承BaseDao类
在ps.executeUpdate这个方法前面传入统一连接
|--代码
1 package com.shop.impl; 2 3 import com.shop.util.ConfigManager; 4 5 import java.sql.*; 6 7 8 public class BaseDao 9 PreparedStatement ps = null; 10 ResultSet rs = null; 11 static Connection conn = null; 12 private static final String driver = ConfigManager.getInstance().getString("jdbc.driver"); 13 private static final String url = ConfigManager.getInstance().getString("jdbc.url"); 14 private static final String user = ConfigManager.getInstance().getString("jdbc.userName"); 15 private static final String password = ConfigManager.getInstance().getString("jdbc.password"); 16 17 18 /** 19 * @return connection 静态方法,确保该方法的Connection对象是不可变的 20 * @author 周小龙 21 */ 22 public static Connection getConn() 23 try 24 Class.forName(driver); 25 conn = DriverManager.getConnection(url, user, password); 26 // System.out.println(conn); 27 catch (ClassNotFoundException e) 28 e.printStackTrace(); 29 catch (SQLException e) 30 e.printStackTrace(); 31 32 return conn; 33 34 35 36 /** 37 * @param sql 38 * @param obj 39 * @return 40 * @author 查询方法 41 */ 42 public ResultSet executeQuery(String sql, Object... obj) 43 getConn(); 44 try 45 ps = conn.prepareStatement(sql); 46 if (obj != null) 47 for (int i = 0; i < obj.length; i++) 48 ps.setObject((i + 1), obj[i]); 49 50 51 rs = ps.executeQuery(); 52 catch (SQLException e) 53 e.printStackTrace(); 54 55 return rs; 56 57 58 59 /** 60 * 更新方法 61 * @param sql 62 * @param obj 63 * @return 64 */ 65 public int executeUpdate(String sql, Object... obj) 66 getConn(); 67 int result = 0; 68 try 69 ps = conn.prepareStatement(sql); 70 if (obj != null) 71 for (int i = 0; i < obj.length; i++) 72 ps.setObject((i + 1), obj[i]); 73 74 try 75 result = ps.executeUpdate(); 76 catch (Exception e) 77 System.out.println("JDBC操作失误!"); 78 79 80 catch (SQLIntegrityConstraintViolationException e) 81 82 catch (SQLException e) 83 e.printStackTrace(); 84 finally 85 closeAll(); 86 87 return result; 88 89 90 /** 91 * @param conn Connection 对象,在所有的子类里面都可以直接通过getConn()方法获得 92 * @param sql sql 语句 这个方法其实和普通的增改删除方法只差一个connection对象 93 * @param obj Object对象 94 * @return 专门用来进行事务的方法 为确保事务的成功,必须在同一个connection对象里面操作 95 * @author 9527 96 */ 97 public boolean transactionUpdate(Connection conn, String sql, Object... obj) 98 Connection connection = conn; 99 boolean flag = false; 100 try 101 ps = conn.prepareStatement(sql); 102 if(obj!=null) 103 for (int i = 0; i < obj.length; i++) 104 ps.setObject((i+1),obj[i]); 105 106 107 int row = ps.executeUpdate(); 108 if (row>0) 109 flag=true; 110 else 111 flag=false; 112 113 catch (SQLException e) 114 e.printStackTrace(); 115 116 return flag; 117 118 119 /** 120 * 释放资源 121 */ 122 public void closeAll() 123 try 124 if (rs != null) 125 rs.close(); 126 127 if (ps != null) 128 ps.close(); 129 130 if (conn != null) 131 conn.close(); 132 133 catch (SQLException e) 134 e.printStackTrace(); 135 136 137
1 /** 2 * @param conn 连接对象 3 * @param user 买家对象 4 * @param money 金额 事务:转账,转入 5 * @author 周小龙 6 */ 7 @Override 8 public int transferIn(Connection conn, User user, double money) 9 Connection connection = conn; 10 String sql = "UPDATE `user` set user_balance=user_balance+? WHERE userId=? "; 11 Object[] obj = money, user.getUserId(); 12 int result = this.executeUpdate(sql, obj); 13 return result; 14 15 16 /** 17 * @param conn 连接对象 18 * @param user 买家对象 19 * @param money 金额 事务转账,转出 20 * @author 周小龙 21 */ 22 @Override 23 public int transferOut(Connection conn, User user, double money) 24 Connection connection=conn; 25 String sql = "UPDATE `user` set user_balance=user_balance-? WHERE userId=? "; 26 Object[] obj = money, user.getUserId(); 27 int result = this.executeUpdate(sql, obj); 28 return result; 29
1 /** 2 * 售货交易 3 * @author 周小龙 4 * @param seller 5 * @param user 6 * @param money 7 * @return 8 */ 9 public boolean transferBuy(Seller seller, User user, double money) 10 conn=BaseDao.getConn(); 11 boolean flag=false; 12 try 13 //关闭数据库的自动提交 14 conn.setAutoCommit(false); 15 //转账 买家转出,卖家转入 16 int out = userDao.transferOut(conn,user,money); 17 int in = sellerDao.transferIn(conn,seller,money); 18 //如果转账成功,就提交事务,flag赋值为true 19 if (out>0&&in>0) 20 conn.commit(); 21 flag=true; 22 23 catch (SQLException e) 24 e.printStackTrace(); 25 //如果报错 就回滚操作,并且给flag赋值为false 26 try 27 conn.rollback(); 28 catch (SQLException ex) 29 ex.printStackTrace(); 30 31 finally 32 try 33 conn.setAutoCommit(true); 34 catch (SQLException e) 35 e.printStackTrace(); 36 37 38 return flag; 39
以上是关于JDBC 确保事务成功的方法的主要内容,如果未能解决你的问题,请参考以下文章