




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(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ù)庫對(duì)學(xué)生信息管理系統(tǒng)中的學(xué)生信息進(jìn)行存儲(chǔ),利用JDBC實(shí)現(xiàn)對(duì)學(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ū)動(dòng)程序、創(chuàng)建與數(shù)據(jù)庫的連接。2)Connection接口:用于處理與特定數(shù)據(jù)庫的連接,一個(gè)Connection對(duì)象就表示一個(gè)數(shù)據(jù)庫連接,只有獲得該對(duì)象,才能對(duì)數(shù)據(jù)庫進(jìn)行訪問。如果應(yīng)用程序中需要訪問多個(gè)數(shù)據(jù)庫,就要為每個(gè)數(shù)據(jù)庫創(chuàng)建一個(gè)對(duì)應(yīng)的連接對(duì)象。3)Statement接口:用于執(zhí)行靜態(tài)的SQL語句,并返回一個(gè)數(shù)據(jù)庫處理結(jié)果對(duì)象。4)PreparedStatement接口:用于執(zhí)行預(yù)編譯的SQL語句,同樣返回一個(gè)數(shù)據(jù)庫處理結(jié)果對(duì)象。5)ResultSet接口:表示數(shù)據(jù)庫數(shù)據(jù)處理的結(jié)果集,負(fù)責(zé)保存Statement或PreparedStatement執(zhí)行查詢命令后所產(chǎn)生的結(jié)果集。JDBC數(shù)據(jù)庫訪問創(chuàng)建Statement對(duì)象Statementstmt=conn.createStatement();加載并注冊(cè)驅(qū)動(dòng)程序連接數(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對(duì)象要?jiǎng)?chuàng)建Statement對(duì)象,需要先創(chuàng)建一個(gè)Connection對(duì)象,假設(shè)對(duì)象名為conn,然后使用下面的語句創(chuàng)建一個(gè)Statement對(duì)象:Statementstmt=conn.createStatement();Statement接口用于執(zhí)行不帶參數(shù)的簡單SQL語句獲取查詢結(jié)果當(dāng)執(zhí)行查詢操作時(shí),通常最感興趣的是查詢結(jié)果。executeQuery方法返回一個(gè)ResultSet對(duì)象,用來存放數(shù)據(jù)庫查詢操作獲得的結(jié)果,它包含了滿足查詢條件的所有記錄。ResultSet提供了一系列的getXXX(intcolumnIndex)和getXXX(StringcolumnLabel)方法來獲取各字段的值,其中XXX對(duì)應(yīng)字段的類型,getXXX()中的參數(shù)可以是字段的序號(hào),也可以是字段名。獲取查詢結(jié)果通過循環(huán)遍歷查詢結(jié)果集合中的所有記錄,從而獲取各個(gè)字段的值。如,執(zhí)行以下語句:ResultSetrs=stmt.executeQuery(“SELECT*FROMstudent_inf”);rs中則包含了student_inf表中所有記錄,可以使用類似如下形式的循環(huán)結(jié)構(gòu)獲取所有記錄信息:while(rs.next()){ Intid=rs.getInt(1);//數(shù)字對(duì)應(yīng)字段順序 Stringname=rs.getString(“name”);//字符串對(duì)應(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ù)庫存儲(chǔ)任務(wù)的基本步驟。1)搭建數(shù)據(jù)庫環(huán)境。在MySQL中建立數(shù)據(jù)庫student、數(shù)據(jù)表student_inf。2)在“學(xué)生信息管理系統(tǒng)”項(xiàng)目中導(dǎo)入并注冊(cè)MySQL數(shù)據(jù)庫驅(qū)動(dòng)jar包。3)編寫數(shù)據(jù)庫連接工具類。3)編寫數(shù)據(jù)庫訪問類,該類包括對(duì)數(shù)據(jù)庫進(jìn)行增、刪、改、查操作的方法。設(shè)計(jì)系統(tǒng)登錄程序,根據(jù)輸入的用戶名和密碼查詢用戶信息,用戶名和密碼正確允許登錄系統(tǒng),否則提示錯(cuò)誤信息。按“工單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對(duì)象向數(shù)據(jù)庫傳送SQL命令時(shí),每條SQL命令在程序中都只能是一個(gè)具體的操作,當(dāng)要改變SQL命令時(shí),每次都需要去修改程序源代碼,降低程序執(zhí)行效率,程序也不具備通用性,為此我們需要對(duì)此程序進(jìn)行改進(jìn),使用PreparedStatement對(duì)象來向數(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命令的方法主要有以下兩個(gè):ResultSetexecuteQuery():用于執(zhí)行查詢數(shù)據(jù)庫的SQL命令,返回一個(gè)表示查詢結(jié)果集的ResultSet對(duì)象。intexecuteUpdate():用于執(zhí)行非查詢的SQL命令,返回一個(gè)整數(shù),表示受SQL命令影響的記錄條數(shù)。PreparedStatement接口實(shí)現(xiàn)SQL語句的預(yù)處理首先需要預(yù)處理一個(gè)待執(zhí)行的SQL語句模板然后為該模板進(jìn)行參數(shù)綁定最后將用戶提交的數(shù)據(jù)內(nèi)容發(fā)送給MySQL執(zhí)行,完成預(yù)處理的執(zhí)行PreparedStatement接口PreparedStatement接口進(jìn)行數(shù)據(jù)庫訪問的步驟,主要包括。1)通過Connection對(duì)象conn創(chuàng)建PreparedStatement對(duì)象。
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ù)的類型必須與對(duì)應(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)建連接對(duì)象 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ù)庫的存儲(chǔ)過程。
在CallableStatement對(duì)象中,有一個(gè)通用的成員方法call,這個(gè)方法用于以名稱的方式調(diào)用數(shù)據(jù)庫中的存儲(chǔ)過程。
調(diào)用存儲(chǔ)過程的語法為:{callprocedure_name} //存儲(chǔ)過程不需要參數(shù){callprocedure_name[(?,?,?,…)]} //存儲(chǔ)過程需要若干個(gè)參數(shù){?=callprocedure_name[(?,?,?,…)]}//存儲(chǔ)過程需要若干個(gè)參數(shù),并返回一個(gè)結(jié)果參數(shù)其中,procedure_name為存儲(chǔ)過程的名字,方括號(hào)中的內(nèi)容是可選的多個(gè)用于存儲(chǔ)過程執(zhí)行的參數(shù)。CallableStatement接口
CallableStatement對(duì)象的創(chuàng)建方法如下:
CallableStatementcstmt=conn.prepareCall(“{callgetTestData(?,?)}”);
向存儲(chǔ)過程傳遞執(zhí)行所需要參數(shù)的方法是通過setXXX語句來完成的。例如,我們可以將兩個(gè)參數(shù)設(shè)置如下:cstmt.setByte(1,25);cstmt.setFloat(2,9.49f);CallableStatement接口
如果需要存儲(chǔ)過程返回運(yùn)行結(jié)果,則需要調(diào)用registerOutParameter方法設(shè)置存儲(chǔ)過程的輸出參數(shù),然后調(diào)用getXXX方法來獲取存儲(chǔ)過程的執(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)建一個(gè)帶參數(shù)的存儲(chǔ)過程,存儲(chǔ)過程向?qū)W生信息表STUDENT_INF中添加一條記錄,并返回表中記錄的數(shù)量,請(qǐng)通過程序調(diào)用該存儲(chǔ)過程。//創(chuàng)建存儲(chǔ)過程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); }}加個(gè)執(zhí)行結(jié)果截圖???事務(wù)
日常生活中,如果我們需要將資金從一個(gè)銀行賬戶轉(zhuǎn)到另一個(gè)賬戶。此時(shí),一個(gè)非常重要的問題就是我們必須同時(shí)將資金從一個(gè)賬戶取出并且存入另一個(gè)賬戶,如果在將資金存入其它賬戶時(shí)系統(tǒng)發(fā)生了故障,那么我們必須撤銷取款操作。對(duì)于此類應(yīng)用,在進(jìn)行數(shù)據(jù)庫訪問中,為了確保數(shù)據(jù)庫完整性,可以將一組命令構(gòu)成一個(gè)事務(wù)(transaction)。
當(dāng)事務(wù)中所有命令都順利執(zhí)行后,事務(wù)可以被提交(commit)。否則,如果其中某個(gè)命令遇到錯(cuò)誤,那么事務(wù)將被撤回(rollback),就好像任何命令都沒有被執(zhí)行過一樣。事務(wù)
默認(rèn)的情況下,數(shù)據(jù)庫連接處于自動(dòng)提交模式。每個(gè)SQL命令一旦被執(zhí)行,便被立即提交給數(shù)據(jù)庫,這時(shí)就無法對(duì)它進(jìn)行撤回操作。在使用事務(wù)時(shí),需要首先關(guān)閉這個(gè)默認(rèn)值:conn.setAutoCommit(false);使用事物操作,可以使用通常的方法創(chuàng)建一個(gè)Statement語句對(duì)象:Statementstmt=conn.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西財(cái)經(jīng)大學(xué)華商學(xué)院《金融數(shù)據(jù)采集》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼陽職業(yè)技術(shù)學(xué)院《電視欄目專題與制作》2023-2024學(xué)年第二學(xué)期期末試卷
- 鄭州大學(xué)《產(chǎn)品設(shè)計(jì)報(bào)告書制作》2023-2024學(xué)年第二學(xué)期期末試卷
- 做賬實(shí)操-保險(xiǎn)公司理賠支出的賬務(wù)處理分錄
- 2025屆上海市寶山區(qū)高三一??荚嚉v史試卷
- 江西外語外貿(mào)職業(yè)學(xué)院《文獻(xiàn)查閱與交流》2023-2024學(xué)年第二學(xué)期期末試卷
- 柳州職業(yè)技術(shù)學(xué)院《行政倫理學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 長春職業(yè)技術(shù)學(xué)院《商務(wù)談判》2023-2024學(xué)年第二學(xué)期期末試卷
- 首都師范大學(xué)《工程制圖與全專業(yè)三維識(shí)圖課程設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 魯迅美術(shù)學(xué)院《生物藥物制劑學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 淺談班級(jí)的文化建設(shè)課題論文開題結(jié)題中期研究報(bào)告(經(jīng)驗(yàn)交流)
- PMC年終個(gè)人總結(jié)精編ppt
- DBJ∕T 15-129-2017 集中空調(diào)制冷機(jī)房系統(tǒng)能效監(jiān)測及評(píng)價(jià)標(biāo)準(zhǔn)
- U8-EAI二次開發(fā)說明
- Q∕GDW 11612.41-2018 低壓電力線高速載波通信互聯(lián)互通技術(shù)規(guī)范 第4-1部分:物理層通信協(xié)議
- 2006 年全國高校俄語專業(yè)四級(jí)水平測試試卷
- 新人教版數(shù)學(xué)四年級(jí)下冊(cè)全冊(cè)表格式教案
- 疫情期間離市外出審批表
- (完整版)全身體格檢查評(píng)分標(biāo)準(zhǔn)(表)
- 裝飾裝修工程施工合理化建議和降低成本措施提要:完整
- (改)提高地下室側(cè)墻剛性防水施工合格率_圖文
評(píng)論
0/150
提交評(píng)論