版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第九章
JDBC與數(shù)據(jù)庫訪問面向?qū)ο蟪绦蛟O(shè)計(jì)目錄9.1SQL語言簡介9.2通過JDBC訪問數(shù)據(jù)庫4學(xué)時9.1SQL語言簡介關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,從大型數(shù)據(jù)庫(如Oracle)到微機(jī)數(shù)據(jù)庫(如Access)都支持可以實(shí)現(xiàn)對數(shù)據(jù)庫的各種操作。例如表及其他數(shù)據(jù)庫對象的定義數(shù)據(jù)的查詢與數(shù)據(jù)維護(hù)對數(shù)據(jù)庫進(jìn)行控制語句都是獨(dú)立執(zhí)行的,無上下文聯(lián)系本身不區(qū)分大小寫定義表中各列的名稱及數(shù)據(jù)類型一、建表語句CREATETABLEperson(idINTEGERPRIMARYKEY,//定義該列為主碼nameVARCHAR(10),//列定義,字符型departmentINTEGER,//列定義,整型occupationVARCHAR(10),salaryNUMBER,educationINTEGER);二、插入語句插入一行數(shù)據(jù):INSERTINTOtable_name
VALUES(value1,value2,....)插入一行數(shù)據(jù)在指定的字段上:INSERTINTOtable_name(column1,column2,...)
VALUES(value1,value2,....)修改指定記錄中某列的值,更新表中原有數(shù)據(jù)三、修改語句UPDATEtable_name
SETcolumn1=value1[,column2=value2]…
WHERE<條件表達(dá)式>刪除表中的指定的數(shù)據(jù)四、刪除語句DELETEFROMtable_nameWHERE<條件表達(dá)式>從指定表中取出指定的數(shù)據(jù)五、查詢語句SELECTselect_listFROMtable1[,table2]…[WHERE<條件表達(dá)式>][GROUPBY<分組標(biāo)準(zhǔn)>][HAVING<分組條件>][ORDERBY<排序標(biāo)準(zhǔn)>[ASC|DESC]]例9-1:學(xué)生成績管理系統(tǒng)中有學(xué)生表、課程表、選課表:學(xué)生表s(s_no,s_name)課程表c(c_no,c_name)選課表sc(c_no,s_no,score)-查詢選修課程名為”JAVA基礎(chǔ)”的學(xué)生的學(xué)號、姓名及分?jǐn)?shù);-查詢沒有不及格科目的學(xué)生的學(xué)號、姓名、課程名及分?jǐn)?shù);-查詢沒有不及格科目的學(xué)生的學(xué)號、姓名、總分?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é)號、姓名及分?jǐn)?shù)查詢沒有不及格科目的學(xué)生的學(xué)號、姓名、課程名及分?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)查詢沒有不及格科目的學(xué)生的學(xué)號、姓名、總分?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通過JDBC訪問數(shù)據(jù)庫JDBC(JavaDataBaseConnectivity):由一組用Java語言編寫的類與接口組成,是一種底層API,是用于執(zhí)行SQL語句的Java應(yīng)用程序接口;使開發(fā)人員可以用純Java語言編寫完整的數(shù)據(jù)庫應(yīng)用程序;隔離了Java與不同數(shù)據(jù)庫之間的對話,使得程序員只須寫一遍程序就可讓它在任何數(shù)據(jù)庫管理系統(tǒng)平臺上運(yùn)行。用JDBC寫的程序能夠自動地將SQL語句傳送給幾乎任何一種數(shù)據(jù)庫管理系統(tǒng)(DBMS);包含在java.sql和javax.sql兩個包中:java.sql為核心包,這個包包含于J2SE中;javax.sql包擴(kuò)展了JDBCAPI的功能,成為了J2EE的一個基本組成部分。JDBCAPI:可分為兩個層次面向底層的JDBCDriverAPI主要是針對數(shù)據(jù)庫廠商開發(fā)數(shù)據(jù)庫底層驅(qū)動程序使用面向程序員的JDBCAPIJDBCAPI中重要的接口和類:設(shè)置環(huán)境,引入相應(yīng)的JDBC類;選擇合適的JDBC驅(qū)動程序并加載;分配一個Connection對象;分配一個Statement對象;用該Statement對象進(jìn)行查詢等操作;從返回的ResultSet對象中獲取相應(yīng)的數(shù)據(jù);關(guān)閉Connection。JDBC程序開發(fā)步驟:9.2.1設(shè)置環(huán)境在本機(jī)上安裝有關(guān)數(shù)據(jù)庫軟件。通過JDBC-ODBC橋訪問數(shù)據(jù)庫安裝Java和JDBCAPI安裝JDK的同時就自動安裝了安裝數(shù)據(jù)庫驅(qū)動程序安裝JDK的同時就自動安裝了安裝JDBC-ODBC橋驅(qū)動程序建立一個數(shù)據(jù)庫,并注冊數(shù)據(jù)源在Java程序中引入相應(yīng)的類和包。任何使用JDBC的源程序都需要引入java.sql包,如必要的時候還需要裝載相應(yīng)的JDBC-ODBC驅(qū)動程序的包importjava.sql.*;importsun.jdbc.odbc.JdbcOdbcDriver;9.2.2裝載驅(qū)動器,建立連接用Class.forName方法顯式裝載驅(qū)動程序:執(zhí)行上述代碼時將自動創(chuàng)建一個驅(qū)動器類的實(shí)例,并自動調(diào)用驅(qū)動器管理器DriverManager類中的RegisterDriver方法來注冊它。Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundExceptione){System.out.println(e.getMessage);}如果驅(qū)動器類有可能不存在,使用此方法就可能會拋出ClassNotFoundException異常,因此需要捕獲這個異常:調(diào)用DriverManager.getConnection()方法建立連接:Connectioncon=DriverManager.getConnection("jdbc:odbc:student","sa","sa");將返回與指定數(shù)據(jù)庫建立的連接;Connection是一個接口,表示與指定數(shù)據(jù)庫的連接;DriverManager類位于JDBC的管理層,作用于用戶和驅(qū)動程序之間。它負(fù)責(zé)跟蹤在一個系統(tǒng)中所有可用的JDBC驅(qū)動程序,并在數(shù)據(jù)庫和相應(yīng)驅(qū)動程序之間建立連接。該方法有三個參數(shù):第一個是JDBCURL,格式為jdbc:子協(xié)議:子名稱jdbc表示協(xié)議,JDBCURL中的協(xié)議總是jdbc;子協(xié)議是驅(qū)動器名稱;子名稱是數(shù)據(jù)源的名稱。第二個是訪問數(shù)據(jù)庫所需的用戶名;第三個是用戶密碼。9.2.3對數(shù)據(jù)庫進(jìn)行操作建立好到數(shù)據(jù)庫的連接后,就可以進(jìn)行對數(shù)據(jù)庫的操作了,一般包括如下三個步驟:使用Connection對象創(chuàng)建Statement對象;使用Statement對象執(zhí)行SQL命令;從上一步驟返回的ResultSet對象中提取執(zhí)行結(jié)果。Connection接口有3個方法可用來創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的對象:一、創(chuàng)建Statement對象createStatement():創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的Statement對象,用于簡單的SQL語句Statementstmt=con.createStatement();prepareStatement(Stringsql):創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的PreparedStatement對象,用于帶有一個或多個參數(shù)的SQL語句。在SQL語句執(zhí)行前,這些參數(shù)將被賦值。preparedStatementpstmt=con.prepareStatement();prepareCall(Stringsql):創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的CallableStatement對象,用于調(diào)用數(shù)據(jù)庫中的存儲過程。CallableStatementcstmt=con.prepareCall();Statement接口提供了三種執(zhí)行SQL語句的方法,使用哪一個方法由SQL語句所產(chǎn)生的內(nèi)容決定二、使用Statement對象執(zhí)行語句executeQuery(Stringsql):執(zhí)行查詢語句ResultSetrs=stmt.executeQuery("Select*FromPerson");executeUpdate(Stringsql):執(zhí)行INSERT、UPDATE或DELETE語句,以及CREATETABLEexecute(Stringsql):用于執(zhí)行返回多個結(jié)果集、多個更新計(jì)數(shù)或二者組合的語句。返回值是一個整數(shù),表示受影響的行數(shù)(即更新計(jì)數(shù)。對于CREATETABLE等語句,因不涉及到行的操作,所以executeUpdate的返回值總為零。stmt.executeUpdate("DELETEFROMPersonWHEREName='李四'");addBatch(String
sql):增加批處理語句executeBatch():執(zhí)行批處理語句clearBatch():清除批處理語句查詢結(jié)果作為結(jié)果集(ResultSet)對象返回后,我們可以從ResultSet對象中提取結(jié)果。三、提取執(zhí)行結(jié)果next()方法ResultSet對象中含有檢索出來的行,其中有一個指示器,指向當(dāng)前可操作的行,初始狀態(tài)下指示器是指向第一行之前;方法next的功能是將指示器下移一行,所以第一次調(diào)用next方法時便將指示器指向第一行,以后每一次對next的成功調(diào)用都會將指示器移向下一行。getX()方法允許使用列名或列序號作為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類型,然后賦值給對象s這里的列序號指的是結(jié)果集中的列序號,而不是原表中的列序號SQL與java數(shù)據(jù)類型對照:例9-2:通過JDBC訪問student數(shù)據(jù)庫,進(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ū)動器 con=DriverManager.getConnection(connectionStr,"sa","sa");//連接數(shù)據(jù)庫stmt=con.createStatement();//創(chuàng)建Statement對象//查詢表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)閉語句 con.close();//關(guān)閉連接}}JDBC支持帶參數(shù)的SQL語句的執(zhí)行,這給SQL語句的執(zhí)行帶來很大的靈活性;9.2.4執(zhí)行帶參數(shù)的SQL語句使用該功能時不能使用Statement類對象,必須利用PreparedStatement類對象
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 送料機(jī)構(gòu)課程設(shè)計(jì)
- 鏈?zhǔn)絻Υ嬲n程設(shè)計(jì)
- 課程設(shè)計(jì)視頻實(shí)錄
- 燕子教案課程設(shè)計(jì)
- 采購談判課程設(shè)計(jì)
- 英語網(wǎng)絡(luò)課程設(shè)計(jì)
- 裁剪裙子課程設(shè)計(jì)案例
- 高壓儲罐課程設(shè)計(jì)
- 雞爪擺攤課程設(shè)計(jì)
- 音樂彩燈課程設(shè)計(jì)eda
- 蘇北四市(徐州、宿遷、淮安、連云港)2025屆高三第一次調(diào)研考試(一模)語文試卷(含答案)
- 第7課《中華民族一家親》(第一課時)(說課稿)2024-2025學(xué)年統(tǒng)編版道德與法治五年級上冊
- 急診科十大護(hù)理課件
- 山東省濟(jì)寧市2023-2024學(xué)年高一上學(xué)期1月期末物理試題(解析版)
- GB/T 44888-2024政務(wù)服務(wù)大廳智能化建設(shè)指南
- 2025年上半年河南鄭州滎陽市招聘第二批政務(wù)輔助人員211人筆試重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解
- 山東省濟(jì)南市歷城區(qū)2024-2025學(xué)年七年級上學(xué)期期末數(shù)學(xué)模擬試題(無答案)
- 國家重點(diǎn)風(fēng)景名勝區(qū)登山健身步道建設(shè)項(xiàng)目可行性研究報(bào)告
- 投資計(jì)劃書模板計(jì)劃方案
- 《接觸網(wǎng)施工》課件 3.4.2 隧道內(nèi)腕臂安裝
- 2024-2025學(xué)年九年級語文上學(xué)期第三次月考模擬卷(統(tǒng)編版)
評論
0/150
提交評論