国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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. 轉賬業(yè)務

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

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

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

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

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

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

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

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

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

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

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

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

5. 創(chuàng)建好數據庫和數據表,然后進行工具類的書寫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 創(chuàng)建時間: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();//第四步:執(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. 這里直接在主方法里面進行了測試,所以寫了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 創(chuàng)建時間: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);
      //第四步:執(zhí)行sql語句,雖然執(zhí)行了sql,但是還沒持久化更新到數據庫
      ps1.executeupdate();
      //第三步:預編譯sql2
      ps2=con.preparestatement(sql2);
      //第四步:執(zhí)行sql2,雖然執(zhí)行了sql2,但是還沒持久化更新到數據庫
      ps2.executeupdate();
      system.out.println("轉賬成功...");
      //事務2:手動提交事務,如果兩個都執(zhí)行成功了,那么提交事務
      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 動態(tài)update數據

    使用MyBatis 動態(tài)update數據

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

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

    如何使用JAVA實現數字水印

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

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

    Spring Boot下的Job定時任務

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

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

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

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

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

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

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

    _Thomas6762021-03-10
主站蜘蛛池模板: 日韩福利视频 | 亚洲精品成人 | 久久午夜剧场 | 在线视频二区 | 国产久| 黑人精品欧美一区二区蜜桃 | 色成人免费网站 | 免费的成人毛片 | av三级在线观看 | 亚洲视频免费 | 久久99精品国产.久久久久 | 91精品久久久久久久久久入口 | 亚洲一级黄色 | 亚洲高清视频一区 | 亚洲精品乱码久久久久久金桔影视 | 91亚洲国产精品 | www.国产精品| 一区二区三区四区日韩 | 九九热视频在线观看 | 亚洲欧美另类图片 | 香蕉成人啪国产精品视频综合网 | 亚洲视频精品在线观看 | 亚州ava| 亚洲精品乱码久久久久久蜜糖图片 | 9999777做爰| 日韩在线中文字幕 | 国产精品69毛片高清亚洲 | 伊人婷婷 | 精品视频网| 精品国产乱码一区二区三区 | 国产午夜精品美女视频明星a级 | 91黄视频 | 午夜视频在线观看免费视频 | 99久久久国产精品 | 久久伊| 免费一级毛片 | porn国产精品 | 九九国产 | 在线看的av | 国产精品久久久久国产精品 | 婷婷激情久久 |