码迷,mamicode.com
首页 > 数据库 > 详细

JDBC 确保事务成功的方法

时间:2019-08-30 18:43:45      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:back   dstat   子类   config   报错   oid   gets   public   连接   

|--问题点

如果涉及到事务的操作,务必要确保是在同一个连接对象下完成的,否则容易报错

 

|--解决办法

在一个工程里面写一个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 }
涉及事务的BaseDao---在普通的BaseDao的基础上增加了专门处理事务的方法
技术图片
 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     }
继承了BaseDao的卖家类的Impl的关键代码,买家类也是一样的写法
技术图片
 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     }
service层的事务的关键代码

 

JDBC 确保事务成功的方法

标签:back   dstat   子类   config   报错   oid   gets   public   连接   

原文地址:https://www.cnblogs.com/twuxian/p/11436393.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!