Java程序設(shè)計(jì)項(xiàng)目式教程 課件 單元9 Java數(shù)據(jù)庫訪問_第1頁
Java程序設(shè)計(jì)項(xiàng)目式教程 課件 單元9 Java數(shù)據(jù)庫訪問_第2頁
Java程序設(shè)計(jì)項(xiàng)目式教程 課件 單元9 Java數(shù)據(jù)庫訪問_第3頁
Java程序設(shè)計(jì)項(xiàng)目式教程 課件 單元9 Java數(shù)據(jù)庫訪問_第4頁
Java程序設(shè)計(jì)項(xiàng)目式教程 課件 單元9 Java數(shù)據(jù)庫訪問_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

§9-1學(xué)生信息的數(shù)據(jù)庫管理Java面向?qū)ο蟪绦蛟O(shè)計(jì)教學(xué)目標(biāo)任務(wù)分析

使用數(shù)據(jù)庫管理、維護(hù)數(shù)據(jù),是程序設(shè)計(jì)的重要組成部分,也是軟件開發(fā)中實(shí)現(xiàn)數(shù)據(jù)持久化的普遍方法。本任務(wù)使用MySQL數(shù)據(jù)庫對學(xué)生信息管理系統(tǒng)中的學(xué)生信息進(jìn)行存儲,利用JDBC實(shí)現(xiàn)對學(xué)生信息數(shù)據(jù)庫的基本操作。

教學(xué)內(nèi)容1JDBC數(shù)據(jù)庫訪問連接數(shù)據(jù)庫2獲取查詢結(jié)果21數(shù)據(jù)庫基本操作JDBC數(shù)據(jù)庫訪問

JDBC(JavaDataBaseConnectivity,java數(shù)據(jù)庫連接)是一系列用于執(zhí)行SQL語句的JavaAPI,它由一組用Java語言編寫的類和接口組成,可以為各種不同的數(shù)據(jù)庫提供統(tǒng)一訪問標(biāo)準(zhǔn),實(shí)現(xiàn)了Java應(yīng)用程序的統(tǒng)一訪問,提高了應(yīng)用程序的可移植性。JDBC數(shù)據(jù)庫訪問JDBCAPI主要位于Java.sql及javax.sql包中,該包定義了一系列訪問數(shù)據(jù)庫的類和接口,其中常用類和接口及所提供主要功能如下。1)DriverManager類:用于加載JDBC驅(qū)動程序、創(chuàng)建與數(shù)據(jù)庫的連接。2)Connection接口:用于處理與特定數(shù)據(jù)庫的連接,一個Connection對象就表示一個數(shù)據(jù)庫連接,只有獲得該對象,才能對數(shù)據(jù)庫進(jìn)行訪問。如果應(yīng)用程序中需要訪問多個數(shù)據(jù)庫,就要為每個數(shù)據(jù)庫創(chuàng)建一個對應(yīng)的連接對象。3)Statement接口:用于執(zhí)行靜態(tài)的SQL語句,并返回一個數(shù)據(jù)庫處理結(jié)果對象。4)PreparedStatement接口:用于執(zhí)行預(yù)編譯的SQL語句,同樣返回一個數(shù)據(jù)庫處理結(jié)果對象。5)ResultSet接口:表示數(shù)據(jù)庫數(shù)據(jù)處理的結(jié)果集,負(fù)責(zé)保存Statement或PreparedStatement執(zhí)行查詢命令后所產(chǎn)生的結(jié)果集。JDBC數(shù)據(jù)庫訪問創(chuàng)建Statement對象Statementstmt=conn.createStatement();加載并注冊驅(qū)動程序連接數(shù)據(jù)庫1Class.forName(DRIVER);2

連接數(shù)據(jù)庫

conn=DriverManager.getConnection(URL,UNAME,UPWD);

23執(zhí)行SQL語句ResultSetrs=stmt.executeQuery("SELECT*FROMstudents5WHEREsex=1");4處理結(jié)果集5關(guān)閉資源,釋放連接6數(shù)據(jù)庫基本操作表9-1學(xué)生成績(student_inf)數(shù)據(jù)表idnamegenderage1林林女162田田女173李明男204王平男175趙海男181.搭建數(shù)據(jù)庫環(huán)境CREATEDATABASEstudent;CREATETABLEstudent_inf(idINTPRIMARYKEYAUTO_INCREMENTNOTNULL,nameVARCHAR(50),genderVARCHAR(2),ageINT);2.創(chuàng)建Statement對象要創(chuàng)建Statement對象,需要先創(chuàng)建一個Connection對象,假設(shè)對象名為conn,然后使用下面的語句創(chuàng)建一個Statement對象:Statementstmt=conn.createStatement();Statement接口用于執(zhí)行不帶參數(shù)的簡單SQL語句獲取查詢結(jié)果當(dāng)執(zhí)行查詢操作時,通常最感興趣的是查詢結(jié)果。executeQuery方法返回一個ResultSet對象,用來存放數(shù)據(jù)庫查詢操作獲得的結(jié)果,它包含了滿足查詢條件的所有記錄。ResultSet提供了一系列的getXXX(intcolumnIndex)和getXXX(StringcolumnLabel)方法來獲取各字段的值,其中XXX對應(yīng)字段的類型,getXXX()中的參數(shù)可以是字段的序號,也可以是字段名。獲取查詢結(jié)果通過循環(huán)遍歷查詢結(jié)果集合中的所有記錄,從而獲取各個字段的值。如,執(zhí)行以下語句:ResultSetrs=stmt.executeQuery(“SELECT*FROMstudent_inf”);rs中則包含了student_inf表中所有記錄,可以使用類似如下形式的循環(huán)結(jié)構(gòu)獲取所有記錄信息:while(rs.next()){ Intid=rs.getInt(1);//數(shù)字對應(yīng)字段順序 Stringname=rs.getString(“name”);//字符串對應(yīng)字段名 Stringgender=rs.getString(3);Intage=rs.getInt(“age”);System.out.println(id+"\t"+name+"\t"+gender+"\t"+age);}到此,我們就掌握了JDBC進(jìn)行數(shù)據(jù)庫訪問的基本方法。獲取查詢結(jié)果Connectioncon=newDBCon().getConnection(); Statementstmt=null; ResultSetr=null; inti; Stringsql;

sql="insertintostudent_infvalues(3,'張華','男',25)"; stmt=con.createStatement();

i=stmt.executeUpdate(sql);//增加一條記錄

i=stmt.executeUpdate("insertintostudent_infvalues(4,'平平','女',20)");//增加一條記錄

sql="updatestudent_infsetname='明明'whereid=2";

i=stmt.executeUpdate(sql);//修改一條記錄sql="deletefromstudent_infwhereid=1";

i=stmt.executeUpdate(sql);//刪除一條記錄sql="select*fromstudent_inf";

r=stmt.executeQuery(sql);//查詢記錄while(r.next()){ System.out.print(r.getInt("id")+"\t"); System.out.print(r.getString("name")+"\t"); System.out.print(r.getString(3)+"\t"); System.out.print(r.getInt(4)+"\n"); }任務(wù)實(shí)施完成學(xué)生信息管理系統(tǒng),學(xué)生信息數(shù)據(jù)庫存儲任務(wù)的基本步驟。1)搭建數(shù)據(jù)庫環(huán)境。在MySQL中建立數(shù)據(jù)庫student、數(shù)據(jù)表student_inf。2)在“學(xué)生信息管理系統(tǒng)”項(xiàng)目中導(dǎo)入并注冊MySQL數(shù)據(jù)庫驅(qū)動jar包。3)編寫數(shù)據(jù)庫連接工具類。3)編寫數(shù)據(jù)庫訪問類,該類包括對數(shù)據(jù)庫進(jìn)行增、刪、改、查操作的方法。設(shè)計(jì)系統(tǒng)登錄程序,根據(jù)輸入的用戶名和密碼查詢用戶信息,用戶名和密碼正確允許登錄系統(tǒng),否則提示錯誤信息。按“工單9-1”要求完成任務(wù)同步訓(xùn)練§9-2提升學(xué)生信息數(shù)據(jù)庫管理效率Java面向?qū)ο蟪绦蛟O(shè)計(jì)教學(xué)目標(biāo)任務(wù)分析在任務(wù)9.1的實(shí)施中,我們應(yīng)該發(fā)現(xiàn),使用Statement對象向數(shù)據(jù)庫傳送SQL命令時,每條SQL命令在程序中都只能是一個具體的操作,當(dāng)要改變SQL命令時,每次都需要去修改程序源代碼,降低程序執(zhí)行效率,程序也不具備通用性,為此我們需要對此程序進(jìn)行改進(jìn),使用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接口實(shí)現(xiàn)SQL語句的預(yù)處理首先需要預(yù)處理一個待執(zhí)行的SQL語句模板然后為該模板進(jìn)行參數(shù)綁定最后將用戶提交的數(shù)據(jù)內(nèi)容發(fā)送給MySQL執(zhí)行,完成預(yù)處理的執(zhí)行PreparedStatement接口PreparedStatement接口進(jìn)行數(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,"強(qiáng)強(qiáng)");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接口

如果需要存儲過程返回運(yùn)行結(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)用,在進(jìn)行數(shù)據(jù)庫訪問中,為了確保數(shù)據(jù)庫完整性,可以將一組命令構(gòu)成一個事務(wù)(transaction)。

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

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

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論