国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

Java基于JDBC實(shí)現(xiàn)事務(wù),銀行轉(zhuǎn)賬及貨物進(jìn)出庫功能示例

2024-07-13 10:15:41
字體:
供稿:網(wǎng)友

本文實(shí)例講述了Java基于JDBC實(shí)現(xiàn)事務(wù),銀行轉(zhuǎn)賬及貨物進(jìn)出庫功能。分享給大家供大家參考,具體如下:

1. 轉(zhuǎn)賬業(yè)務(wù)

轉(zhuǎn)賬必須執(zhí)行2個(gè)sql語句(update更新)都成功的情況下,提交事務(wù),如果有一個(gè)失敗,則2個(gè)都回滾事務(wù)

2. 事務(wù)應(yīng)該具有4個(gè)屬性:原子性、一致性、隔離性、持久性。這四個(gè)屬性通常稱為ACID特性。

原子性(atomicity)。一個(gè)事務(wù)是一個(gè)不可分割的工作單位,事務(wù)中包括的諸操作要么都做,要么都不做。
一致性(consistency)。事務(wù)必須是使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài)。一致性與原子性是密切相關(guān)的。
隔離性(isolation)。一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾。即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。
持久性(durability)。持久性也稱永久性(permanence),指一個(gè)事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來的其他操作或故障不應(yīng)該對其有任何影響。

3. 這里以轉(zhuǎn)賬操作為案例進(jìn)行演示說明,其注意點(diǎn)如下:

(1)一個(gè)sql語句操作不需要手動(dòng)提交事務(wù)

(2)查詢操作也不需要手動(dòng)提交事務(wù),

(3)但是更新,插入,刪除都需要手動(dòng)提交事務(wù)

(4)余額為負(fù)的可以先查詢出結(jié)果再進(jìn)行判斷,然后再操作

(5)con.setAutoCommit(false);手動(dòng)開啟事務(wù);con.commit();手動(dòng)提交事務(wù);con.rollback();事務(wù)回滾操作

4. 首先創(chuàng)建一個(gè)數(shù)據(jù)表或者兩個(gè)數(shù)據(jù)表,這里為了演示清楚創(chuàng)建兩個(gè)數(shù)據(jù)表

Java,JDBC,事務(wù),銀行轉(zhuǎn)賬,貨物進(jìn)出庫

Java,JDBC,事務(wù),銀行轉(zhuǎn)賬,貨物進(jìn)出庫

5. 創(chuàng)建好數(shù)據(jù)庫和數(shù)據(jù)表,然后進(jìn)行工具類的書寫B(tài)aseDao.java

package com.bie.utils;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;/*** @author BieHongLi* @version 創(chuàng)建時(shí)間:2017年2月27日 上午10:09:00* 連接數(shù)據(jù)庫的工具類*/public class BaseDao {  private static String driver="com.mysql.jdbc.Driver";  private static String url="jdbc:mysql:///test";  private static String user="root";  private static String password="123456";  /***   * 連接數(shù)據(jù)庫的方法   * @return   * @throws ClassNotFoundException   * @throws SQLException   */  public static Connection getCon() throws ClassNotFoundException, SQLException{    Class.forName(driver);//加載數(shù)據(jù)庫驅(qū)動(dòng)    System.out.println("測試加載數(shù)據(jù)庫成功");    Connection con=DriverManager.getConnection(url, user, password);    System.out.println("測試數(shù)據(jù)庫鏈接成功");    return con;  }  /***   * 關(guān)閉數(shù)據(jù)庫的方法   * @param con   * @param ps   * @param rs   */  public static void close(Connection con,PreparedStatement ps,ResultSet rs){    if(rs!=null){//關(guān)閉資源,避免出現(xiàn)異常      try {        rs.close();      } catch (SQLException e) {        // TODO Auto-generated catch block        e.printStackTrace();      }    }    if(ps!=null){      try {        ps.close();      } catch (SQLException e) {        // TODO Auto-generated catch block        e.printStackTrace();      }    }    if(con!=null){      try {        con.close();      } catch (SQLException e) {        // TODO Auto-generated catch block        e.printStackTrace();      }    }  }  /***   * 同意增刪改的方法   * @param sql   * @param arr   * @return   */  public static boolean addUpdateDelete(String sql,Object[] arr){    Connection con=null;    PreparedStatement ps=null;    try {      con=BaseDao.getCon();//第一步 :連接數(shù)據(jù)庫的操作      ps=con.prepareStatement(sql);//第二步:預(yù)編譯      //第三步:設(shè)置值      if(arr!=null && arr.length!=0){        for(int i=0;i<arr.length;i++){          ps.setObject(i+1, arr[i]);        }      }      int count=ps.executeUpdate();//第四步:執(zhí)行sql語句      if(count>0){        return true;      }else{        return false;      }    } catch (ClassNotFoundException e) {      // TODO Auto-generated catch block      e.printStackTrace();    } catch (SQLException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }    return false;  }  /*public static void main(String[] args) {    try {      BaseDao.getCon();    } catch (ClassNotFoundException e) {      // TODO Auto-generated catch block      e.printStackTrace();    } catch (SQLException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }  }*/}

6. 這里直接在主方法里面進(jìn)行了測試,所以寫了UserDao進(jìn)行測試,看效果即可。

package com.bie.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import com.bie.utils.BaseDao;/*** @author BieHongLi* @version 創(chuàng)建時(shí)間:2017年2月27日 下午3:19:49**/public class UserDao {  /***   * 注意點(diǎn):   *   (1)一個(gè)sql語句操作不需要手動(dòng)提交事務(wù)   *   (2)查詢操作也不需要手動(dòng)提交事務(wù),   *   (3)但是更新,插入,刪除都需要手動(dòng)提交事務(wù)   *  (4)余額為負(fù)的可以先查詢出結(jié)果再進(jìn)行判斷,然后再操作   * @param args   */  public static void main(String[] args) {    Connection con=null;    PreparedStatement ps1=null;    PreparedStatement ps2=null;    try {      //第一步:連接數(shù)據(jù)庫的操作      con=BaseDao.getCon();      //默認(rèn)自動(dòng)提交事務(wù),所以默認(rèn)是true,現(xiàn)在將true改為false,禁止默認(rèn)自動(dòng)提交事務(wù)      //con.setAutoCommit(true);      //事務(wù)1:如果設(shè)置為false,則需要手動(dòng)提交事務(wù)      con.setAutoCommit(false);      //第二步:更新的sql語句      String sql="update bank_a set usera_rmb=usera_rmb-500 where usera_id=1 ";      String sql2="update bank_b set userb_rmb=userb_rmb+500 where userb_id=1 ";      //第三步:預(yù)編譯sql      ps1=con.prepareStatement(sql);      //第四步:執(zhí)行sql語句,雖然執(zhí)行了sql,但是還沒持久化更新到數(shù)據(jù)庫      ps1.executeUpdate();      //第三步:預(yù)編譯sql2      ps2=con.prepareStatement(sql2);      //第四步:執(zhí)行sql2,雖然執(zhí)行了sql2,但是還沒持久化更新到數(shù)據(jù)庫      ps2.executeUpdate();      System.out.println("轉(zhuǎn)賬成功...");      //事務(wù)2:手動(dòng)提交事務(wù),如果兩個(gè)都執(zhí)行成功了,那么提交事務(wù)      con.commit();    } catch (ClassNotFoundException e) {      e.printStackTrace();      try {        //事務(wù)3:如果拋出異常,那么回滾事務(wù)        con.rollback();      } catch (SQLException e1) {        e1.printStackTrace();      }    } catch (SQLException e) {      e.printStackTrace();    }finally {      //關(guān)閉資源,避免出現(xiàn)異常      BaseDao.close(con, ps1, null);      BaseDao.close(null, ps2, null);    }  }}

演示效果如下所示:

Java,JDBC,事務(wù),銀行轉(zhuǎn)賬,貨物進(jìn)出庫

 

希望本文所述對大家java程序設(shè)計(jì)有所幫助。


注:相關(guān)教程知識(shí)閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 剑阁县| 皋兰县| 电白县| 宣武区| 乌鲁木齐县| 敦化市| 南和县| 仙游县| 芜湖市| 鄂托克前旗| 唐河县| 吉林省| 临漳县| 汝城县| 社旗县| 陈巴尔虎旗| 吴忠市| 东阳市| 贡嘎县| 兖州市| 云龙县| 论坛| 阳高县| 盐山县| 灵石县| 昌黎县| 保亭| 拉萨市| 怀化市| 彩票| 甘德县| 秦安县| 连州市| 汨罗市| 唐山市| 个旧市| 石家庄市| 诸城市| 垦利县| 上栗县| 惠东县|