日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

jdbc dao 工具类mysql_Java基于JDBC实现事务,银行转账及货物进出库功能示例

發布時間:2025/3/8 数据库 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jdbc dao 工具类mysql_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. 首先創建一個數據表或者兩個數據表,這里為了演示清楚創建兩個數據表

5. 創建好數據庫和數據表,然后進行工具類的書寫BaseDao.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 創建時間: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

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進行測試,看效果即可。

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 dao 工具类mysql_Java基于JDBC实现事务,银行转账及货物进出库功能示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。