zoukankan      html  css  js  c++  java
  • JDBC事务,银行转账,货物进出库等等。

    1:转账业务
      转账必须执行2个sql语句(update更新)都成功的情况下,提交事务,如果有一个失败,则2个都回滚事务
    2:事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
      2.1:原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
      2.2:一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
      2.3:隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
      2.4:持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

    3:这里以转账操作为案例进行演示说明,其注意点如下:

      (1)一个sql语句操作不需要手动提交事务

      (2)查询操作也不需要手动提交事务,

      (3)但是更新,插入,删除都需要手动提交事务

      (4)余额为负的可以先查询出结果再进行判断,然后再操作 

      (5)con.setAutoCommit(false);手动开启事务;con.commit();手动提交事务;con.rollback();事务回滚操作


    4:首先创建一个数据表或者两个数据表,这里为了演示清楚创建两个数据表

    5:创建好数据库和数据表,然后进行工具类的书写BaseDao.java

      1 package com.bie.utils;
      2 
      3 import java.sql.Connection;
      4 import java.sql.DriverManager;
      5 import java.sql.PreparedStatement;
      6 import java.sql.ResultSet;
      7 import java.sql.SQLException;
      8 
      9 /** 
     10 * @author BieHongLi 
     11 * @version 创建时间:2017年2月27日 上午10:09:00 
     12 * 连接数据库的工具类
     13 */
     14 public class BaseDao {
     15 
     16     private static String driver="com.mysql.jdbc.Driver";
     17     private static String url="jdbc:mysql:///test";
     18     private static String user="root";
     19     private static String password="123456";
     20     
     21     /***
     22      * 连接数据库的方法
     23      * @return
     24      * @throws ClassNotFoundException
     25      * @throws SQLException
     26      */
     27     public static Connection getCon() throws ClassNotFoundException, SQLException{
     28         Class.forName(driver);//加载数据库驱动
     29         System.out.println("测试加载数据库成功");
     30         Connection con=DriverManager.getConnection(url, user, password);
     31         System.out.println("测试数据库链接成功");
     32         return con;
     33     }
     34     
     35     /***
     36      * 关闭数据库的方法
     37      * @param con
     38      * @param ps
     39      * @param rs
     40      */
     41     public static void close(Connection con,PreparedStatement ps,ResultSet rs){
     42         if(rs!=null){//关闭资源,避免出现异常
     43             try {
     44                 rs.close();
     45             } catch (SQLException e) {
     46                 // TODO Auto-generated catch block
     47                 e.printStackTrace();
     48             }
     49         }
     50         if(ps!=null){
     51             try {
     52                 ps.close();
     53             } catch (SQLException e) {
     54                 // TODO Auto-generated catch block
     55                 e.printStackTrace();
     56             }
     57         }
     58         if(con!=null){
     59             try {
     60                 con.close();
     61             } catch (SQLException e) {
     62                 // TODO Auto-generated catch block
     63                 e.printStackTrace();
     64             }
     65         }
     66     }
     67     
     68     /***
     69      * 同意增删改的方法
     70      * @param sql
     71      * @param arr
     72      * @return
     73      */
     74     public static boolean addUpdateDelete(String sql,Object[] arr){
     75         Connection con=null;
     76         PreparedStatement ps=null;
     77         try {
     78             con=BaseDao.getCon();//第一步 :连接数据库的操作
     79             ps=con.prepareStatement(sql);//第二步:预编译
     80             //第三步:设置值
     81             if(arr!=null && arr.length!=0){
     82                 for(int i=0;i<arr.length;i++){
     83                     ps.setObject(i+1, arr[i]);
     84                 }
     85             }
     86             int count=ps.executeUpdate();//第四步:执行sql语句
     87             if(count>0){
     88                 return true;
     89             }else{
     90                 return false;
     91             }
     92         } catch (ClassNotFoundException e) {
     93             // TODO Auto-generated catch block
     94             e.printStackTrace();
     95         } catch (SQLException e) {
     96             // TODO Auto-generated catch block
     97             e.printStackTrace();
     98         }
     99         return false;
    100     }
    101     
    102     /*public static void main(String[] args) {
    103         try {
    104             BaseDao.getCon();
    105         } catch (ClassNotFoundException e) {
    106             // TODO Auto-generated catch block
    107             e.printStackTrace();
    108         } catch (SQLException e) {
    109             // TODO Auto-generated catch block
    110             e.printStackTrace();
    111         }
    112     }*/
    113 }

    6:这里直接在主方法里面进行了测试,所以写了UserDao进行测试,看效果即可。

     1 package com.bie.dao;
     2 
     3 import java.sql.Connection;
     4 import java.sql.PreparedStatement;
     5 import java.sql.SQLException;
     6 
     7 import com.bie.utils.BaseDao;
     8 
     9 /** 
    10 * @author BieHongLi 
    11 * @version 创建时间:2017年2月27日 下午3:19:49 
    12 * 
    13 */
    14 public class UserDao {
    15     
    16     /***
    17      * 注意点:
    18      *      (1)一个sql语句操作不需要手动提交事务
    19      *      (2)查询操作也不需要手动提交事务,
    20      *      (3)但是更新,插入,删除都需要手动提交事务 
    21      *   (4)余额为负的可以先查询出结果再进行判断,然后再操作    
    22      * @param args
    23      */
    24     public static void main(String[] args) {
    25         Connection con=null;
    26         PreparedStatement ps1=null;
    27         PreparedStatement ps2=null;
    28         try {
    29             //第一步:连接数据库的操作
    30             con=BaseDao.getCon();
    31             //默认自动提交事务,所以默认是true,现在将true改为false,禁止默认自动提交事务
    32             //con.setAutoCommit(true);
    33             //事务1:如果设置为false,则需要手动提交事务
    34             con.setAutoCommit(false);
    35             
    36             //第二步:更新的sql语句
    37             String sql="update bank_a set usera_rmb=usera_rmb-500 where usera_id=1 ";
    38             String sql2="update bank_b set userb_rmb=userb_rmb+500 where userb_id=1 ";
    39             //第三步:预编译sql
    40             ps1=con.prepareStatement(sql);
    41             //第四步:执行sql语句,虽然执行了sql,但是还没持久化更新到数据库
    42             ps1.executeUpdate();
    43             
    44             //第三步:预编译sql2
    45             ps2=con.prepareStatement(sql2);
    46             //第四步:执行sql2,虽然执行了sql2,但是还没持久化更新到数据库
    47             ps2.executeUpdate();
    48             
    49             System.out.println("转账成功...");
    50             
    51             //事务2:手动提交事务,如果两个都执行成功了,那么提交事务
    52             con.commit();
    53         } catch (ClassNotFoundException e) {
    54             e.printStackTrace();
    55             try {
    56                 //事务3:如果抛出异常,那么回滚事务
    57                 con.rollback();
    58             } catch (SQLException e1) {
    59                 e1.printStackTrace();
    60             }
    61         } catch (SQLException e) {
    62             e.printStackTrace();
    63         }finally {
    64             //关闭资源,避免出现异常
    65             BaseDao.close(con, ps1, null);
    66             BaseDao.close(null, ps2, null);
    67         }
    68     }
    69     
    70     
    71 }

    演示效果如下所示:

  • 相关阅读:
    iOS故事板下使用代码跳转页面
    眼见不一定为实
    UITableView
    iOS 备忘录
    统计代码行数
    iOS - 图片合成
    UI 素材
    xcode中xib使用小技巧
    svn不能提交静态库解决方案
    在webSocket中获取shiro报错
  • 原文地址:https://www.cnblogs.com/honglikeji/p/7531271.html
Copyright © 2011-2022 走看看