Java程序設(shè)計項目式教程 課件 9-2 登錄功能實現(xiàn)_第1頁
Java程序設(shè)計項目式教程 課件 9-2 登錄功能實現(xiàn)_第2頁
Java程序設(shè)計項目式教程 課件 9-2 登錄功能實現(xiàn)_第3頁
Java程序設(shè)計項目式教程 課件 9-2 登錄功能實現(xiàn)_第4頁
Java程序設(shè)計項目式教程 課件 9-2 登錄功能實現(xiàn)_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

§9-2提升學(xué)生信息數(shù)據(jù)庫管理效率Java面向?qū)ο蟪绦蛟O(shè)計教學(xué)目標(biāo)任務(wù)分析在任務(wù)9.1的實施中,我們應(yīng)該發(fā)現(xiàn),使用Statement對象向數(shù)據(jù)庫傳送SQL命令時,每條SQL命令在程序中都只能是一個具體的操作,當(dāng)要改變SQL命令時,每次都需要去修改程序源代碼,降低程序執(zhí)行效率,程序也不具備通用性,為此我們需要對此程序進行改進,使用PreparedStatement對象來向數(shù)據(jù)庫傳送SQL命令。教學(xué)內(nèi)容1PreparedStatement接口CallableStatement接口23事務(wù)PreparedStatement接口

PreparedStatement接口繼承自Statement,可執(zhí)行預(yù)編譯的SQL語句,可向數(shù)據(jù)庫傳遞帶有可變參數(shù)的SQL命令,SQL命令中使用占位符“?”代替參數(shù),然后通過setXXX方法為SQL命令中的參數(shù)賦值,提高了應(yīng)用程序的通用性。常用的PreparedStatement傳送SQL命令的方法主要有以下兩個:ResultSetexecuteQuery():用于執(zhí)行查詢數(shù)據(jù)庫的SQL命令,返回一個表示查詢結(jié)果集的ResultSet對象。intexecuteUpdate():用于執(zhí)行非查詢的SQL命令,返回一個整數(shù),表示受SQL命令影響的記錄條數(shù)。PreparedStatement接口實現(xiàn)SQL語句的預(yù)處理首先需要預(yù)處理一個待執(zhí)行的SQL語句模板然后為該模板進行參數(shù)綁定最后將用戶提交的數(shù)據(jù)內(nèi)容發(fā)送給MySQL執(zhí)行,完成預(yù)處理的執(zhí)行PreparedStatement接口PreparedStatement接口進行數(shù)據(jù)庫訪問的步驟,主要包括。1)通過Connection對象conn創(chuàng)建PreparedStatement對象。

PreparedStatementpstm=conn.preparedStatement(帶參數(shù)的SQL命令字符串);

如:Stringsql="insertintostudent_infvalues(?,?,?,?)";PreparedStatementpstm=conn.preparedStatement(sql);2)使用一系列set方法設(shè)置參數(shù)值。如:pstm.setInt(1,5);pstm.setString(2,"李明");pstm.setString(3,"男");pstm.setInt(4,15);

F注意:設(shè)置數(shù)據(jù)的類型必須與對應(yīng)占位符“?”所代表的數(shù)據(jù)類型一致。3)調(diào)用PreparedStatement方法,執(zhí)行SQL語句。如:pstm.executeUpdate();PreparedStatement接口publicstaticvoidmain(String[]args)throwsException{//調(diào)用課本例9-1中DBCon類的getConnection()創(chuàng)建連接對象 Connectioncon=newDBCon().getConnection(); PreparedStatementpstm=null; ResultSetr=null; inti;

//修改一條記錄sql="updatestudent_infsetname=?whereid=?";pstm=con.prepareStatement(sql);

pstm.setString(1,"強強");pstm.setInt(2,5);i=pstm.executeUpdate();pstm.close(); con.close(); }CallableStatement接口

CallableStatement接口繼承自PreparedStatement接口,用于執(zhí)行數(shù)據(jù)庫的存儲過程。

在CallableStatement對象中,有一個通用的成員方法call,這個方法用于以名稱的方式調(diào)用數(shù)據(jù)庫中的存儲過程。

調(diào)用存儲過程的語法為:{callprocedure_name} //存儲過程不需要參數(shù){callprocedure_name[(?,?,?,…)]} //存儲過程需要若干個參數(shù){?=callprocedure_name[(?,?,?,…)]}//存儲過程需要若干個參數(shù),并返回一個結(jié)果參數(shù)其中,procedure_name為存儲過程的名字,方括號中的內(nèi)容是可選的多個用于存儲過程執(zhí)行的參數(shù)。CallableStatement接口

CallableStatement對象的創(chuàng)建方法如下:

CallableStatementcstmt=conn.prepareCall(“{callgetTestData(?,?)}”);

向存儲過程傳遞執(zhí)行所需要參數(shù)的方法是通過setXXX語句來完成的。例如,我們可以將兩個參數(shù)設(shè)置如下:cstmt.setByte(1,25);cstmt.setFloat(2,9.49f);CallableStatement接口

如果需要存儲過程返回運行結(jié)果,則需要調(diào)用registerOutParameter方法設(shè)置存儲過程的輸出參數(shù),然后調(diào)用getXXX方法來獲取存儲過程的執(zhí)行結(jié)果。例如,cstmt.registerOutParameter(1,java.sql.Types.TINYINT);cstmt.registerOutParameter(2,java.sql.Types.INTEGER);ResultSetrs=cstmt.executeUpdate();bytea=cstmt.getByte(1);intb=cstmt.getInt(2);CallableStatement接口

創(chuàng)建一個帶參數(shù)的存儲過程,存儲過程向?qū)W生信息表STUDENT_INF中添加一條記錄,并返回表中記錄的數(shù)量,請通過程序調(diào)用該存儲過程。//創(chuàng)建存儲過程p1DELIMITER$$CREATEPROCEDUREp1(INnameVARCHAR(10),OUTconINT)BEGININSERTINTOSTUDENT_INF(id,name,gender,age)VALUES(6,name,’女’,17);SELECTcount(1)INTOconFROMSTUDENT_INF;END$$DELIMITER;CallableStatement接口importjava.sql.CallableStatement;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.Types;publicclassExample9_4{publicstaticvoidmain(String[]args)throwsException{ Connectioncon=newDBCon().getConnection();//創(chuàng)建連接 CallableStatementcs=con.prepareCall("CALLp1(?,?);"); cs.setString(1,"樂樂"); cs.registerOutParameter(2,Types.INTEGER); cs.execute();ResultSetset=cs.getResultSet();//獲取輸出結(jié)果 while(set.next()){System.out.print(set.getString("NAME")+""); } //獲取輸出參數(shù)的結(jié)果 inti=cs.getInt(2); System.out.print("i:"+i); }}加個執(zhí)行結(jié)果截圖???事務(wù)

日常生活中,如果我們需要將資金從一個銀行賬戶轉(zhuǎn)到另一個賬戶。此時,一個非常重要的問題就是我們必須同時將資金從一個賬戶取出并且存入另一個賬戶,如果在將資金存入其它賬戶時系統(tǒng)發(fā)生了故障,那么我們必須撤銷取款操作。對于此類應(yīng)用,在進行數(shù)據(jù)庫訪問中,為了確保數(shù)據(jù)庫完整性,可以將一組命令構(gòu)成一個事務(wù)(transaction)。

當(dāng)事務(wù)中所有命令都順利執(zhí)行后,事務(wù)可以被提交(commit)。否則,如果其中某個命令遇到錯誤,那么事務(wù)將被撤回(rollback),就好像任何命令都沒有被執(zhí)行過一樣。事務(wù)

默認的情況下,數(shù)據(jù)庫連接處于自動提交模式。每個SQL命令一旦被執(zhí)行,便被立即提交給數(shù)據(jù)庫,這時就無法對它進行撤回操作。在使用事務(wù)時,需要首先關(guān)閉這個默認值:conn.setAutoCommit(false);使用事物操作,可以使用通常的方法創(chuàng)建一個Statement語句對象:Statementstmt=conn.createStatement();然后可以任意調(diào)用executeUpdate()方法:stmt.executeUpdate(command1);stmt.executeUpdate(command2);stmt.executeUpdate(command3);……事務(wù)

執(zhí)行了所有命令后,調(diào)用commit()方法:mit();

如果出現(xiàn)錯誤,調(diào)用rollback()方法來撤銷自上次提交以來的所有命令:conn.rollback();

這樣就保證了數(shù)據(jù)庫操作的完整性。事務(wù)

如果需要存儲過程返回運行結(jié)果,則需要調(diào)用registerOutParameter方法設(shè)置存儲過程的輸出參數(shù),然后調(diào)用getXXX方法來獲取存儲過程的執(zhí)行結(jié)果。例如,cstmt.registerOutParameter(1,java.sql.Types.TINYINT);cstmt.registerOutParameter(2,java.sql.Types.INTEGER);ResultSetrs=cstmt.executeUpdate();bytea=cstmt.getByte(1);intb=cstmt.

溫馨提示

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

最新文檔

評論

0/150

提交評論