Java程序設計基礎教程(慕課版)(第2版) 課件 第12單元 綜合實訓-簡易網(wǎng)上銀行系統(tǒng)_第1頁
Java程序設計基礎教程(慕課版)(第2版) 課件 第12單元 綜合實訓-簡易網(wǎng)上銀行系統(tǒng)_第2頁
Java程序設計基礎教程(慕課版)(第2版) 課件 第12單元 綜合實訓-簡易網(wǎng)上銀行系統(tǒng)_第3頁
Java程序設計基礎教程(慕課版)(第2版) 課件 第12單元 綜合實訓-簡易網(wǎng)上銀行系統(tǒng)_第4頁
Java程序設計基礎教程(慕課版)(第2版) 課件 第12單元 綜合實訓-簡易網(wǎng)上銀行系統(tǒng)_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第12單元綜合實訓——簡易網(wǎng)上銀行系統(tǒng)Java程序設計基礎教程((慕課版)(第2版))目錄導航12.1

JDBC12.3測試12.2日志12.4事務12.5簡易網(wǎng)上銀行系統(tǒng)12.6單元小結12.1.1JDBC簡介JDBC的全稱是JavaDatabaseConnectivity(Java數(shù)據(jù)庫連接),它是一套用于執(zhí)行SQL(StructuredQueryLanguage,結構化查詢語言)語句的JavaAPI。通過該API,開發(fā)者可以快速連接到關系數(shù)據(jù)庫,并使用SQL實現(xiàn)對數(shù)據(jù)庫中數(shù)據(jù)的增、刪、改、查功能。JDBC要求各數(shù)據(jù)庫廠商按照統(tǒng)一的規(guī)范提供數(shù)據(jù)庫驅動,用戶無須直接與底層數(shù)據(jù)進行交互,大大增強了代碼的可移植性。JDBC模型示意圖如圖所示。12.1.2JDBC的通用API導入MySQL驅動包的步驟如下。01OPTIONDriver接口step01

右擊項目名稱,在彈出的快捷菜單中選擇“BuildPath”→“ConfigureBuildPath”,如左圖所示;進入“JavaBuildPath”界面,如右圖所示。12.1.2JDBC的通用APIstep02

在“Libraries”選項卡中單擊“AddExternalJARs”按鈕,選擇源代碼中的MySQL驅動包,如左圖所示。step03

然后單擊“打開”按鈕即可,如右圖所示。12.1.2JDBC的通用APIDriverManager類用于加載JDBC驅動并創(chuàng)建與數(shù)據(jù)庫的連接。該類有兩個靜態(tài)方法,一個是registerDriver(Driverdriver)方法,用于向DriverManager類中注冊給定的JDBC驅動程序;另一個是getConnection(Stringurl,Stringuser,Stringpwd)方法,用于建立用戶和數(shù)據(jù)庫的連接,并返回一個Connection對象。下面通過任務12-1了解DriverManager類的使用。02OPTIONDriverManager類Connection接口代表Java程序對數(shù)據(jù)庫的連接,負責對數(shù)據(jù)庫的訪問和操作。通過Connection接口,用戶可以根據(jù)自己的需求進行數(shù)據(jù)庫的對應操作。

Connection接口可以創(chuàng)建Statement對象(使用createStatement()方法)、PreparedStatement對象(使用prepareStatement()方法)和CallableStatement對象(使用prepareCall()方法),這些對象分別用于將一個SQL語句、一個參數(shù)化的SQL語句和一個存儲過程放到數(shù)據(jù)庫服務器上執(zhí)行。Connection接口03OPTION任務12-1DriverManager類的使用publicclassDriverManagerDemo{publicstaticvoidmain(String[]args){//數(shù)據(jù)庫驅動的URL,其模式是:jdbc:MySQL://[ip]:[port]/[databaseName][?參數(shù)名1][=參數(shù)值1][&參數(shù)名2][=參數(shù)值2]...Stringurl="jdbc:MySQL://localhost:3306/jdbc?characterEncoding=utf8&useSSL=true";//此處使用root用戶進行連接Stringuser="root";//數(shù)據(jù)庫的密碼Stringpwd="123";//數(shù)據(jù)庫連接對象Connectionconn=null;

文件DriverManagerDemo.javatry{//使用DriverManager類獲取一個數(shù)據(jù)庫連接conn=DriverManager.getConnection(url,user,pwd);System.out.println("數(shù)據(jù)庫連接是:"+conn);//獲取到的數(shù)據(jù)庫連接}catch(SQLExceptione){e.printStackTrace();}finally{if(null!=conn){try{conn.close();}catch(SQLExceptione){e.printStackTrace();}}}}}運行結果如圖12-6所示。12.1.2JDBC的通用APIStatement接口用于執(zhí)行靜態(tài)的SQL語句,并返回處理結果。Statement接口通過Connection接口的createStatement()方法獲取。該接口有3個主要的方法:execute(Stringsql)、executeUpdate(Stringsql)和executeQuery(Stringsql)。execute(Stringsql)方法用于執(zhí)行任何SQL語句,其返回值是一個boolean類型的對象。如果返回值為true,表明有查詢結果,可以通過Statement接口的getResultSet()方法獲取查詢結果。executeUpdate(Stringsql)方法用于執(zhí)行SQL語句中的INSERT(插入)、UPDATE(更新)和DELETE(刪除)語句。該方法返回圖12-6運行結果

一個int類型的值,表示受該語句影響的記錄數(shù)。executeQuery(Stringsql)方法用于執(zhí)行SQL語句中的SELECT(查詢)語句,該方法返回一個ResultSet對象。下面通過任務12-2了解Statement接口的使用。04OPTIONStatement接口任務12-2Statement接口的使用publicclassStatementDemo{publicstaticvoidmain(String[]args){//創(chuàng)建一個表StringcreateTableSql="createtableusers(idintprimarykey,"+"namevarchar(40),passwordvarchar(32),shortNamevarchar(40),"+"accountvarchar(1000))"+"charactersetutf8collateutf8_general_ci;";

//插入一條數(shù)據(jù)StringinsertValueSql="insertintousersvalues(100001,\"zhangsan\","+"\"123456\",\"zs\",\"****,***\")";//數(shù)據(jù)庫驅動的URL,其模式是:jdbc:MySQL://[ip]:[port]/[databaseName][?參數(shù)名1][=參數(shù)值1][&參數(shù)名2][=參數(shù)值2]...Stringurl="jdbc:MySQL://localhost:3306/jdbc?characterEncoding=utf8&useSSL=true";//此處使用root用戶進行連接Stringuser="root";//數(shù)據(jù)庫的密碼Stringpwd="123";//數(shù)據(jù)庫的Connection對象Connectionconn=null;//數(shù)據(jù)庫的Statement操作對象Statementstatement=null;文件StatementDemo.java任務12-2Statement接口的使用try{//使用DriverManager類獲取一個數(shù)據(jù)庫連接conn=DriverManager.getConnection(url,user,pwd);//設置不進行自動提交conn.setAutoCommit(false);

//獲取Statement對象statement=conn.createStatement();

//創(chuàng)建一個users表statement.execute(createTableSql);System.out.println("表創(chuàng)建成功,手動提交表創(chuàng)建信息!");//手動提交數(shù)據(jù)mit();

//插入數(shù)據(jù)intcount=statement.executeUpdate(insertValueSql);System.out.println("數(shù)據(jù)庫插入數(shù)據(jù)條數(shù):"+count);//手動提交數(shù)據(jù)mit();}catch(SQLExceptione){e.printStackTrace();}finally{//關閉資源if(null!=statement){try{statement.close();}catch(SQLExceptione){e.printStackTrace();}}if(null!=conn){try{conn.close();}catch(SQLExceptione){e.printStackTrace();}}}}}任務12-2Statement接口的使用運行結果如圖12-7所示。為了驗證表是否創(chuàng)建成功并且成功插入數(shù)據(jù),可在MySQLWorkbench中的users表進行查詢,如圖12-8所示。PreparedStatement接口是Statement接口的子接口,用于執(zhí)行預編譯的SQL語句。該語句擴展了帶有參數(shù)的SQL語句的執(zhí)行操作,使用占位符“?”來表示某處需要一個參數(shù),并通過set×××()方法進行參數(shù)賦值。值得注意的是,PreparedStatement接口支持批處理操作。ResultSet接口用于保存JDBC執(zhí)行查詢操作時返回的結果集。該結果集封裝在邏輯表格中,ResultSet接口使用游標進行數(shù)據(jù)的獲取。游標默認指向表格的第一行之前,調用next()方法時會向下一行移動。next()方法有一個boolean類型的返回值。如果邏輯表格含有下一行數(shù)據(jù),則該方法返回true,否則返回false。通常,數(shù)據(jù)使用while條件語句進行讀取。05OPTIONPreparedStatement接口和ResultSet接口任務12-3PreparedStatement接口和ResultSet接口的使用publicclassQueryDemo{publicstaticvoidmain(String[]args){//數(shù)據(jù)庫驅動的URL,其模式是:jdbc:MySQL://[ip]:[port]/[databaseName][?參數(shù)名1][=參數(shù)值1][&參數(shù)名2][=參數(shù)值2]...Stringurl="jdbc:MySQL://localhost:3306/jdbc?characterEncoding=utf8&useSSL=true";//此處使用root用戶進行連接Stringuser="root";//數(shù)據(jù)庫的密碼Stringpwd="123";

//判斷表是否存在,若存在則刪除表StringsqlDel="droptableifexistsusers";//創(chuàng)建表StringsqlCreate="createtableusers(idintprimarykey,namevarchar(40),"+"short_namevarchar(40),passwordvarchar(40),accountvarchar(1000),"+"input_datevarchar(10),input_timevarchar(19),last_update_datevarchar(10),"+"last_update_timevarchar(19))";文件QueryDemo.java任務12-3PreparedStatement接口和ResultSet接口的使用//插入數(shù)據(jù)StringsqlInsert1="insertintousersvalues(100001,\"zhangsan\",\"zs\",\"123321\",\"*********\",\"2017-07-03\",\"2017-07-0315:12:45\",\"2017-07-03\",\"2017-07-0315:12:45\")";StringsqlInsert2="insertintousersvalues(100002,\"lisi\",\"ls\",\"123456\",\"*********\",\"2017-07-03\",\"2017-07-0315:12:45\",\"2017-07-03\",\"2017-07-0315:12:45\")";StringsqlInsert3="insertintousersvalues(100003,\"wangwu\",\"ww\",\"654321\",\"*********\",\"2017-07-03\",\"2017-07-0315:12:45\",\"2017-07-03\",\"2017-07-0315:12:45\")";StringsqlInsert4="insertintousersvalues(100004,\"zhaoliu\",\"zs\",\"123654\",\"*********\",\"2017-07-03\",\"2017-07-0315:12:45\",\"2017-07-03\",\"2017-07-0315:12:45\")";//查詢數(shù)據(jù)StringquerySql="selectid,name,short_namefromuserswhereid>?";Connectionconn=null;Statementst=null;PreparedStatementps=null;ResultSetrs=null;try{//使用DriverManager類獲取一個數(shù)據(jù)庫連接conn=DriverManager.getConnection(url,user,pwd);//獲取Statement對象st=conn.createStatement();//如果表存在,則將表刪除任務12-3PreparedStatement接口和ResultSet接口的使用st.execute(sqlDel);//創(chuàng)建表st.execute(sqlCreate);//插入預埋數(shù)據(jù)st.execute(sqlInsert1);st.execute(sqlInsert2);st.execute(sqlInsert3);st.execute(sqlInsert4);

//創(chuàng)建PreparedStatement對象ps=conn.prepareStatement(querySql);//填充參數(shù)ps.setInt(1,100002);//進行查詢rs=ps.executeQuery();

//按行讀取數(shù)據(jù)while(rs.next()){System.out.println(rs.getString(1)+""+rs.getString(3)+""+rs.getString(2));}}catch(SQLExceptione){e.printStackTrace();}finally{//關閉資源if(null!=rs){try{rs.close();}catch(SQLExceptione){e.printStackTrace();}}if(null!=ps){try{ps.close();}catch(SQLExceptione){e.printStackTrace();}}if(null!=st){try{st.close();}catch(SQLExceptione){e.printStackTrace();}}if(null!=conn){try{conn.close();}catch(SQLExceptione){e.printStackTrace();}}}}}任務12-3PreparedStatement接口和ResultSet接口的使用運行結果如圖12-9所示。目錄導航12.1

JDBC12.3測試12.2日志12.4事務12.5簡易網(wǎng)上銀行系統(tǒng)12.6單元小結12.2日志日志是記錄程序運行信息的文本。與飛機的黑匣子和航海日志一樣,可以通過程序運行的日志信息判斷程序的運行情況。特別是在遇到異常時,因為程序部署在服務器上,不像在本地一樣可以通過運行發(fā)現(xiàn)問題,日志就成了至關重要的查錯手段。目前使用的日志中,Log4j是比較穩(wěn)定且常用的日志之一,它是一個Apache開源的項目。通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件,甚至是套接口服務器、網(wǎng)絡終端的事件記錄器、UNIXSyslog守護進程等;也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別,能夠更加細致地控制日志的生成過程。Log4j最大的特點之一就是可以通過配置修改日志輸出的級別而不需要修改任何代碼。Log4j概述01OPTION12.2日志Log4j的級別02OPTIONLog4j的日志級別一般分為5種,分別是DEBUG、INFO、WARN、ERROR和FATAL。日志的級別是為了協(xié)助相關人員快速查詢對應的問題而設定的。Log4j建議只使用4個級別,優(yōu)先級從高到低分別是ERROR、WARN、INFO、DEBUG。FATAL級別表明每個嚴重的錯誤事件都會導致應用程序的退出。FATAL級別05WARN級別表明會出現(xiàn)潛在錯誤。一般此類日志出現(xiàn)得比較少,也比較少用。WARN級別03INFO級別用于在粗粒度級別上突出強調應用程序的運行過程。INFO級別02DEBUG級別的日志提供了應用程序的細粒度信息,這對于應用程序的調試是非常有用的,能夠幫助開發(fā)者判斷程序是否符合預期。DEBUG級別01ERROR級別表明雖然發(fā)生錯誤事件,但仍然不影響系統(tǒng)的繼續(xù)運行。ERROR級別04目錄導航12.1

JDBC12.3測試12.2日志12.4事務12.5簡易網(wǎng)上銀行系統(tǒng)12.6單元小結12.3.1JUnit簡介JUnit是一個開源的Java測試框架,用于編寫和運行可重復的測試。它是用于單元測試框架體系xUnit的一個實例(用于Java語言),包含以下特性。

用于測試期望結果的斷言(Assertion)功能。

用于共享測試數(shù)據(jù)的測試工具。

用于方便組織和運行測試套件的框架。

支持圖形和文本界面的測試運行器。JUnit屬于白盒測試框架,程序員知道軟件是如何實現(xiàn)相關功能的。12.3.2功能測試及斷言JUnit的強大之處在于它可以對測試期望結果進行斷言,這使得測試任務可以自動運行、自行驗證,它會告訴我們測試是否通過,而無須開發(fā)者和維護者判斷結果是否正確。

使用JUnit進行單元測試需要導入測試必需的JAR包,讀者可自行下載或者使用源代碼中提供的JAR包,其導入方式同JDBC驅動包的導入方式一樣。任務12-4簡單的JUnit測試任務文件JunitDemo.javapublicclassJunitDemo{publicintaddDemo(intx,inty){returnx+y;}publicintminus(intx,inty){if(x<=y){return0;}returnx-y;}publicintmulti(intx,inty){returnx*y;}publicintdevide(intx,inty){if(y==0){thrownewIllegalArgumentException("IllegalArgument:y="+y);}returnx/y;}}12.3.2功能測試及斷言文件JunitDemoTest.javapublicclassJunitDemoTest{privatestaticJunitDemojunit=newJunitDemo();@TestpublicvoidtestAddDemo(){System.out.println("addDemo開始測試:");Assert.assertEquals(junit.addDemo(10,3),13);System.out.println("測試通過!");}@TestpublicvoidtestMinus(){System.out.println("minus開始測試:");Assert.assertEquals(junit.minus(15,2),13);System.out.println("測試通過!");}@TestpublicvoidtestMulti(){System.out.println("multi開始測試:");Assert.assertEquals(junit.multi(15,2),30);System.out.println("測試通過!");}@TestpublicvoidtestDevide(){System.out.println("devide開始測試:");Assert.assertEquals(junit.devide(15,3),5);System.out.println("測試通過!");}}運行結果如圖12-10所示。12.3.2功能測試及斷言為了直觀地查看測試是否成功,Eclipse提供了“JUnit”選項卡,專門用于查看測試方法是否正確運行,如圖所示。為了便于測試,JUnit提供了豐富的注解,包括@BeforeClass、@Before、@After和@AfterClass等。其中@BeforeClass和@AfterClass是當類開始運行時執(zhí)行的初始化模塊和資源釋放模塊,它們在類執(zhí)行時只運行一次。@Before、@After與@BeforeClass、@AfterClass不同的地方是這兩個注解在每一個方法運行的時候都會執(zhí)行。如果一次測試同時運行了3個測試方法,那么@Before和@After注解注釋的方法會分別執(zhí)行3次。任務12-5JUnit的注解文件JunitDemoTest2.javapublicclassJunitDemoTest2{privatestaticJunitDemojunit=newJunitDemo();@BeforeClasspublicstaticvoidinit(){System.out.println("開始運行JUnit測試任務:");System.out.println("*****************************");}@AfterClasspublicstaticvoiddestroy(){System.out.println("*****************************");System.out.println("完成一次JUnit測試任務");}@BeforepublicvoidbeginTest(){System.out.println("****開始運行一個新的測試方法****");}@AfterpublicvoidendTest(){System.out.println("****結束一個測試方法的運行****");}@TestpublicvoidtestAddDemo(){System.out.println("addDemo開始測試:");Assert.assertEquals(junit.addDemo(10,3),13);System.out.println("測試通過!");}

@TestpublicvoidtestMinus(){System.out.println("minus開始測試:");Assert.assertEquals(junit.minus(15,2),13);System.out.println("測試通過!");}@TestpublicvoidtestMulti(){System.out.println("multi開始測試:");Assert.assertEquals(junit.multi(15,2),30);System.out.println("測試通過!");}@TestpublicvoidtestDevide(){System.out.println("devide開始測試:");Assert.assertEqualss(junit.devide(15,3),5);System.out.println("測試通過!");}}任務12-5JUnit的注解運行結果如圖12-12和圖12-13所示。有些讀者在運行該任務時,會遇到JUnit選項卡拋出initializationError錯誤的情況,這是沒有導入hamcrest-core-1.3.jar這個JAR包導致的,如圖12-14所示。導入它后運行正常。圖12-12運行結果圖12-13運行結果圖12-14initializationError錯誤目錄導航12.1

JDBC12.3測試12.2日志12.4事務12.5簡易網(wǎng)上銀行系統(tǒng)12.6單元小結12.4事務一個邏輯工作單元如果要成為事務,必須滿足所謂的ACID屬性,即原子性(Atomic)、一致性(Consistent)、隔離性(Insulation)和持久性(Duration)。01OPTION事務的特性事務必須是原子工作單元,對于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。如果系統(tǒng)只執(zhí)行這些操作的一個子集,就會破壞事務的總體目標。01一致性是指事務在完成時,必須使所有的數(shù)據(jù)都保持一致狀態(tài)。在相關數(shù)據(jù)庫中,所有規(guī)則都必須應用于事務的修改,以保持所有數(shù)據(jù)的完整性。02隔離性要求由并發(fā)事務所做的修改必須與任何其他并發(fā)事務所做的修改相互隔離。事務查看數(shù)據(jù)時數(shù)據(jù)所處的狀態(tài),要么是另一并發(fā)事務修改它之前的狀態(tài),要么是另一并發(fā)事務修改它之后的狀態(tài)。事務不會查看中間狀態(tài)的數(shù)據(jù),這稱為隔離性。03持久性是指事務完成之后,它對于系統(tǒng)的影響是永久的,即使出現(xiàn)致命的系統(tǒng)故障也將一直保持。04原子性一致性隔離性持久性12.4事務為模擬事務模型,我們使用轉賬模型。假設有兩個賬戶——張三賬戶和李四賬戶,張三賬戶向李四賬戶轉賬500元,則只有在張三賬戶余額減少500元且李四賬戶余額增加500元時,才認為轉賬成功,具體實現(xiàn)如任務12-6所示。02OPTION事務的具體應用任務12-6本地事務文件TransferDemo.javapackagechapter12.transactiondemo;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;publicclassTransferDemo{//定義一個Connection對象privateConnectionconn=null;privateStatementst=null;publicstaticvoidmain(String[]args){//創(chuàng)建事務模型TransferDemotd=newTransferDemo();//創(chuàng)建相關表并初始化數(shù)據(jù)td.createTableAndInsert();//查看賬戶及余額td.getAccountBalance();//調用轉賬模型td.transferDemo();//查看賬戶及余額td.getAccountBalance();//釋放資源td.destroy();}//轉賬事務模型publicvoidtransferDemo(){//假設張三向李四轉賬500元,只有在張三賬戶減少500元,//并且李四賬戶增加500元時轉賬成功。更新語句如下:StringsqlZS="updateaccountaseta.balance=a.balance-500wherea.account='6225001013452310'";StringsqlLS="updateaccountbsetb.balance=b.balance+500whereb.account='6225001013455700'";//執(zhí)行轉賬操作try{System.out.println("進入轉賬流程:");st.execute(sqlZS);//手動拋出一個異常Stringstr=null;str=str.substring(str.indexOf("_"));st.execute(sqlLS);mit();//轉賬成功,則提交事務System.out.println("轉賬成功!");}任務12-6本地事務catch(SQLExceptione){try{conn.rollback();//一旦產(chǎn)生異常,則回滾數(shù)據(jù)庫}catch(SQLExceptione1){e1.printStackTrace();}e.printStackTrace();}catch(Exceptione1){e1.printStackTrace();}}//獲取當前賬戶余額情況publicvoidgetAccountBalance(){Connectionconn1=null;//查看兩者賬戶的余額StringsqlQuery="selecta.owner,a.balancefromaccountawherea.accountin('6225001013455700','6225001013452310')";//創(chuàng)建ResultSet對象查看詳情//查詢兩者賬戶余額情況PreparedStatementps=null;ResultSetrs=null;try{//獲取一個新的數(shù)據(jù)庫連接,并且將自動提交設置為falseconn1=getConnection();conn1.setAutoCommit(false);ps=conn1.prepareStatement(sqlQuery);rs=ps.executeQuery();//獲取查詢結果while(rs.next()){System.out.println("賬戶:"+rs.getString("owner")+";余額:"+rs.getString("balance"));}}任務12-6本地事務catch(SQLExceptione){e.printStackTrace();}catch(Exceptione1){e1.printStackTrace();}finally{//代碼片段處理結束,無論執(zhí)行成功還是失敗,都釋放數(shù)據(jù)庫資源if(null!=rs){try{rs.close();}catch(SQLExceptione){e.printStackTrace();}}if(null!=ps){try{ps.close();}catch(SQLExceptione){e.printStackTrace();}}if(null!=conn1){try{conn1.close();}catch(SQLExceptione){e.printStackTrace();}}}}//創(chuàng)建一個賬戶表,并插入兩條數(shù)據(jù)以供使用publicvoidcreateTableAndInsert(){System.out.println("進入表創(chuàng)建及數(shù)據(jù)初始化步驟:");//如果存在賬戶表,則刪除

StringsqlDel="droptableifexistsaccount";//創(chuàng)建賬戶表accountStringsqlCreate="createtableaccount(accountvarchar(20)primarykey,"+"ownervarchar(40),balanceint,input_datevarchar(10),input_timevarchar(19),"+"last_update_datevarchar(10),last_update_timevarchar(19))";//插入一條數(shù)據(jù)zhangsanStringsqlInsertZS="INSERTINTO`jdbc`.`account`(`account`,`owner`,`balance`,`input_date`,"+"`input_time`,`last_update_date`,`last_update_time`)VALUES('6225001013452310',"+"'zhangsan','5000','2017-07-01','2017-07-0110:32:12','2017-07-01',"+"'2017-07-0110:32:12')";//插入一條數(shù)據(jù)lisiStringsqlInserLS="INSERTINTO`jdbc`.`account`(`account`,`owner`,`balance`,`input_date`,"+"`input_time`,`last_update_date`,`last_update_time`)VALUES('6225001013455700',"+"'lisi','3000','2017-07-01','2017-07-0110:32:12','2017-07-01',"+"'2017-07-0110:32:12')";任務12-6本地事務try{//使用JDBC數(shù)據(jù)庫st.execute("usejdbc");//如果表存在,則刪除st.execute(sqlDel);//創(chuàng)建表st.execute(sqlCreate);//插入數(shù)據(jù)st.execute(sqlInsertZS);st.execute(sqlInserLS);mit();}catch(SQLExceptione){//如果產(chǎn)生錯誤,則回滾try{conn.rollback();}catch(SQLExceptione1){e1.printStackTrace();}e.printStackTrace();}System.out.println("表及數(shù)據(jù)初始化工作完成!");}//構造方法publicTransferDemo(){//初始化數(shù)據(jù)庫連接System.out.println("數(shù)據(jù)庫連接初始化開始:");init();System.out.println("數(shù)據(jù)庫連接初始化結束!");}

//初始化方法,用于初始化數(shù)據(jù)庫連接publicvoidinit(){//如果數(shù)據(jù)庫連接已經(jīng)被初始化了,則直接返回if(null!=conn){if(null==st){//如果Statement對象沒有被創(chuàng)建,則創(chuàng)建try{//創(chuàng)建Statement對象

st=conn.createStatement();}catch(SQLExceptione){e.printStackTrace();}}return;}任務12-6本地事務//若數(shù)據(jù)庫連接未被初始化,進行初始化try{//初始化數(shù)據(jù)庫連接conn=getConnection();conn.setAutoCommit(false);//初始化Statement連接st=conn.createStatement();}catch(Exceptione){e.printStackTrace();}}//銷毀方法,用于關閉數(shù)據(jù)庫連接,釋放資源publicvoiddestroy(){//如果Statement連接沒有被關閉,則關閉if(null!=st){try{st.close();}catch(SQLExceptione){e.printStackTrace();}}//如果數(shù)據(jù)庫的Connection連接沒有被關閉,則關閉if(null!=conn){try{conn.close();}catch(SQLExceptione){e.printStackTrace();}}}//獲取數(shù)據(jù)庫連接publicConnectiongetConnection()throwsException{//數(shù)據(jù)庫驅動的URL,其模式是:jdbc:MySQL://[ip]:[port]/[databaseName][?參數(shù)名1][=參數(shù)值1][&參數(shù)名2][=參數(shù)值2]...Stringurl="jdbc:MySQL://localhost:3306/jdbc?characterEncoding=utf8&useSSL=true";//此處使用root用戶進行連接Stringuser="root";//數(shù)據(jù)庫的密碼Stringpwd="123456";//數(shù)據(jù)庫連接對象Connectionconn=null;try{//使用DriverManager類獲取一個數(shù)據(jù)庫連接conn=DriverManager.getConnection(url,user,pwd);//返回數(shù)據(jù)庫連接returnconn;}catch(SQLExceptione){e.printStackTrace();}returnnull;}}任務12-6本地事務運行結果如圖12-15所示。12.4事務從運行結果可以看出,事務是正常執(zhí)行完成的。為了模擬出錯的情況,在轉賬步驟還未提交前手動拋出一個錯誤,并查看運行結果,如下所示://轉賬事務模型publicvoidtransferDemo(){//假設張三向李四轉賬500元,只有在張三賬戶減少500元,//并且李四賬戶增加500元時轉賬成功。更新語句如下:StringsqlZS="updateaccountaseta.balance=a.balance-500wherea.account='6225001013452310'";StringsqlLS="updateaccountbsetb.balance=b.balance+500whereb.account='6225001013455700'";//執(zhí)行轉賬操作try{System.out.println("進入轉賬流程:");st.execute(sqlZS);//手動拋出一個異常Stringstr=null;str=str.substring(str.indexOf("_"));st.execute(sqlLS);mit();//轉賬成功,則提交事務System.out.println("轉賬成功!");}任務12-6本地事務catch(SQLExceptione){try{//一旦產(chǎn)生異常,則回滾數(shù)據(jù)庫conn.rollback();}catch(SQLExceptione1){e1.printStackTrace();}e.printStackTrace();}catch(Exceptione1){e1.printStackTrace();}}為了驗證事務的有效性,在轉賬方法中手動拋出一個空指針異常,程序的運行結果如圖12-16所示。目錄導航12.1

JDBC12.3測試12.2日志12.4事務12.5簡易網(wǎng)上銀行系統(tǒng)12.6單元小結12.5.1基礎項目搭建Tomcat最初是由Sun公司的軟件架構師詹姆斯·鄧肯·戴維森開發(fā)的,后來他將其變?yōu)殚_源項目,并由Sun公司貢獻給Apache軟件基金會。它是一個免費的、開源的Web應用服務器,屬于輕量級應用服務器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調試JSP程序的首選。Tomcat是免安裝的,只需要在Tomcat官網(wǎng)下載對應的ZIP包,解壓到本地目錄并添加到Eclipse中即可。讀者可以在Tomcat官網(wǎng)下載最新版本的TomcatZIP包,下載后解壓到固定目錄下;打開Eclipse開發(fā)工具,選擇工具欄上的“Window”→“Preferences”,如圖12-17所示。TomcatWeb服務器01OPTION12.5.1基礎項目搭建在彈出

的“Preferences”窗口中

,首

先找到“Server”,

然后

選擇其

下的“RuntimeEnvironment”選項并單擊;彈出服務器配置對話框,選擇“ApacheTomcatv8.5”,如圖所示。單擊“Next”按鈕,會彈出具體的服務器配置對話框,如圖12-19所示。首先單擊“Browse”按鈕,打開“選擇文件夾”對話框;在路徑中搜索選擇Tomcat解壓路徑并確認選擇,最后單擊“Finish”按鈕,完成Tomcat的配置工作。12.5.1基礎項目搭建完成配置之后,在Eclipse工具的“Servers”選項卡中添加服務器,如圖12-20所示。在彈出的對話框中選擇配置好的服務器,最后單擊“Finish”按鈕完成添加。完成添加之后,就可以看到“Servers”選項卡中有了一個Tomcat服務器的標識,如圖12-21所示。12.5.1基礎項目搭建至此,Tomcat的準備工作就完成了。需要注意Tomcat一些的配置,例如監(jiān)聽端口號等,因為Tomcat默認使用8080端口,而這個端口可能會被Oracle數(shù)據(jù)服務器占用。所以,如果讀者使用的是Oracle數(shù)據(jù)庫,可以將Tomcat的端口修改成8081。具體修改在“Package”下的“Servers”中進行,其修改方式如圖12-22所示。配置完成后,單擊“啟動”按鈕,啟動Tomcat服務器。無報錯啟動完成后,在瀏覽器地址欄中輸入http://localhost:8080并按【Enter】鍵訪問Tomcat服務器,顯示頁面如圖12-23所示,表示服務器已經(jīng)正確配置。12.5.1基礎項目搭建Maven項目對象模型(ProjectObjectModel,POM)可以通過一小段描述信息來管理項目的構建,是管理報告和文檔的軟件項目管理工具。Maven會自動管理JAR包,只需要知道JAR包的位置即可。如需要相應的JAR包信息,可以在MVNREPOSITORY網(wǎng)站中查找對應的JAR包,其使用方式如圖12-24和圖12-25所示。Maven02OPTION12.5.1基礎項目搭建Maven項目對象模型(ProjectObjectModel,POM)可以通過一小段描述信息來管理項目的構建,是管理報告和文檔的軟件項目管理工具。Maven會自動管理JAR包,只需要知道JAR包的位置即可。如需要相應的JAR包信息,可以在MVNREPOSITORY網(wǎng)站中查找對應的JAR包,其使用方式如圖12-24和圖12-25所示。Maven02OPTION12.5.1基礎項目搭建12.5.1基礎項目搭建先創(chuàng)建一個Maven的Webapp項目,其步驟如圖12-26~圖12-29所示。完成配置之后,項目的框架如圖12-30所示。12.5.1基礎項目搭建創(chuàng)建完成之后,進行相應的配置即可使用該項目進行開發(fā)。配置pom.xml,完成項目的JAR包導入,其配置如下:<projectxmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.lw</groupId><artifactId>simplebank</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>simplebankMavenWebapp</name><url></url>

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format><spring.version>4.3.9.RELEASE</spring.version><mybatis.version>3.1.1</mybatis.version><mybatisspring.version>1.1.1</mybatisspring.version></properties>12.5.1基礎項目搭建<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-Webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatisspring.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>6.0.6</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version></version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>3.0-alpha-1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>jsptags</groupId><artifactId>pager-taglib</artifactId><version>2.0</version><scope>provided</scope></dependency>12.5.1基礎項目搭建<dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.10</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.10</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.41</version></dependency><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.13</version></dependency><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.5</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.7.4</version></dependency>12.5.1基礎項目搭建<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.7.4</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.7.4</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>1.3.2</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.2.1</version></dependency></dependencies><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>2.2</version><configuration><version>3.0</version><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin></plugins>12.5.1基礎項目搭建<resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources><finalName>simple-bank</finalName></build></project><mirror><id>alimaven</id><name>aliyunmaven</name><url>/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror>這里,本地的Maven鏡像使用的是阿里巴巴提供的Maven倉庫,該項配置在Maven的settings.xml中添加即可,如下所示:12.5.1基礎項目搭建log4j.rootLogger=info,console,debug,app,error###console###log4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.Target=System.outlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=%d%p[%C:%L]-%m%n###debug###log4j.appender.debu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論