第九章 JDBC數(shù)據(jù)庫(kù)訪問(wèn)(4學(xué)時(shí))_第1頁(yè)
第九章 JDBC數(shù)據(jù)庫(kù)訪問(wèn)(4學(xué)時(shí))_第2頁(yè)
第九章 JDBC數(shù)據(jù)庫(kù)訪問(wèn)(4學(xué)時(shí))_第3頁(yè)
第九章 JDBC數(shù)據(jù)庫(kù)訪問(wèn)(4學(xué)時(shí))_第4頁(yè)
第九章 JDBC數(shù)據(jù)庫(kù)訪問(wèn)(4學(xué)時(shí))_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第九章

JDBC與數(shù)據(jù)庫(kù)訪問(wèn)面向?qū)ο蟪绦蛟O(shè)計(jì)目錄9.1SQL語(yǔ)言簡(jiǎn)介9.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)4學(xué)時(shí)9.1SQL語(yǔ)言簡(jiǎn)介關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言,從大型數(shù)據(jù)庫(kù)(如Oracle)到微機(jī)數(shù)據(jù)庫(kù)(如Access)都支持可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的各種操作。例如表及其他數(shù)據(jù)庫(kù)對(duì)象的定義數(shù)據(jù)的查詢與數(shù)據(jù)維護(hù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行控制語(yǔ)句都是獨(dú)立執(zhí)行的,無(wú)上下文聯(lián)系本身不區(qū)分大小寫(xiě)定義表中各列的名稱及數(shù)據(jù)類型一、建表語(yǔ)句CREATETABLEperson(idINTEGERPRIMARYKEY,//定義該列為主碼nameVARCHAR(10),//列定義,字符型departmentINTEGER,//列定義,整型occupationVARCHAR(10),salaryNUMBER,educationINTEGER);二、插入語(yǔ)句插入一行數(shù)據(jù):INSERTINTOtable_name

VALUES(value1,value2,....)插入一行數(shù)據(jù)在指定的字段上:INSERTINTOtable_name(column1,column2,...)

VALUES(value1,value2,....)修改指定記錄中某列的值,更新表中原有數(shù)據(jù)三、修改語(yǔ)句UPDATEtable_name

SETcolumn1=value1[,column2=value2]…

WHERE<條件表達(dá)式>刪除表中的指定的數(shù)據(jù)四、刪除語(yǔ)句DELETEFROMtable_nameWHERE<條件表達(dá)式>從指定表中取出指定的數(shù)據(jù)五、查詢語(yǔ)句SELECTselect_listFROMtable1[,table2]…[WHERE<條件表達(dá)式>][GROUPBY<分組標(biāo)準(zhǔn)>][HAVING<分組條件>][ORDERBY<排序標(biāo)準(zhǔn)>[ASC|DESC]]例9-1:學(xué)生成績(jī)管理系統(tǒng)中有學(xué)生表、課程表、選課表:學(xué)生表s(s_no,s_name)課程表c(c_no,c_name)選課表sc(c_no,s_no,score)-查詢選修課程名為”JAVA基礎(chǔ)”的學(xué)生的學(xué)號(hào)、姓名及分?jǐn)?shù);-查詢沒(méi)有不及格科目的學(xué)生的學(xué)號(hào)、姓名、課程名及分?jǐn)?shù);-查詢沒(méi)有不及格科目的學(xué)生的學(xué)號(hào)、姓名、總分?jǐn)?shù)及平均分。selects.s_no,s.s_name,sc.scorefroms,c,scwheres.s_no=sc.s_noandc.c_no=sc.c_noandc.c_name='JAVA基礎(chǔ)'查詢選修課程名為”JAVA基礎(chǔ)”的學(xué)生的學(xué)號(hào)、姓名及分?jǐn)?shù)查詢沒(méi)有不及格科目的學(xué)生的學(xué)號(hào)、姓名、課程名及分?jǐn)?shù)selects.s_no,s.s_name,c.c_name,sc.scorefroms,c,scwheres.s_no=sc.s_noandc.c_no=sc.c_noands.s_nonotin(selectDISTINCTs_nofromscwherescore<60)查詢沒(méi)有不及格科目的學(xué)生的學(xué)號(hào)、姓名、總分?jǐn)?shù)及平均分selects.s_no,s.s_name,sum(sc.score),avg(sc.score)froms,c,scwheres.s_no=sc.s_noandc.c_no=sc.c_noands.s_nonotin(selectDISTINCTs_nofromscwherescore<60)groupbys.s_no,s_name9.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)JDBC(JavaDataBaseConnectivity):由一組用Java語(yǔ)言編寫(xiě)的類與接口組成,是一種底層API,是用于執(zhí)行SQL語(yǔ)句的Java應(yīng)用程序接口;使開(kāi)發(fā)人員可以用純Java語(yǔ)言編寫(xiě)完整的數(shù)據(jù)庫(kù)應(yīng)用程序;隔離了Java與不同數(shù)據(jù)庫(kù)之間的對(duì)話,使得程序員只須寫(xiě)一遍程序就可讓它在任何數(shù)據(jù)庫(kù)管理系統(tǒng)平臺(tái)上運(yùn)行。用JDBC寫(xiě)的程序能夠自動(dòng)地將SQL語(yǔ)句傳送給幾乎任何一種數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS);包含在java.sql和javax.sql兩個(gè)包中:java.sql為核心包,這個(gè)包包含于J2SE中;javax.sql包擴(kuò)展了JDBCAPI的功能,成為了J2EE的一個(gè)基本組成部分。JDBCAPI:可分為兩個(gè)層次面向底層的JDBCDriverAPI主要是針對(duì)數(shù)據(jù)庫(kù)廠商開(kāi)發(fā)數(shù)據(jù)庫(kù)底層驅(qū)動(dòng)程序使用面向程序員的JDBCAPIJDBCAPI中重要的接口和類:設(shè)置環(huán)境,引入相應(yīng)的JDBC類;選擇合適的JDBC驅(qū)動(dòng)程序并加載;分配一個(gè)Connection對(duì)象;分配一個(gè)Statement對(duì)象;用該Statement對(duì)象進(jìn)行查詢等操作;從返回的ResultSet對(duì)象中獲取相應(yīng)的數(shù)據(jù);關(guān)閉Connection。JDBC程序開(kāi)發(fā)步驟:9.2.1設(shè)置環(huán)境在本機(jī)上安裝有關(guān)數(shù)據(jù)庫(kù)軟件。通過(guò)JDBC-ODBC橋訪問(wèn)數(shù)據(jù)庫(kù)安裝Java和JDBCAPI安裝JDK的同時(shí)就自動(dòng)安裝了安裝數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序安裝JDK的同時(shí)就自動(dòng)安裝了安裝JDBC-ODBC橋驅(qū)動(dòng)程序建立一個(gè)數(shù)據(jù)庫(kù),并注冊(cè)數(shù)據(jù)源在Java程序中引入相應(yīng)的類和包。任何使用JDBC的源程序都需要引入java.sql包,如必要的時(shí)候還需要裝載相應(yīng)的JDBC-ODBC驅(qū)動(dòng)程序的包importjava.sql.*;importsun.jdbc.odbc.JdbcOdbcDriver;9.2.2裝載驅(qū)動(dòng)器,建立連接用Class.forName方法顯式裝載驅(qū)動(dòng)程序:執(zhí)行上述代碼時(shí)將自動(dòng)創(chuàng)建一個(gè)驅(qū)動(dòng)器類的實(shí)例,并自動(dòng)調(diào)用驅(qū)動(dòng)器管理器DriverManager類中的RegisterDriver方法來(lái)注冊(cè)它。Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundExceptione){System.out.println(e.getMessage);}如果驅(qū)動(dòng)器類有可能不存在,使用此方法就可能會(huì)拋出ClassNotFoundException異常,因此需要捕獲這個(gè)異常:調(diào)用DriverManager.getConnection()方法建立連接:Connectioncon=DriverManager.getConnection("jdbc:odbc:student","sa","sa");將返回與指定數(shù)據(jù)庫(kù)建立的連接;Connection是一個(gè)接口,表示與指定數(shù)據(jù)庫(kù)的連接;DriverManager類位于JDBC的管理層,作用于用戶和驅(qū)動(dòng)程序之間。它負(fù)責(zé)跟蹤在一個(gè)系統(tǒng)中所有可用的JDBC驅(qū)動(dòng)程序,并在數(shù)據(jù)庫(kù)和相應(yīng)驅(qū)動(dòng)程序之間建立連接。該方法有三個(gè)參數(shù):第一個(gè)是JDBCURL,格式為jdbc:子協(xié)議:子名稱jdbc表示協(xié)議,JDBCURL中的協(xié)議總是jdbc;子協(xié)議是驅(qū)動(dòng)器名稱;子名稱是數(shù)據(jù)源的名稱。第二個(gè)是訪問(wèn)數(shù)據(jù)庫(kù)所需的用戶名;第三個(gè)是用戶密碼。9.2.3對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作建立好到數(shù)據(jù)庫(kù)的連接后,就可以進(jìn)行對(duì)數(shù)據(jù)庫(kù)的操作了,一般包括如下三個(gè)步驟:使用Connection對(duì)象創(chuàng)建Statement對(duì)象;使用Statement對(duì)象執(zhí)行SQL命令;從上一步驟返回的ResultSet對(duì)象中提取執(zhí)行結(jié)果。Connection接口有3個(gè)方法可用來(lái)創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句的對(duì)象:一、創(chuàng)建Statement對(duì)象createStatement():創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句的Statement對(duì)象,用于簡(jiǎn)單的SQL語(yǔ)句Statementstmt=con.createStatement();prepareStatement(Stringsql):創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句的PreparedStatement對(duì)象,用于帶有一個(gè)或多個(gè)參數(shù)的SQL語(yǔ)句。在SQL語(yǔ)句執(zhí)行前,這些參數(shù)將被賦值。preparedStatementpstmt=con.prepareStatement();prepareCall(Stringsql):創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句的CallableStatement對(duì)象,用于調(diào)用數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程。CallableStatementcstmt=con.prepareCall();Statement接口提供了三種執(zhí)行SQL語(yǔ)句的方法,使用哪一個(gè)方法由SQL語(yǔ)句所產(chǎn)生的內(nèi)容決定二、使用Statement對(duì)象執(zhí)行語(yǔ)句executeQuery(Stringsql):執(zhí)行查詢語(yǔ)句ResultSetrs=stmt.executeQuery("Select*FromPerson");executeUpdate(Stringsql):執(zhí)行INSERT、UPDATE或DELETE語(yǔ)句,以及CREATETABLEexecute(Stringsql):用于執(zhí)行返回多個(gè)結(jié)果集、多個(gè)更新計(jì)數(shù)或二者組合的語(yǔ)句。返回值是一個(gè)整數(shù),表示受影響的行數(shù)(即更新計(jì)數(shù)。對(duì)于CREATETABLE等語(yǔ)句,因不涉及到行的操作,所以executeUpdate的返回值總為零。stmt.executeUpdate("DELETEFROMPersonWHEREName='李四'");addBatch(String

sql):增加批處理語(yǔ)句executeBatch():執(zhí)行批處理語(yǔ)句clearBatch():清除批處理語(yǔ)句查詢結(jié)果作為結(jié)果集(ResultSet)對(duì)象返回后,我們可以從ResultSet對(duì)象中提取結(jié)果。三、提取執(zhí)行結(jié)果next()方法ResultSet對(duì)象中含有檢索出來(lái)的行,其中有一個(gè)指示器,指向當(dāng)前可操作的行,初始狀態(tài)下指示器是指向第一行之前;方法next的功能是將指示器下移一行,所以第一次調(diào)用next方法時(shí)便將指示器指向第一行,以后每一次對(duì)next的成功調(diào)用都會(huì)將指示器移向下一行。getX()方法允許使用列名或列序號(hào)作為getX()方法的參數(shù)。使用相應(yīng)類型的getX()方法可以從當(dāng)前行指定列中提取不同類型的數(shù)據(jù);Strings=rs.getString("Name");Strings=rs.getString(2);提取當(dāng)前行Name列中的數(shù)據(jù),并把其從SQL的VARCHAR類型轉(zhuǎn)換成Java的String類型,然后賦值給對(duì)象s這里的列序號(hào)指的是結(jié)果集中的列序號(hào),而不是原表中的列序號(hào)SQL與java數(shù)據(jù)類型對(duì)照:例9-2:通過(guò)JDBC訪問(wèn)student數(shù)據(jù)庫(kù),進(jìn)行查詢、添加、刪除操作。importjava.sql.*;publicclassex9_2{ publicstaticvoidmain(String[]args)throwsException{ StringDBDriver="sun.jdbc.odbc.JdbcOdbcDriver"; StringconnectionStr="jdbc:odbc:student"; Connectioncon=null; Statementstmt=null; ResultSetrs=null; Class.forName(DBDriver); //加載驅(qū)動(dòng)器 con=DriverManager.getConnection(connectionStr,"sa","sa");//連接數(shù)據(jù)庫(kù)stmt=con.createStatement();//創(chuàng)建Statement對(duì)象//查詢表rs=stmt.executeQuery("Select*Fromstudent");while(rs.next()){//顯示所有記錄的ID和姓名System.out.print(rs.getString("s_no")+"");System.out.println(rs.getString("s_name")+"");}stmt.executeUpdate("INSERTINTOstudent”+"VALUES('5','test5')");//添加一條記錄 System.out.println("添加數(shù)據(jù)后的信息為");//查詢表格 rs=stmt.executeQuery("Select*Fromstudent");while(rs.next()){//顯示 System.out.print(rs.getString("s_no")+""); System.out.println(rs.getString("s_name")+""); } stmt.executeUpdate("DELETEFROMstudentWHEREs_name='test5'");System.out.println("刪除數(shù)據(jù)后的信息為:");//查詢表格 rs=stmt.executeQuery("Select*Fromstudent");while(rs.next()){//顯示 System.out.print(rs.getString("s_no")+""); System.out.println(rs.getString("s_name")+""); } stmt.close();//關(guān)閉語(yǔ)句 con.close();//關(guān)閉連接}}JDBC支持帶參數(shù)的SQL語(yǔ)句的執(zhí)行,這給SQL語(yǔ)句的執(zhí)行帶來(lái)很大的靈活性;9.2.4執(zhí)行帶參數(shù)的SQL語(yǔ)句使用該功能時(shí)不能使用Statement類對(duì)象,必須利用PreparedStatement類對(duì)象

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論