一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - Java基于JDBC實現事務,銀行轉賬及貨物進出庫功能示例

Java基于JDBC實現事務,銀行轉賬及貨物進出庫功能示例

2021-03-13 11:42小金庫 JAVA教程

這篇文章主要介紹了Java基于JDBC實現事務,銀行轉賬及貨物進出庫功能,較為詳細的分析了事務操作的原理、實現方法及java基于jdbc連接數據庫實現銀行事務操作的相關技巧,需要的朋友可以參考下

本文實例講述了java基于jdbc實現事務,銀行轉賬及貨物進出庫功能。分享給大家供大家參考,具體如下:

1. 轉賬業務

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

2. 事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為acid特性。

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

3. 這里以轉賬操作為案例進行演示說明,其注意點如下:

(1)一個sql語句操作不需要手動提交事務

(2)查詢操作也不需要手動提交事務,

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

(4)余額為負的可以先查詢出結果再進行判斷,然后再操作

(5)con.setautocommit(false);手動開啟事務;con.commit();手動提交事務;con.rollback();事務回滾操作

4. 首先創建一個數據表或者兩個數據表,這里為了演示清楚創建兩個數據表

Java基于JDBC實現事務,銀行轉賬及貨物進出庫功能示例

Java基于JDBC實現事務,銀行轉賬及貨物進出庫功能示例

5. 創建好數據庫和數據表,然后進行工具類的書寫basedao.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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 創建時間:2017年2月27日 上午10:09:00
* 連接數據庫的工具類
*/
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";
  /***
   * 連接數據庫的方法
   * @return
   * @throws classnotfoundexception
   * @throws sqlexception
   */
  public static connection getcon() throws classnotfoundexception, sqlexception{
    class.forname(driver);//加載數據庫驅動
    system.out.println("測試加載數據庫成功");
    connection con=drivermanager.getconnection(url, user, password);
    system.out.println("測試數據庫鏈接成功");
    return con;
  }
  /***
   * 關閉數據庫的方法
   * @param con
   * @param ps
   * @param rs
   */
  public static void close(connection con,preparedstatement ps,resultset rs){
    if(rs!=null){//關閉資源,避免出現異常
      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();//第一步 :連接數據庫的操作
      ps=con.preparestatement(sql);//第二步:預編譯
      //第三步:設置值
      if(arr!=null && arr.length!=0){
        for(int i=0;i<arr.length;i++){
          ps.setobject(i+1, arr[i]);
        }
      }
      int count=ps.executeupdate();//第四步:執行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. 這里直接在主方法里面進行了測試,所以寫了userdao進行測試,看效果即可。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.bie.dao;
import java.sql.connection;
import java.sql.preparedstatement;
import java.sql.sqlexception;
import com.bie.utils.basedao;
/**
* @author biehongli
* @version 創建時間:2017年2月27日 下午3:19:49
*
*/
public class userdao {
  /***
   * 注意點:
   *   (1)一個sql語句操作不需要手動提交事務
   *   (2)查詢操作也不需要手動提交事務,
   *   (3)但是更新,插入,刪除都需要手動提交事務
   *  (4)余額為負的可以先查詢出結果再進行判斷,然后再操作
   * @param args
   */
  public static void main(string[] args) {
    connection con=null;
    preparedstatement ps1=null;
    preparedstatement ps2=null;
    try {
      //第一步:連接數據庫的操作
      con=basedao.getcon();
      //默認自動提交事務,所以默認是true,現在將true改為false,禁止默認自動提交事務
      //con.setautocommit(true);
      //事務1:如果設置為false,則需要手動提交事務
      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 ";
      //第三步:預編譯sql
      ps1=con.preparestatement(sql);
      //第四步:執行sql語句,雖然執行了sql,但是還沒持久化更新到數據庫
      ps1.executeupdate();
      //第三步:預編譯sql2
      ps2=con.preparestatement(sql2);
      //第四步:執行sql2,雖然執行了sql2,但是還沒持久化更新到數據庫
      ps2.executeupdate();
      system.out.println("轉賬成功...");
      //事務2:手動提交事務,如果兩個都執行成功了,那么提交事務
      con.commit();
    } catch (classnotfoundexception e) {
      e.printstacktrace();
      try {
        //事務3:如果拋出異常,那么回滾事務
        con.rollback();
      } catch (sqlexception e1) {
        e1.printstacktrace();
      }
    } catch (sqlexception e) {
      e.printstacktrace();
    }finally {
      //關閉資源,避免出現異常
      basedao.close(con, ps1, null);
      basedao.close(null, ps2, null);
    }
  }
}

演示效果如下所示:

Java基于JDBC實現事務,銀行轉賬及貨物進出庫功能示例

希望本文所述對大家java程序設計有所幫助。

原文鏈接:http://www.cnblogs.com/biehongli/p/6474769.html

延伸 · 閱讀

精彩推薦
  • JAVA教程Spring測試 其實很簡單

    Spring測試 其實很簡單

    這篇文章主要為大家詳細介紹了Spring測試,其實很簡單,揭開集成測試神秘的面紗,感興趣的小伙伴們可以參考一下 ...

    Sandbox Wang1582020-05-26
  • JAVA教程java BASE64Encoder詳細介紹及簡單實例

    java BASE64Encoder詳細介紹及簡單實例

    這篇文章主要介紹了java BASE64Encoder詳細介紹及簡單實例的相關資料,需要的朋友可以參考下...

    jingxian2702020-07-30
  • JAVA教程Java編程用兩個棧實現隊列代碼分享

    Java編程用兩個棧實現隊列代碼分享

    這篇文章主要介紹了Java編程用兩個棧實現隊列代碼分享,具有一定參考價值,這里給大家分享下,供需要的朋友了解。...

    diu_brother4562021-01-19
  • JAVA教程使用MyBatis 動態update數據

    使用MyBatis 動態update數據

    使用mybatis寫sql,需要動態更新對象數據,每次需要更新的字段不同,為了防止null空異常,就需要用動態sql了,下面給大家分享一段代碼關于mybatis動態upd...

    commuli2192020-07-06
  • JAVA教程如何使用JAVA實現數字水印

    如何使用JAVA實現數字水印

    本文介紹了如何使用JAVA實現數字水印,主要用到了java.awt包中的AlphaComposite類,需要學習制作水印的朋友可以參考下 ...

    半透明的稻草人3272019-12-30
  • JAVA教程Spring Boot下的Job定時任務

    Spring Boot下的Job定時任務

    編寫Job定時執行任務十分有用,能解決很多問題,這次實習的項目里做了一下系統定時更新三方系統訂單狀態的功能,這里用到了Spring的定時任務使用的非常方...

    說話的方式簡單點丶5112020-10-21
  • JAVA教程Java中GC的工作原理詳細介紹

    Java中GC的工作原理詳細介紹

    這篇文章主要介紹了Java中GC的工作原理詳細介紹的相關資料,需要的朋友可以參考下...

    Java教程網1412020-08-21
  • JAVA教程swing重繪按鈕為任意形狀圖案的方法

    swing重繪按鈕為任意形狀圖案的方法

    這篇文章主要為大家詳細介紹了swing重繪按鈕為任意形狀圖案,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    _Thomas6762021-03-10
主站蜘蛛池模板: 亚洲精品第三页 | 欧美最猛性xxxxx男男 | 日本五十路六十30人8时间 | 99久久精品国语对白 | 国产日韩欧美成人 | 四川女人偷人真实视频 | 欧美一区高清 | ass性强迫rape | 亚洲福利一区 | 久久久久久久电影 | 耽美肉文高h | 九九九九在线精品免费视频 | ts人妖系列在线专区 | 国产第一综合另类色区奇米 | 欧美久久影院 | 456老汉gay| 岛国虐乳紧缚媚药调教 | 日韩欧美综合在线二区三区 | 日本视频一区在线观看免费 | 亚洲 日本 中文字幕 制服 | 国产精品久久久久久久久免费观看 | 极品美女写真菠萝蜜视频 | 日本手机在线视频 | 白丝萝莉喷水 | 欧美日本道免费一区二区三区 | 国产欧美日韩图片一区二区 | 国产精品日韩欧美一区二区 | 国产黄色大片网站 | 国产欧美精品一区二区三区四区 | 午夜私人影院在线观看 视频 | 亚洲国产中文字幕在线视频综合 | 亚洲天堂男人网 | 日本高清免费中文字幕不卡 | 亚洲社区在线观看 | 国内精品久久久久影院男同志 | 四虎影视免费 | 国产一卡2卡3卡四卡国色天香 | 精品国产成人a区在线观看 精品高潮呻吟99AV无码视频 | 热辣小秘书办公室 | 欧洲一级| 9久热这里只有精品免费 |