版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本章目標(biāo)JDBC概念和特點(diǎn)JDBC體系結(jié)構(gòu)JDBCURLODBC數(shù)據(jù)源配置JDBC數(shù)據(jù)庫(kù)開發(fā)環(huán)境配置JDBC訪問(wèn)數(shù)據(jù)庫(kù)的基本步驟常用的JDBC類與方法JDBC是Java數(shù)據(jù)庫(kù)連接技術(shù)的簡(jiǎn)稱,提供連接各種常用數(shù)據(jù)庫(kù)的能力3.1.1JDBC的概念及特點(diǎn)Java應(yīng)用程序JDBCJDBCJSP/Servlet客戶端數(shù)據(jù)庫(kù)服務(wù)器應(yīng)用服務(wù)器數(shù)據(jù)庫(kù)服務(wù)器客戶端JDBCAPI提供者:Sun公司內(nèi)容:供程序員調(diào)用的接口與類,集成在java.sql和javax.sql包中,如:DriverManager類Connection接口Statement接口ResultSet接口DriverManager提供者:Sun公司作用:管理各種不同的JDBC驅(qū)動(dòng)JDBC驅(qū)動(dòng)提供者:數(shù)據(jù)庫(kù)廠商作用:負(fù)責(zé)連接各種不同的數(shù)據(jù)庫(kù)3.1.2JDBC體系結(jié)構(gòu)SqlServerOracleJDBCAPIJDBCDriverManagerJDBC驅(qū)動(dòng)JDBC驅(qū)動(dòng)Java應(yīng)用程序JDBCAPI可做三件事:1與數(shù)據(jù)庫(kù)建立連接、2執(zhí)行SQL語(yǔ)句、3處理結(jié)果DriverManager:依據(jù)數(shù)據(jù)庫(kù)的不同,管理JDBC驅(qū)動(dòng)Connection:負(fù)責(zé)連接數(shù)據(jù)庫(kù)并擔(dān)任傳送數(shù)據(jù)的任務(wù)Statement:由Connection產(chǎn)生、負(fù)責(zé)執(zhí)行SQL語(yǔ)句ResultSet:負(fù)責(zé)保存Statement執(zhí)行后所產(chǎn)生的查詢結(jié)果JDBCAPIConnectionDriverManagerStatementResultSet客戶端數(shù)據(jù)庫(kù)服務(wù)器1234JDBC驅(qū)動(dòng)由數(shù)據(jù)庫(kù)廠商提供在個(gè)人開發(fā)與測(cè)試中,可以使用JDBC-ODBC橋連方式在生產(chǎn)型開發(fā)中,推薦使用純Java驅(qū)動(dòng)方式3.1.3JDBC的種類DBServerDBServerJDBCAPIJDBCDriverManager純Java驅(qū)動(dòng)JDBC–ODBC橋Java應(yīng)用程序ODBC使用JDBC-ODBC橋方式連接數(shù)據(jù)庫(kù)將對(duì)JDBCAPI的調(diào)用,轉(zhuǎn)換為對(duì)另一組數(shù)據(jù)庫(kù)連接API的調(diào)用優(yōu)點(diǎn):可以訪問(wèn)所有ODBC可以訪問(wèn)的數(shù)據(jù)庫(kù)缺點(diǎn):執(zhí)行效率低、功能不夠強(qiáng)大JDBC-ODBC橋Java應(yīng)用程序JDBCAPIODBCAPIODBC層DBServer3.1.3JDBC的種類使用純Java方式連接數(shù)據(jù)庫(kù)由JDBC驅(qū)動(dòng)直接訪問(wèn)數(shù)據(jù)庫(kù)優(yōu)點(diǎn):100%Java,快又可跨平臺(tái)缺點(diǎn):訪問(wèn)不同的數(shù)據(jù)庫(kù)需要下載專用的JDBC驅(qū)動(dòng)JDBC
驅(qū)動(dòng)Java應(yīng)用程序JDBCAPIDBServer3.1.3JDBC的種類3.1.4JDBCURLJDBCURL提供了一種標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法,可以使相應(yīng)的驅(qū)動(dòng)程序能夠識(shí)別該數(shù)據(jù)庫(kù)并與它建立連接。標(biāo)準(zhǔn)的JDBCURL的格式如下:jdbc:<子協(xié)議名>:<子名稱>JDBCURL由三個(gè)部分組成,各個(gè)部分之間用冒號(hào)分隔。<子協(xié)議>是指數(shù)據(jù)庫(kù)連接的方式。<子名稱>可以根據(jù)子協(xié)議的改變而變化。(1)Oracle(thin連接方式)jdbc:oracle:thin:@服務(wù)器名/IP地址:1521:數(shù)據(jù)庫(kù)實(shí)例名(2)SQLServer2000jdbc:microsoft:sqlserver://服務(wù)器名/IP地址:1433[;databaseName=數(shù)據(jù)庫(kù)名](3)SQLServer2005jdbc:sqlserver://服務(wù)器名/IP地址:1433[;databaseName=數(shù)據(jù)庫(kù)名](4)MySQLjdbc:mysql://服務(wù)器名/IP地址:3306/數(shù)據(jù)庫(kù)名(5)JDBC-ODBC橋jdbc:odbc:mydb[;user=用戶名;password=密碼](數(shù)據(jù)源名稱:mydb)3.1.5ODBC數(shù)據(jù)源配置(1)在Access中創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)(2)進(jìn)入ODBC數(shù)據(jù)源配置程序3.1.5ODBC數(shù)據(jù)源配置(3)創(chuàng)建新的數(shù)據(jù)源(4)為新數(shù)據(jù)源命名3.1.6JDBC數(shù)據(jù)庫(kù)開發(fā)環(huán)境配置(1)安裝并配置數(shù)據(jù)庫(kù)(2)下載相關(guān)驅(qū)動(dòng)程序(3)設(shè)置驅(qū)動(dòng)程序類路徑(4)創(chuàng)建數(shù)據(jù)庫(kù)和表(5)輸入測(cè)試用數(shù)據(jù)3.2.1JDBC訪問(wèn)數(shù)據(jù)庫(kù)的基本步驟1.加載JDBC驅(qū)動(dòng)程序Class.forName("DriverName");2.創(chuàng)建數(shù)據(jù)庫(kù)連接Connectionconn=DriverManager.getConnection(Stringurl,Stringuser,Stringpassword);3.創(chuàng)建Statement對(duì)象Statementsmt=conn.createStatement();4.執(zhí)行SQL語(yǔ)句,返回結(jié)果集對(duì)象ResultSetResultSetrs=smt.executeQuery("SELECT*FROMstudents");5.處理SQL的返回結(jié)果StringstudentName=rs.getString(“sno”);//按列名取值或:rs.getString(1);//按索引號(hào)取值6.關(guān)閉創(chuàng)建的各個(gè)對(duì)象conn.close();例3-1:創(chuàng)建數(shù)據(jù)庫(kù)連接類,并測(cè)試連接是否成功源程序Test.javapackagecom.csmy;importjava.sql.*;publicclassTest{publicstaticvoidmain(String[]args){Connectionconn=null;try{conn=Dbconn.getconn();//利用連接類的靜態(tài)方法獲得連接
if(conn!=null){//獲取連接對(duì)象成功
System.out.print("恭喜你,你已成功連接到MySQL數(shù)據(jù)庫(kù)");}}catch(SQLExceptione){ e.printStackTrace();} }}例3-2:查詢studens表中所有數(shù)據(jù),并打印出來(lái)。3.2.2常用的JDBC類與方法1.DriverManager類2.Connection接口(1)StatementcreateStatement()(2)PreparedStatementprepareStatement(Stringsql)
(3)CallableStatementprepareCall("{callstored_proc}")(4)voidclose()(5)booleanisClosed()Statement接口常用方法方法名說(shuō)明ResultSetexecuteQuery(Stringsql)執(zhí)行SQL查詢并獲取到ResultSet對(duì)象intexecuteUpdate(Stringsql)可以執(zhí)行插入、刪除、更新等操作,返回值是執(zhí)行該操作所影響的行數(shù)booleanexecute(Stringsql)可以執(zhí)行任意SQL語(yǔ)句,然后獲得一個(gè)布爾值,表示是否返回ResultSetResultSet接口常用方法方法名說(shuō)明booleannext()將光標(biāo)從當(dāng)前位置向下移動(dòng)一行booleanprevious()游標(biāo)從當(dāng)前位置向上移動(dòng)一行voidclose()關(guān)閉ResultSet對(duì)象intgetInt(intcolIndex)以int形式獲取結(jié)果集當(dāng)前行指定列號(hào)值intgetInt(StringcolLabel)以int形式獲取結(jié)果集當(dāng)前行指定列名值floatgetFloat(intcolIndex)以float形式獲取結(jié)果集當(dāng)前行指定列號(hào)值floatgetFloat(StringcolLabel)以float形式獲取結(jié)果集當(dāng)前行指定列名值StringgetString(intcolIndex)以String形式獲取結(jié)果集當(dāng)前行指定列號(hào)值StringgetString(StringcolLabel)以String形式獲取結(jié)果集當(dāng)前行指定列名值PreparedStatement接口(預(yù)編譯的SQL語(yǔ)句)Statement接口提高了代碼的可讀性和可維護(hù)性
PreparedStatement接口繼承Statement接口PreparedStatement比普通的Statement對(duì)象使用起來(lái)更加靈活,更有效率PreparedStatement接口提高了SQL語(yǔ)句執(zhí)行的性能
提高了安全性CallableStatement
對(duì)于高級(jí)數(shù)據(jù)庫(kù),一般都會(huì)提供存儲(chǔ)過(guò)程的功能,以加快SQL語(yǔ)句的執(zhí)行。那么,在JDBC中如何去調(diào)用一個(gè)存儲(chǔ)過(guò)程呢?JDBC中的CallableStatement接口提供了調(diào)用存儲(chǔ)過(guò)程的方法。CallableStatement接口繼承了Statement接口和PreparedStatement接口,因此它具有兩者的特點(diǎn):可以處理一般的SQL語(yǔ)句,也可以處理帶IN(輸入)參數(shù)的SQL語(yǔ)句。它還自己定義了OUT(輸出)參數(shù)以及INOUT(輸入輸出)參數(shù)的處理方法。通過(guò)Connection對(duì)象的prepareCall()方法,可以創(chuàng)建CallableStatement對(duì)象,如:conn.prepareCall("{callstored_proc}");其中,stored_proc為存儲(chǔ)過(guò)程名稱。如果存儲(chǔ)過(guò)程有參數(shù)(比如有兩個(gè)參數(shù)),可以使用如下的方式調(diào)用:conn.prepareCall("{callstoredproc(?,?)}");其中,占位符“?”是IN、OUT還是INOUT取決于存儲(chǔ)過(guò)程定義。而如果存儲(chǔ)過(guò)程有返回值,使用下面的方式調(diào)用:conn.prepareCall("{?=callstoredproc(?,?)}");例3-5調(diào)用存儲(chǔ)過(guò)程的例子
首先需要在MySQL中創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,該存儲(chǔ)過(guò)程接收一個(gè)系部ID參數(shù),通過(guò)輸出參數(shù)返加系部名稱,SQL語(yǔ)句如下:delimiter//--設(shè)置MySQL的結(jié)束標(biāo)志為“//”createprocedurefinddepnamebyid(idchar(2),outdepnamechar(40))beginselectdep_nameintodepnamefromdepartmentwheredep_id=id;end;delimiter;--把MySQL的結(jié)束標(biāo)志改回為“;”例3-5調(diào)用存儲(chǔ)過(guò)程的例子
在JDBC中,事務(wù)默認(rèn)是自動(dòng)提交的通過(guò)Connection的setAutoCommit()方法來(lái)設(shè)置事務(wù)的提交屬性通過(guò)Connection的getAutoCommit()方法來(lái)獲得當(dāng)前事務(wù)的提交方式通過(guò)Connection的commit()方法來(lái)提交事務(wù)通過(guò)Connection的rollback()方法來(lái)回滾事務(wù)3.2.3事務(wù)處理try{ Statementstmt=conn.createStatement();Statementstmt1=conn.createStatement();StringstrSql,sql,strParameter;
conn.setAutoCommit(false);strSql="deletefromFile_ListwhereType_ID='"+request.getParameter("Type_ID")+"'";stmt.executeUpdate(strSql);sql="deletefromType_ListwhereType_ID='"+request.getParameter("Type_ID")+"'";stmt1.executeUpdate(sql);
mit();stmt1.close();stmt.close();conn.close(); response.sendRedirect("OperationSuccess.jsp?msg=刪除目錄"+request.getParameter("Type_Name")+"成功!&ref=Y&tar=servlet/dbclass.ManagerTree&frame=epost_menu");}catch(Exceptione){
conn.rollback(); response.sendRedirect("OperationFail.jsp?msg=刪除目錄"+request.getParameter("Type_Name")+"失??!");}設(shè)置事務(wù)的提交屬性提交事務(wù)回滾事務(wù)事務(wù)要使用可滾動(dòng)的結(jié)果集,必須使用不同于前面所定義的Statement:Statementstmt=conn.createStatement(type,concurrency);PreparedStatementstmt=conn.prepareStatement(sql,type,concurrency)3.2.4可滾動(dòng)和可更新的結(jié)果集ResultSet的Type說(shuō)明TYPE_FORWARD_ONLY結(jié)果集不能滾動(dòng)TYPE_SCROLL_INSENSITIVE結(jié)果集可滾動(dòng),但對(duì)數(shù)據(jù)庫(kù)的變化不敏感TYPE_SCROLL_SENSITIVE結(jié)果集可以滾動(dòng),并且對(duì)數(shù)據(jù)庫(kù)的變化敏感3.2.4可滾動(dòng)和可更新的結(jié)果集ResultSet的Concurrency說(shuō)明CONCUR_READ_ONLY結(jié)果集不可用于更新數(shù)據(jù)庫(kù)CONCUR_UPDATABLE結(jié)果集可以用于更新數(shù)據(jù)庫(kù)3.2.4可滾動(dòng)和可更新的結(jié)果集可滾動(dòng)結(jié)果集中的方法:firstlastbeforeFirstafterLastisFirstisLastisBeforeFirstisAfterLastrelativenextpreviousabsolute3.2.4可滾動(dòng)和可更新的結(jié)果集可更新的結(jié)果集:可以直接通過(guò)結(jié)果集來(lái)更新(insert/update/delete)數(shù)據(jù)庫(kù)表rs.updateXXX(Stringname,Xxxvalue)/rs.updateRow();rs.moveToInsertRow()/rs.updateXxx()/rs.insertRow();rs.deleteRow();rs.cancelRowUpdates();3.2.4可滾動(dòng)和可更新的結(jié)果集3.2.5批處理在JDBC2中,加入了批處理(batch)的功能。所謂批處理,就是將很多的命令(此處是SQL語(yǔ)句)集合到一起執(zhí)行,以提高效率。要使用JDBC的批處理,首先需要使用Statement對(duì)象的addBatch()方法向其中加入SQL語(yǔ)句,然后,使用Statement對(duì)象的executeBatch()方法來(lái)一次執(zhí)行加入到批處理中的SQL語(yǔ)句。注意,在使用addBatch()加入SQL語(yǔ)句的時(shí)候,語(yǔ)句并不會(huì)執(zhí)行,只有在調(diào)用了executeBatch()方法后,才會(huì)執(zhí)行。通常,會(huì)將批處理和事務(wù)處理結(jié)合起來(lái)使用。
3.2.5批處理3.2.6操作數(shù)據(jù)庫(kù)中的BLOB/CLOB類型數(shù)據(jù)有時(shí)候,需要將圖片、聲音等內(nèi)容保存到數(shù)據(jù)庫(kù)中,或者要將一個(gè)內(nèi)容較大的文本文件保存到數(shù)據(jù)庫(kù)中。這些數(shù)據(jù)在數(shù)據(jù)庫(kù)系統(tǒng)中一般使用的數(shù)據(jù)類型為:BLOB(BinaryLargeOBject)或BINARY:用于保存大的二進(jìn)制數(shù)據(jù);CLOB(CharacterLargeOBject)或TEXT::用于保存大的文本數(shù)據(jù);在JDBC中,保存圖片、聲音、文本等大數(shù)據(jù)到數(shù)據(jù)庫(kù),主要用到PreparedStatement接口提供的下列setXXX()方法:
(1)voidsetBinaryStream(intparameterIndex,java.io.InputStreamin,intlength);
其中l(wèi)ength為輸入流長(zhǎng)度,一般可以通過(guò)輸入流的.available()方法計(jì)算(即in.available())。這個(gè)方法最常用,適合任何SQL類型。(2)voidsetAsciiStream(intparameterIndex,java.io.InputStreamin,intlength);主要用于處理文本對(duì)象。(3)voidsetBytes(intparameterIndex,byte[]x);(4)voidsetBlob(intparameterIndex,java.sql.Blobx);3.2.6操作數(shù)據(jù)庫(kù)中的BLOB/CLOB類型數(shù)據(jù)(5)voidsetClob(int
parameterIndex,java.sql.Clobx
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海市2026年高一上學(xué)期期末考試數(shù)學(xué)試卷試題(含答案詳解)
- 經(jīng)典動(dòng)漫介紹
- 內(nèi)兒科介紹教學(xué)課件
- 杭州策劃活動(dòng)方案海報(bào)(3篇)
- 疫情期間居家生活管理制度(3篇)
- 社會(huì)力量參與學(xué)校管理制度(3篇)
- 管理制度方法和技巧書籍(3篇)
- 網(wǎng)吧新店活動(dòng)策劃方案(3篇)
- 獸藥知識(shí)課件
- 重慶典當(dāng)管理制度辦法(3篇)
- 2026湖北隨州農(nóng)商銀行科技研發(fā)中心第二批人員招聘9人筆試模擬試題及答案解析
- 2025年-輔導(dǎo)員素質(zhì)能力大賽筆試題庫(kù)及答案
- 2025年風(fēng)電運(yùn)維成本降低路徑報(bào)告
- 2025年老年娛樂(lè)行業(yè)藝術(shù)教育普及報(bào)告
- 2025年抗菌藥物合理應(yīng)用培訓(xùn)考核試題附答案
- 2025年度臨床醫(yī)生個(gè)人述職報(bào)告
- 2026年煙花爆竹安全生產(chǎn)法律法規(guī)知識(shí)試題含答案
- 2026年《必背60題》 計(jì)算機(jī)科學(xué)與技術(shù)26屆考研復(fù)試高頻面試題包含詳細(xì)解答
- 2026年無(wú)錫商業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能筆試備考試題帶答案解析
- 2026年初二物理寒假作業(yè)(1.31-3.1)
- 2025秋人教版七年級(jí)上冊(cè)音樂(lè)期末測(cè)試卷(三套含答案)
評(píng)論
0/150
提交評(píng)論