版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第9章 Java數據庫技術 9.1 JDBC概述概述9.2 使用使用JDBC 9.3 實例實例 習習 題題 9.1 JDBC概述概述 JDBC(Java Database Connection,Java數據庫連接)是一種用于執(zhí)行SQL語句的JavaAPI(應用程序設計接口),它由一些Java語言寫的類和界面組成。JDBC提供了一種標準的應用程序設計接口,使得開發(fā)人員使用Java語言開發(fā)完整的數據庫應用程序變得極為簡單。通過JDBC,開發(fā)人員幾乎可以將SQL語句傳遞給任何一種數據庫,而無需為各種數據庫編寫單獨的訪問程序。JDBC可以自動將SQL語句傳遞給相應的數據庫管理系統(tǒng)。 JDBC擴展了Ja
2、va的功能,例如在Applet中應用JDBC,可以實現(xiàn)與遠程數據庫的連接,實現(xiàn)不同平臺數據庫之間的對話。簡單地說,JDBC完成下面三個操作: (1) 與一個數據庫建立連接。 Connection con = DriverManager.getConnection(jdbc:odbc:CallCenter,sa,); (2) 向數據庫發(fā)送SQL語句。 stmt = con.createStatement();rs = stmt.executeQuery(SELECT CID,CPin from tCustomer WHERE CID=z1); (3) 處理數據庫返回的結果。while(rs.ne
3、xt()String theInt = rs.getString(CID);String str = rs.getString(CPin); .9.2 使使 用用JDBC JDBC的接口分為兩個層次:一個是面向程序開發(fā)人員的JDBC API;另外一個是底層的JDBC Driver API。JDBC API 被描述成為一組抽象的Java接口,應用程序可以對某個數據庫打開連接,執(zhí)行SQL語句并且處理結果。最重要的接口如下: java.sql.DriverManager:處理驅動的調入并且對產生新的數據庫連接提供支持。 java.sql.Connection:代表對特定數據庫的連接。 java.sq
4、l.Statement:代表一個特定的容器,以對一個特定的數據庫執(zhí)行SQL語句。 java.sql.ResultSet:控制對一個特定語句的行數據的存取。 其中java.sql.Statement又有兩個子類型: (1) java.sql.PreparedStatement:用于執(zhí)行預編譯的SQL語句。 (2) java.sql.CallableStatement:用于執(zhí)行對一個數據庫內嵌過程的調用。 JDBC Driver API是指java.sql.Driver接口,封裝了不同數據庫的驅動程序(像Access、Foxpro、SQL Server等)。由于它是數據庫底層處理,所以必須提供對j
5、ava.sql.Connection、java.sql. Statement、java.sql.PreparedStatement和java.sql.ResultSet的實現(xiàn)。 如果目標DBMS提供有OUT參數的內嵌過程,那么還必須提供java.sql.CallableStatement 接口。在java.sql.Driver接口中每個數據庫驅動程序必須提供一個類,使得系統(tǒng)可以由 java.sql.DriverManager來管理。一個比較好用的驅動程序是在ODBC之上提供對JDBC的實現(xiàn),從而提供與ODBC接口的JDBC-ODBC 橋。所謂JDBC-ODBC橋,是一個JDBC驅動程序,通過將
6、JDBC操作轉換為ODBC操作來實現(xiàn)JDBC操作。它由sun.jdbc.odbc包實現(xiàn),包含一個用來訪問ODBC的本地庫,對所有ODBC可用的數據庫實現(xiàn)JDBC。 通過ODBC子協(xié)議,可以使用下面一行代碼進行顯示加載。 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); 加載時,ODBC驅動程序將創(chuàng)建自己的實例,同時在JDBC驅動程序管理器中進行注冊。由于JDBC放在ODBC之后,所以實現(xiàn)起來簡單且高效。9.2.1 Driver Driver接口是每個驅動器類都需要完成的。JavaSQL框架允許有多個數據庫驅動器,每個驅動器應該提供一個類來實現(xiàn)驅動器接口,
7、而驅動器的裝載通過DriverManager實例實現(xiàn)。 DriverManager將裝載盡量多的驅動器,對每個給定的連接請求,將所有的驅動器依次連接到目標數據庫上。當驅動器類裝載后,Driver應該創(chuàng)建一個實例,然后注冊到DriverManager上。9.2.2 DriverManager DriverManager管理一系列JDBC驅動器的基本服務。應用程序可以顯式加載JDBC驅動器。例如下面代碼顯式加載my.sql.Driver。 Class.forName(my.sql.Driver); 顯式加載JDBC-ODBC橋: Class.forName(sun.jdbc.odbc.JdbcOd
8、bcDriver);它的較為重要的方法有: public static Connection getConnection(String url) throws SQLException public static Connection getConnection(String url, Properties info) throws SQLException public static Connection getConnection(String url, String user, String password) throws SQLException 這些方法的功能都是建立一個到給定數據
9、庫url的連接。DriverManager試圖從注冊的JDBC驅動器序列中選擇合適的驅動器,返回到url的連接。 其中: (1) url為數據庫url,格式為 jdbc:subprotocol:subname。 (2) info以“標記/數值對”作為連接參數,至少應該包括user和password屬性對。 (3) user指數據庫用戶(連接以什么身份建立)。 (4) password 是用戶的密碼。 例如:使用JDBC-ODBC橋建立到ODBC配置的數據庫CallCenter的連接,訪問CallCenter數據庫的用戶名為sa,密碼無。語句行如下:Connection con = Driver
10、Manager.getConnection(jdbc:odbc:CallCenter,sa,); 9.2.3 Connection 一個Connection(連接)就是一個與特定數據庫的會話。在連接的上下文環(huán)境中才可以執(zhí)行SQL語句和返回結果。Connection對象的數據庫可以提供描述它的表、SQL語法和存儲過程等的信息。它較為重要的方法有: public Statement createStatement() throws SQLException 創(chuàng)建一個Statement對象,用于發(fā)送SQL語句到數據庫。沒有參數的SQL語句通常使用Statement對象執(zhí)行。如果希望多次執(zhí)行,使用Pr
11、eparedStatement更為高效。 public PreparedStatement prepareStatement(String sql) throws SQLException 創(chuàng)建一個PreparedStatement對象,發(fā)送參數化SQL語句sql到數據庫。 SQL語句可以預先編譯并存儲到PreparedStatement語句中。這個對象可以用來高效地多次執(zhí)行語句。 其中:參數sql是包含多個“?”參數的SQL語句,“?”表示輸入參數由用戶進行設置。 例如: 創(chuàng)建Statement對象語句如下: stmt = con.createStatement(); 創(chuàng)建PreparedS
12、tatement對象語句如下: pstmt = con.prepareStatement(UPDATE Xuesheng SET 班級 = ? WHERE 班級 = ?);9.2.4 Statement Statement對象用于執(zhí)行一個靜態(tài)的SQL語句并返回它產生的結果。在缺省情況下,任一時刻每個Statement對象只產生一個ResultSet集。對數據庫希望有不同操作得到結果集時,需要創(chuàng)建不同的Statement對象。它的較為重要的方法有: public ResultSet executeQuery(String sql) throws SQLException 執(zhí)行給定的sql語句,返
13、回一個ResultSet對象。 public int executeUpdate(String sql) throws SQLException 執(zhí)行給定的sql語句,可以是插入(INSERT)、更新(UPDATE)或者刪除(DELETE)等,也可以是一個空語句,執(zhí)行DDL語句。返回值是操作的記錄個數。 public ResultSet getResultSet() throws SQLException 以ResultSet對象格式返回當前結果集,每個結果集只調用一次。 例如: 從表tCustomer中返回CID為z1的記錄的CID(客戶ID)和CPin(密碼)列,語句行為:rs = stm
14、t.executeQuery(SELECT CID,CPin from tCustomer WHERE CID= z1 );9.2.5 PreparedStatement PreparedStatement代表預編譯的SQL語句的對象。一個SQL語句預編譯后存儲到PreparedStatement對象中,這個對象用來多次執(zhí)行語句。PreparedStatement繼承于Statement,擴展了Statement的用途,提高了Statement的執(zhí)行效率。它與Statement對象有兩點不同:(1) 同一個對象可以多次使用。(2) 它的SQL語句可以帶輸入(IN)參數。 PreparedSta
15、tement在程序語句中的輸入參數使用占位符“?”來實現(xiàn)。必須使用類提供的設置方法設置語句中占位符的具體值,才能執(zhí)行語句。如下面的程序段,根據ID的取值更新EMPLOYEES表中SALARY字段的取值,將第一個占位符代表的參數設置為10000.00,將第二個占位符代表的參數設置為111,語句執(zhí)行的結果是EMPLOYEES表中ID為111的記錄的SALARY取值為10000.00。 PreparedStatement pstmt = con.prepareStatement(UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?); pstmt.setBigDe
16、cimal(1, 10000.00) pstmt.setInt(2, 111); pstmt.executeUpdate(); 類PreparedStatement提供的常用方法如下: public boolean execute() throws SQLException 執(zhí)行PreparedStatement對象中的任一類型的SQL語句。如果返回true,則調用getResultSet方法取得ResultSet集;如果返回false,則調用getUpdateCount方法獲得更新數。 public ResultSet executeQuery() throws SQLException 執(zhí)
17、行SQL查詢,并返回查詢產生的結果集。 public int executeUpdate() throws SQLException 執(zhí)行對象中的SQL語句。如果是一些更新操作,如插入(INSERT)、修改(UPDATE)和刪除(DELETE )等,則返回操作的個數。常用的設置方法為:public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException 在第parameterIndex位置設置BigDecimal型x。public void setBoolean(int parameterIndex, b
18、oolean x) throws SQLException 在第parameterIndex位置設置布爾型x。public void setByte(int parameterIndex, byte x) throws SQLException在第parameterIndex位置設置字節(jié)型x。public void setBytes(int parameterIndex, byte x) throws SQLException在第parameterIndex位置設置字節(jié)數組型x。public void setDouble(int parameterIndex, double x) throws
19、 SQLException在第parameterIndex位置設置雙精度型x。public void setFloat(int parameterIndex, float x) throws SQLException 在第parameterIndex位置設置單精度型x。public void setInt(int parameterIndex, int x) throws SQLException 在第parameterIndex位置設置整型x。public void setLong(int parameterIndex, long x) throws SQLException在第parame
20、terIndex位置設置長整型x。public void setNull(int parameterIndex, int sqlType) throws SQLException 在第parameterIndex位置設置為空x。public void setObject(int parameterIndex, Object x) throws SQLException 在第parameterIndex位置設置對象x。public void setShort(int parameterIndex, short x) throws SQLException 在第parameterIndex位置設置
21、短整型x。void setString(int parameterIndex, String x) throws SQLException 在第parameterIndex位置設置字符串型x。public void setTime(int parameterIndex, Time x) throws SQLException 在第parameterIndex位置設置時間型x。public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException在第parameterIndex位置設置時間戳型x。9.2.6 Re
22、sultSet Result對象是指一張數據表,代表數據庫結果集,通常是通過執(zhí)行查詢數據庫的語句而產生的。ResultSet對象持有一個游標,該游標指向當前數據行。初始化時游標定位到第一行之前。Next方法將游標移動到下一行,當對象行完時,返回錯誤。通常使用循環(huán)來完成每行的遍歷。 public boolean next() throws SQLException 讀行,返回true;行數完,則返回false。 例如,下面程序段完成對結果集的操作,對所有記錄進行遍歷并輸出其中的字段CID和CPin的值。while(rs.next()String theInt = rs.getString(CID
23、);String str = rs.getString(CPin);System.out.println(CID: +theInt+ CPin: +str); 結果集有一些方法用于對返回結果的具體字段進行讀取,包括以字段編號為參數和以字段名稱為參數的讀取,其中以字段編號為參數的讀取速度快一些,而以字段名稱為參數的讀取對用戶來說更加方便。 所謂字段編號是指當前結果集中的第一個列字段編號為1,然后依次加1對剩余列進行編號;而字段名稱是指列標題的名字。Get字段的類型同上述Set字段的類型一致。下面是以字段編號為參數的讀取方法:public BigDecimal getBigDecimal(int
24、columnIndex) throws SQLException public boolean getBoolean(int columnIndex) throws SQLException public byte getByte(int columnIndex) throws SQLExceptionpublic byte getBytes(int columnIndex) throws SQLExceptionpublic double getDouble(int columnIndex) throws SQLExceptionpublic float getFloat(int colum
25、nIndex) throws SQLException public Int getInt(int columnIndex) throws SQLExceptionpublic Long getLong(int columnIndex) throws SQLExceptionpublic Object getObject(int columnIndex) throws SQLException public short getShort(int columnIndex) throws SQLException public String getString(int columnIndex) t
26、hrows SQLException public java.sql.Time getTime(int parameterIndex, Time x) throws SQLException public java.sql.TimeStamp getTimestamp(int columnIndex) throws SQLException以字段名稱為參數的讀取方法如下:public BigDecimal getBigDecimal(String columnName) throws SQLException public boolean getBoolean(String columnNam
27、e) throws SQLException public byte getByte(String columnName) throws SQLExceptionpublic byte getBytes(String columnName) throws SQLExceptionpublic double getDouble(String columnName) throws SQLExceptionpublic float getFloat(String columnName) throws SQLException public Int getInt(String columnName)
28、throws SQLException public Long getLong(String columnName) throws SQLExceptionpublic Object getObject(String columnName) throws SQLException public short getShort(String columnName) throws SQLException public String getString(String columnName) throws SQLException public java.sql.Time getTime(String
29、 columnName) throws SQLException public java.sql.TimeStamp getTimestamp(String columnName) throws SQLException9.3 實實 例例 【例9.1】給出一個完整的實例,包括建立所需用戶數據庫,配置ODBC數據源,編寫訪問數據庫的程序,查看運行結果。其中訪問數據庫程序輸出班級為“025”的記錄,并將“025”修改為“計算機”。9.3.1 建立用戶數據庫建立用戶數據庫 建立FoxPro數據庫,數據庫名為Student.mdb,其中一個表為Xuesheng.dbf,記錄如圖9.1所示。圖9.1 表
30、Xuesheng.dbf中的記錄9.3.2 配置配置ODBC數據源數據源 在Windows 2000下配置ODBC數據源,首先找到程序管理工具數據源(ODBC),(在Windows 98下,可在控制面板中找到ODBC),調出“ODBC數據源管理器”,如圖9.2所示。圖9.2 ODBC數據源管理器點擊“添加”按鈕,出現(xiàn) “創(chuàng)建新數據源” 窗口,如圖9.3所示。圖9.3 為數據源選擇驅動程序 在圖9.3中選擇“Microsoft Visual FoxPro Driver”選項,然后點擊“完成”按鈕,進入“ODBC Visual FoxPro Setup”窗口,如圖9.4所示。圖9.4 完成ODBC
31、數據源的配置 (1) “Data Source Name (數據源名)”:ODBC提供給應用程序的數據庫名字。在圖9.4中填為STU。 (2) “Description (描述)”:用來說明數據庫的文字信息,可根據自己的需要填寫。在圖9.4中填為“用于JAVA程序的數據庫測試”。 (3) “Path (路徑)”是ODBC映射數據庫的具體路徑,可以直接填寫,也可以單擊“Browse”(瀏覽)按鈕選擇一數據庫。這里選擇的路徑為E:_WorkJavaSTUDENT.DBC。 (4) 點擊“OK (確定) ”按鈕,可以看見“ODBC數據源管理器”窗口多出一個STU數據源。9.3.3 數據庫訪問的步驟數
32、據庫訪問的步驟編寫數據庫訪問程序的步驟如下:(1) 引入java.sql的包。import java.sql.*;(2) 聲明變量。Statement stmt;PreparedStatement pstmt;ResultSet rs;(3) 加載驅動程序。Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);(4) 連接數據庫。String urlName = jdbc:odbc:STU;Connection con = DriverManager.getConnection(urlName,);(5) 執(zhí)行查詢操作。rs = stmt.executeQue
33、ry(SELECT 學號,姓名,班級 from Xuesheng WHERE 班級=025);.pstmt = con.prepareStatement(UPDATE Xuesheng SET 班級 = ? WHERE 班級 = ?);pstmt.setString(1,計算機);pstmt.setString(2,025);pstmt.executeUpdate();. (6) 關閉數據庫。 con.close();9.3.4 源程序代碼源程序代碼源程序代碼如下:/程序文件名UseJDBC.javaimport java.sql.*;public class UseJDBCpublic static void main(String args)tryStatement stmt;PreparedStatement pstmt;ResultSet rs;/加載JD
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西省呂梁市(2024年-2025年小學六年級語文)部編版課后作業(yè)((上下)學期)試卷及答案
- 2024行政助理2024年工作計劃(33篇)
- 《艾默生動環(huán)材料》課件
- 2024房地產VIP認籌標準協(xié)議
- 2024年重組家庭財產分配合同6篇
- 2024年草地養(yǎng)殖場地租賃合同
- 2024年跨國公司區(qū)域總部設立合同
- 一匹出色的馬課件
- 2024年食品配方保密協(xié)議樣本3篇
- 2024某服裝公司與模特之間的服裝代言合同
- 2024年全國《國防和兵役》理論知識競賽試題庫與答案
- 企業(yè)知識產權保護策略及實施方法研究報告
- 2024年07月11026經濟學(本)期末試題答案
- 2024年中小企業(yè)股權融資合同3篇
- 2024年01月11289中國當代文學專題期末試題答案
- 2024年秋季生物教研組工作計劃
- 2024年云南高中學業(yè)水平合格考歷史試卷真題(含答案詳解)
- 2025年董事長年會發(fā)言稿范文
- 醫(yī)院廉潔購銷合同
- 車間設備線路安裝方案
- 專題11 名著閱讀之《童年》(考題猜想)(期中真題速遞20題)(含答案解析)
評論
0/150
提交評論