java实现转账功能_如何利用Java代码模拟银行转账这一功能?
今天是劉小愛自學(xué)Java的第70天。
感謝你的觀看,謝謝你。
話不多說,開始今天的學(xué)習(xí):
轉(zhuǎn)賬,相信基本都接觸過,無論是線下用銀行卡轉(zhuǎn)賬還是線上用手機(jī)轉(zhuǎn)賬,本質(zhì)上都是差不多的。
一、轉(zhuǎn)賬案例
需要兩個(gè)賬戶:劉小愛賬戶和劉媽媽賬戶;劉小愛賬戶轉(zhuǎn)出;劉媽媽賬戶轉(zhuǎn)入。
劉小愛要給劉媽媽轉(zhuǎn)賬,畢竟要攢著將來娶媳婦,emm……就轉(zhuǎn)1000吧(看來是娶不到媳婦了……)
在數(shù)據(jù)庫中用sql語句編寫一個(gè)賬戶信息表,同時(shí)也是對sql語法的一次回顧:
當(dāng)然,賬戶信息表肯定是在銀行的數(shù)據(jù)庫中的,并且是最重要的一個(gè)存在,會嚴(yán)加防范。
我這邊只是模擬這個(gè)案例,所以在自己的數(shù)據(jù)庫上創(chuàng)建了一個(gè)賬戶信息表。
表很簡單:主要兩個(gè)屬性,賬戶名和賬戶余額。
現(xiàn)在編寫代碼:
劉小愛賬戶給劉媽媽賬戶轉(zhuǎn)1000劉小愛賬戶余額減少1000劉媽媽賬戶余額增加1000
根據(jù)代碼可拓展性原則,并未將賬戶名,轉(zhuǎn)賬金額寫死。
①提示用戶輸入信息
這個(gè)本來是應(yīng)該在網(wǎng)頁上面顯示信息提醒用戶的,但是這塊還不會,就用Java中的控制臺來模擬。
也就是Scanner這個(gè)類的使用。
②從德魯伊連接池中獲取連接
這個(gè)我們昨天將德魯伊連接池封裝進(jìn)工具類JdbcUtil了,所以可以直接用工具類獲取連接。
③轉(zhuǎn)出賬戶預(yù)編譯
轉(zhuǎn)出賬戶名為inName,轉(zhuǎn)出的金額為money。
那么要將數(shù)據(jù)庫中對應(yīng)賬戶名的money減少對應(yīng)的金額。
④轉(zhuǎn)入賬戶預(yù)編譯
轉(zhuǎn)入賬戶名為outName,轉(zhuǎn)入金額為money。
那么要將數(shù)據(jù)庫中對應(yīng)賬戶名的money增加對應(yīng)的金額。
代碼編寫完成,現(xiàn)在再做測試:
指定轉(zhuǎn)出賬戶為:劉小愛
指定轉(zhuǎn)入賬戶為:劉媽媽
設(shè)定轉(zhuǎn)賬金額為:1000
二、事務(wù)的引入
要知道我們轉(zhuǎn)賬本質(zhì)上是轉(zhuǎn)出方先將錢轉(zhuǎn)到銀行,銀行再將錢轉(zhuǎn)入到轉(zhuǎn)入方。
這樣就會存在一個(gè)問題:
比如劉小愛的錢從他的賬戶中轉(zhuǎn)出去了,但是銀行還沒有將錢轉(zhuǎn)到劉媽媽的賬戶中,突然銀行發(fā)生了突發(fā)事故。
至于什么事故,反正就是沒法轉(zhuǎn)錢到劉媽媽賬戶上了。
用代碼模擬這種情況:
上面有異常是直接throws了,現(xiàn)在要自行處理。
使用IDEA開發(fā)工具快捷鍵Ctrl+Alt+T:可以選擇一塊代碼try……catch
①轉(zhuǎn)出賬戶
這段代碼就相當(dāng)于劉小愛賬戶里的錢轉(zhuǎn)到銀行了。
②自己寫一個(gè)異常
我們都知道分母是不能為0的,也就是說程序執(zhí)行到這里會報(bào)錯(cuò)。這個(gè)是用來模擬銀行出事了。
③轉(zhuǎn)入賬戶
本來銀行是應(yīng)該將錢轉(zhuǎn)入到劉媽媽賬戶的,但是因?yàn)榘l(fā)生了異常,導(dǎo)致這段代碼沒法執(zhí)行。
我們看看最終的結(jié)果:
劉小愛賬戶里的錢減少了,但是劉媽媽賬戶里的錢沒有增加。那這怎么行?這不是在坑我么?
所以為了解決這個(gè)問題,數(shù)據(jù)庫就引入了事務(wù)的概念。
事務(wù)指的是邏輯上的一組操作,組成這組操作的各個(gè)單元要么全都成功,要么全都失敗。
以上面的這個(gè)例子來說明就是:
有兩個(gè)操作:轉(zhuǎn)出賬戶和轉(zhuǎn)入賬戶。轉(zhuǎn)出成功,轉(zhuǎn)入成功,就成功了。成功了,事務(wù)提交,轉(zhuǎn)賬完成。轉(zhuǎn)出成功,轉(zhuǎn)入失敗,那對不起,全部失敗。轉(zhuǎn)出失敗,轉(zhuǎn)入成功,也還是失敗。失敗了,事務(wù)回滾,回到轉(zhuǎn)賬前的狀態(tài)。三、事務(wù)操作
1mysql中的事務(wù)
①mysql中開啟事務(wù)
start transaction;
transaction,翻譯過來就是事務(wù)的意思。
②mysql中事務(wù)提交
commit;就一個(gè)單詞,翻譯過來就是提交的意思。
③mysql中事務(wù)回滾
rollback;翻譯過來也就是回滾的意思,回滾是什么意思呢?就可以理解成回到開啟事務(wù)時(shí)的狀態(tài)。
2Java中的事務(wù)
①Java中開啟事務(wù)
Java中連接接口collection有一個(gè)api叫setAutoCommit()
翻譯過來就是設(shè)置自動提交,顧名思義也就是說:
如果是true,事務(wù)會自動提交;
如果是false,事務(wù)不自動提交。
將其設(shè)置成false,我們手動提交。
②Java中提交事務(wù)
collection也有一個(gè)commit()方法,顧名思義也就是提交的意思。
③Java中提交事務(wù)
collection還有一個(gè)rollback()方法,顧名思義也就是回滾的意思。
好,現(xiàn)在代碼編寫完:
如果有異常,執(zhí)行③事務(wù)回滾,數(shù)據(jù)庫數(shù)據(jù)不變。如果沒有異常,執(zhí)行②事務(wù)提交,數(shù)據(jù)庫數(shù)據(jù)改變當(dāng)然,我發(fā)現(xiàn)了一個(gè)問題:
就是哪怕沒有事務(wù)回滾,如果有異常,因?yàn)楦緵]有執(zhí)行到事務(wù)提交,數(shù)據(jù)庫數(shù)據(jù)還是不會改變的。
也就是說這個(gè)例子中,就算沒有事務(wù)回滾,結(jié)果也沒影響。
我嘗試著將第一步中設(shè)置成自動提交,然后出現(xiàn)異常事務(wù)回滾,發(fā)現(xiàn)也沒用。
所以總結(jié)就是:
事務(wù)提交前出現(xiàn)異常,就不提交了,那么回滾豈不是沒用?
事務(wù)提交了,說明沒錯(cuò),那么回滾豈不是還是沒用?
那么問題來了,回滾到底有什么用呢?
這個(gè)問題我網(wǎng)上查詢了下,暫時(shí)還不太清楚,它肯定是有它的應(yīng)用場景的,只不過說我的水平有限,暫時(shí)還沒有發(fā)現(xiàn)。
最后:
謝謝你的觀看。
如果可以的話,麻煩幫忙點(diǎn)個(gè)贊,謝謝你。
總結(jié)
以上是生活随笔為你收集整理的java实现转账功能_如何利用Java代码模拟银行转账这一功能?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python嵌入html_Python
- 下一篇: java飞机大战流程图_JAVA课程设计