




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、清華大學出版社 理解JDBC應用程序編程接口; 掌握使用純Java驅動程序操作數據庫的編程方法; 掌握對數據的增加、刪除、修改和查詢編程技術; 查詢記錄的分頁面顯示; 數據庫連接池編程技術。 7.1 JDBC概述概述 7.2 JDBC應用程序接口簡介應用程序接口簡介 7.3 利用利用JDBC訪問數據庫訪問數據庫 7.4 數據庫操作案例數據庫操作案例 7.5 上機實訓上機實訓 7.6 本本 章章 習習 題題 7.1.1 什么是JDBC JDBC是Java數據庫連接(Java Data Base Connectivity)技術的簡稱,指Java同許多數據庫之間連接的一種標準。 JDBC為數據庫應用
2、開發人員、數據庫前臺工具開發人員提供了一種標準的JavaAPI,使開發人員可以用純Java語言編寫完整的數據庫應用程序。 簡單地說,JDBC能夠完成下列三件事: 與一個數據庫建立連接(connection)。 向數據庫發送SQL語句(statement)。 處理數據庫返回的結果(resultset)。 7.1.2 JDBC的構的構成成 1.JDBC API:定義了標準接口,無論編寫Mysql還是Oracle等數據庫程序,這些接口是一致的。 2.JDBC數據庫驅動程序 7.2.1 DrvierManager類 提供管理一組JDBC驅動程序所需要的基本服務,可以跟蹤可用的驅動程序,并在數據庫和相應
3、的驅動程序之間建立連接。 該類的常用方法有:getConnection和forName方法。 public static Connection getConnection(String url,String user,String password) public static Class forName(String className) DrvierManager類的使用法: (1)加載驅動)加載驅動 例如: Class.forName(com.mysql.jdbc.Driver); (2)與數據庫建立連接)與數據庫建立連接 DriverManager.getConnection(Stri
4、ng url,String user,String password); 對getConnection函數中的參數解釋: url參數的命名方法:url由3部分組成,各部分間用冒號分隔,如下所示: jdbc: 其中:jdbc協議名稱。在JDBC URL中的協議總是jdbc。 驅動程序名或數據庫連接機制的名稱。如“odbc”,它是用于指定ODBC風格的數據庫資源名稱的URL而保留的。 一種標識數據庫的方法。子名稱可以依不同的子協議而變化。它還可以有子名稱的子名稱(含有驅動程序編程人員所選的任何內部語法)。使用子名稱的目的是為定位數據庫提供足夠的信息。 7.2.2 Connection接口 Conn
5、ection接口是java.sql包中最重要的接口。Connection對象代表與數據庫的連接。一個應用程序可與單個數據庫有一個或多個連接,或者可與許多數據庫有連接。 數據庫連接一旦建立,就可用來向它所涉及的數據庫發送SQL語句。Connection的作用是創建向數據庫發送SQL語句的三個接口。這三個接口分別是: Statement接口 PreparedStatement接口 CallableStatement接口。 7.2.2 Connection接口 Connection接口提供了多個同名但是參數不同的方法創建以上的三個接口。 例如: public Statement createStat
6、ement(); public Statement createStatement(int resultSetType,int resultSetConcurrency); 其中:參數resultSetType指返回記錄集的類型 resultSetConcurrency指發送的SQL語句的權限 7.2.2 Connection接口 常用的一些方法: boolean isClosed():用于判斷Connection對象是否已經被關閉; void commit():用于提交SQL語句,確認從上一次提交以來所進行的修改; void close():斷開連接,釋放資源; void rollback(
7、):取消SQL語句,取消當前事務中進行的修改。 DatabaseMetaData getMetaData():獲取一個DatabaseMetaData對象。 7.2.3 Statement接口 Statement接口對象創建完畢后,主要使用以下方法: public ResultSet executeQuery(String sql):用于執行產生單個結果集的語句,如select。 public int executeUpdate(String sql):用于執行insert、update或delete語句以及SQL DLL(數據定義)語句。當執行insert、update或delete語句時將
8、返回一個整數,用于表示受影響的行數,返回結果為0時表示操作失敗;當執行SQL DLL語句,如create table時,由于它不操作行,返回值將總為0。 7.2.3 Statement接口 public boolean execute(String sql):用于執行返回多個結果集、多個更新計數或二者結合的SQL語句。 public int executeBatch():用于執行幾個SQL語句。Statement接口使用addBatch(String sql)方法將幾個SQL語句添加到一個語句塊中,然后一同提交給數據庫服務器,同時執行。當執行多個SQL insert語句時效率將很高,因為一次提
9、交比多次提交要節省很多系統資源。 void close():釋放Satement對象的數據庫和JDBC資源。 7.2.3 Statement接口 PreparedStatement接口對象主要使用以下方法: public ResultSet executeQuery(String sql):使用Select命名對數據庫進行查詢。 public int executeUpdate(String sql):用于執行insert、update或delete語句對數據庫進行新增、刪除和修改操作。 void setXXX(int parameterIndex,XXX x):設定XXX數據類型值給Prep
10、aredStatement 類對象的IN參數。 7.2.3 Statement接口 CallableStatement接口主要用于執行存儲過程,其主要方法同Statement。存儲過程有兩種參數,IN參數和OUT參數。CallableStatement接口繼承了PerpareedStatement接口的setXXX方法對IN參數賦值。在CallableStatement接口中使用OUT參數,要做兩件事情,一是對OUT參數進行類型注冊,二是獲取OUT參數的值。 CallableStatement提供了多種方法進行類型注冊,下面是常用的兩種: registerOutParameter(String
11、 parameterStringName, int sqlType); registerOutParameter(String parameterStringName, int sqlType,int scale); 7.2.4 數據結果集ResultSet接口 ResultSet接口用于獲取執行SQL語句(或數據庫存儲過程)返回的結果。它的實例對象是符合SQL語句條件的所有行。 常用的方法有: public boolean next():用于數據庫游標移動到結果集的下一行,使之成為當前行。如果當前行為最后一行,返回值為false;否則,返回true。 在定位到結果集中的某行后,就可以讀取數據
12、。對于不同數據類型,要使用不同的讀取方法getXXX()。JDBC提供了兩種形式: 7.2.4 數據結果集ResultSet接口 public XXX getXXX(String columnName):XXX代表任意的數據類型,參數columnName代表列名。 public XXX getXXX(int columnIndex):XXX代表任意的數據類型,參數columnIndex代表列號。 ResultSetMetaData getMetaData():獲取結果集的列編號、類型和屬性 下面是ResultSet接口的示例:private Statement stmt = null;priv
13、ate ResultSet rs = null;private PreparedStatement prpSql=null;Class.forName(com.mysql.jdbc.Driver);Connection conn=DriverManager.getConnection(jdbc:mysql:/localhost:端口號/數據庫名稱,用戶名,密碼);stmt = conn.createStatement();rs = stmt.executeUpdate(select * from database);while(rs.next() rs.getString(1);rs.clos
14、e();stmt.close();conn.close(); 7.2.5 數據庫元數據數據庫元數據-DatabaseMetaData和和ResultSetMetaData DatabaseMetaData接口可以從數據庫管理系統中獲得數據庫的信息,例如數據庫所有的表名、存儲過程名等信息。這個類提供了許多方法來取得這些信息,常用的方法如下: String getDatabaseProductName():獲得數據庫的名稱。 ResultSet getCooumns(String databasename,String dboname, String tablename,String column
15、name):獲得表字段信息,以列的方式存儲在一個ResultSet對象中。 7.2.5 數據庫元數據數據庫元數據-DatabaseMetaData和和ResultSetMetaData ResultSetMetaData接口用來獲取數據庫表的結構。通過它提供的一些常用方法,可以獲得ResultSet對象中的類型和屬性信息的對象。常用方法如下: int getColumnType(int column):檢索指定列的SQL類型; String getTableName(int column):獲取指定列的名稱; 所有的利用JDBC訪問數據庫的程序都具有以下的流程: 加載JDBC驅動程序 建立和數
16、據庫的連接 執行SQL語句 存放處理結果 與數據庫斷開連接 7.3.1 通過通過JDBC-ODBC橋連接來訪問數據橋連接來訪問數據庫庫 可以使JDBC有能力訪問幾乎所有類型的數據庫。下面通過一個例子介紹: 1、首先建立一個access數據庫,數據庫名稱為:book,保存數據庫文件。 7.3.1 通過通過JDBC-ODBC橋連接來訪問數據橋連接來訪問數據庫庫 2、配置數據源、配置數據源 首先要配置ODBC數據源。選擇數據源(ODBC)(Win 2000在管理工具中;Win XP在控制面板中) 先看圖片,在現場演示。先看圖片,在現場演示。 在管理工具中,選擇“數據源” 在對話框中選擇用戶dsn,添
17、加 在對話框中選擇access driver(*。Mdb) 單擊“完成”。在數據源名稱輸入“book”。選擇數據庫為book。 選擇圖書管理數據庫.mdb權限默認,在登錄用戶名輸入對應的用戶名和密碼。 7.3.1 通過通過JDBC-ODBC橋連接來訪問數據橋連接來訪問數據庫庫 3 編寫相應的程序編寫相應的程序 (1)加載數據庫的驅動程序 (2)建立連接 (3)向數據庫發送SQL語句 (4)處理查詢結果 (5)關閉數據庫連接 7.3.1 通過通過JDBC-ODBC橋連接來訪問數據橋連接來訪問數據庫庫 【例7.1】利用JDBC-ODBC橋連接數據庫,執行SQL語句,并在數據庫中插入一條記錄。 ch
18、7_1.jsp文件內容如下: 0) out.println(添加成功); else out.println(添加失敗); rs=stmt.executeQuery(select * from book); out.print(); out.print(); out.print(+書號); out.print(+書名); out.print(+作者); out.print(+出版社); out.print(+單價); out.print(); while(rs.next() out.print(); out.print(+rs.getString(1)+); out.print(+rs.getS
19、tring(2)+); out.print(+rs.getString(3)+); out.print(+rs.getString(publish)+); out.print(+rs.getFloat(price)+); out.print(); out.print(); stmt.close(); /關閉數據庫 conn.close(); catch(Exception e) out.println(e.toString(); % 7.3.2 利用本地協議純利用本地協議純Java驅動程序連接數驅動程序連接數據庫據庫 1.安裝安裝mysql數據庫數據庫 從網上下載mysql-5.0.22-wi
20、n32.zip,將mysql安裝到了E:mysql目錄中。 2.啟動啟動mysql cd e:mysqlbin mysqld-nt 7.3.2 利用本地協議純利用本地協議純Java驅動程序連接數驅動程序連接數據庫據庫 7.3.2 利用本地協議純利用本地協議純Java驅動程序連接數據驅動程序連接數據庫庫 3.啟動啟動mysql監視器監視器 用戶再啟動一個MS-DOS窗口,切換到E:MYSQLBIN目錄中,執行如下命令: e: cd mysql cd bin mysql -u root 7.3.2 利用本地協議純利用本地協議純Java驅動程序連接數驅動程序連接數據庫據庫 7.3.2 利用本地協議純
21、利用本地協議純Java驅動程序連接數驅動程序連接數據庫據庫 4.創建數據庫創建數據庫 啟動mysql監視器后,可以在提示符下輸入sql語句來創建數據庫和表,sql語句結束必須使用“;”符號。在編輯sql語句的過程中可以使用/c終止當前sql語句的編輯。 在mysql監視器提示符下,輸入創建圖書管理數據庫booklib的SQL語句并執行, 7.3.2 利用本地協議純利用本地協議純Java驅動程序連接數驅動程序連接數據庫據庫 7.3.2 利用本地協議純利用本地協議純Java驅動程序連接數據庫驅動程序連接數據庫 5.創建數據庫中的表創建數據庫中的表 在booklib數據庫中創建book表的SQL語句
22、為: CREATE TABLE book ( bid char(20) NOT NULL, name char(20) default NULL, author char(10) default NULL, publish varchar(50) default NULL, price float default NULL, PRIMARY KEY (bid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 7.3.2 利用本地協議純利用本地協議純Java驅動程序連接數驅動程序連接數據庫據庫 5.創建數據庫中的表創建數據庫中的表7.3.2 利用本地協議純利用本地協議
23、純Java驅動程序連接數據庫驅動程序連接數據庫6.編寫相應的程序編寫相應的程序-連接連接mysql數據庫數據庫try Class.forName(com.mysql.jdbc.Driver); try /和數據庫建立連接 conn=DriverManager.getConnection(jdbc:mysql:/localhost:3306/booklib,root,); conn.close(); catch(Exception e) out.println(e.toString(); 7.3.2 利用本地協議純利用本地協議純Java驅動程序連接數驅動程序連接數據庫據庫 【例7.2】利用純Ja
24、va驅動程序連接mysql數據庫,查詢book表中的所有記錄 連接不同的數據庫,除Class.forName()中的驅動程序類及url的書寫方式不同之外,其他所有部分均相同。 7.3.3 配置和連接不同的數據庫配置和連接不同的數據庫 1.連接連接Oracle數據庫數據庫 安裝完Oracle后,找到文件classes12.zip(可以在Oracle安裝目錄搜索得到),將該文件復制到Java JDK的子目錄/jre/lib/ext目錄中,并其更名為classes.jre或cleasses.jar。 Class.forName(oracle.jdbc.driver.OracleDriver); Dr
25、iverManager.getConnection(jdbc:oracle:thinhost:端口號:數據庫名, 用戶名,密碼); 7.3.3 配置和連接不同的數據庫配置和連接不同的數據庫 2.連接連接Sql Server數據庫數據庫 下載sqljdbc_1.1.1501.101_enu.exe驅動安裝文件。 找到sqljdbc.jar文件,將其復制到Tomcat所使用的JDK的jrelibext目錄中。連接方法: Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver); DriverManager.getConnection(
26、jdbc:sqlserver:/172.0.0.1:1443;DatabaseName=數據庫名, “用戶名”,“密碼”); 提示: 如果應用程序和要連接的Sql Server2000服務器在不同的計算機上,可以使用Sql Server 2000服務器的ip地址,例如192.168.1.1。如果應用程序無法和Sql Server2000連接,可能需要更新Sql Server 2000服務器。用戶可以從微軟網站下載補丁sqlsp4.rar,安裝該補丁即可。 7.4.1 查詢數據查詢數據 1.順序查詢數據順序查詢數據 ResultSet rs=stmt.executeQuery(select bi
27、d,name,author,publish,price from book); 對于結果集rs的列數為5列,第一列對用bid,第二列對應name,第三列對應author,第四列對應publish,第五列對應price;而每一次rs只能看到一行,要在看到下一行,必須使用next()方法移動當前行。ResultSet對象使用getXXX()方法獲得當前行字段的值。 下面是一個實例: QueryBean.java代碼QueryBean.java代碼package mybean.database;import java.sql.*;public class QueryBean String user=
28、; String password=; StringBuffer queryResult; public QueryBean() queryResult=new StringBuffer(); try Class.forName(com.mysql.jdbc.Driver); catch(Exception e) public String getString(String str) String s=str.trim(); trybyte bb=s.getBytes(ISO-8859-1); s=new String(bb); ch7_3.jsp文件內容:ch7_3.jsp文件內容: 輸入用
29、戶名: 輸入密碼: 查詢到的記錄: 2.隨機查詢隨機查詢 如果需要在結果集中前后移動或隨機顯示某一條記錄,這時就必須得到一個可以滾動的結果集。得到滾動結果集的方法如下: Statement stmt=conn.createStatement(int type,int concurrency); ResultSet rs=stmt.executeQuery(sqlstr); 其中type的取值決定結果集的滾動方式,可以取下列值: 2.隨機查詢隨機查詢 ResultSet.TYPE_FORWORD_ONLY:結果集的游標只能向下移動。 ResultSet.TYPE_SCROLL_INSENSITI
30、VE:結果集的游標可以上下移動,當數據庫的數據變化時,當前結果集不變。 ResultSet.TYPE_SCROLL_SENSITIVE:結果集的游標可以上下移動,當數據庫的數據變化時,當前結果集同步變化。 2.隨機查詢隨機查詢 滾動結果集ResultSet對象可以使用的方法如下: public boolean previous():將游標向上移動,當移動到結果集第一行之前返回false。 public void beforeFirst():將游標移到結果集第一行之前。 public void afterLast():將游標移到結果集最后一行之后。 public void first():將游標
31、移到結果集的第一行。 public void last():將游標移到結果集的最后一行。 public boolean isAfterLast():判斷游標是否在結果集的最后一行之后。 2.隨機查詢隨機查詢 滾動結果集ResultSet對象可以使用的方法如下: public boolean isBeforeFirst():判斷游標是否在結果集第一行之前。 public boolean isFirst():判斷游標是否在結果集第一行。 public boolean isLast():判斷游標是否在結果集的最后一行。 public int getRow():得到當前游標所在的行,行號從1開始,如果
32、結果集沒有行,則返回0。 public boolean absolute(int row):將游標移到到row所指定的行,row取負值則倒數,如-1,則移動到最后一行。 2.隨機查詢隨機查詢 【例7.4】隨機查詢示例。 RandomQuerybean.java StringBuffer queryResult; Connection conn; Statement stmt; ResultSet rs; public String handleString(String s) String str=s; try byte bb=str.getBytes(ISO-8859-1); str=new
33、 String(bb); return str; catch(Exception e) return str; public RandomQuerybean() queryResult=new StringBuffer(); ch7_3.jsp文件內容:ch7_4.jsp文件內容: 3.條件查詢條件查詢 在順序查詢和隨機查詢中得到的是表中的全部記錄。如果要得到表中滿足條件的記錄,就要采用條件查詢。條件查詢是由客戶端提供查詢條件,即查詢的參數,再由這些參數構造SQL語句,執行該語句并得到篩選結果的查詢。 下面的例子根據用戶選擇的字段和輸入的關鍵字查詢圖書信息,如果沒有輸入關鍵字則顯示所有圖書的信
34、息。 3.條件查詢條件查詢 【例7.5】條件查詢圖書信息 keyQueryBean.java queryResult.append(+rs.getString(5)+); queryResult.append(); queryResult.append(); rs.close(); stmt.close(); conn.close();catch(Exception e)System.out.println(e);queryResult.append(e.toString();return queryResult; ch7_5.jsp文件內容: 選擇 書號 作者 書名 出版社 含有 含有關鍵字
35、的記錄: 7.4.2 更新查詢更新查詢 Statement對象提供了int executeUpdate(String sqlStatement)方法,用于實現對數據庫中數據的添加、刪除和更新操作。sqlStatement參數是由insert、delete和update等關鍵字構成的Sql語句。函數返回值為查詢所影響的行數,失敗返回0。 例如添加記錄的sql語句: String sqlStatement=insert book values(tp1004,高數,楊, 清華出版社,35); 7.4.2 更新查詢更新查詢 stmt.executeUpdate(sqlStatement); 例如更新記
36、錄的sql語句: String sqlStatement=update book set name=新值 where bid=tp1001; stmt.executeUpdate(sqlStatement); 例如刪除記錄的sql語句: String sqlStatement=delete from book where bid=tp1001 ; stmt.executeUpdate(sqlStatement); 7.4.2 更新更新查詢查詢 1、添加記、添加記錄錄 【例7.6】向mysql數據庫中的表追加記錄 addBean.java addMessage=對表中添加+m+記錄; else
37、addMessage=添加記錄失敗!; stmt.close(); conn.close();catch(Exception e)addMessage=輸入的書號不能為重復!;return addMessage; ch7_6.jsp文件內容: 書號是主鍵,不能輸入重復值。 輸入書號: 輸入書名: 輸入作者: 輸入出版社: 輸入單價: 您添加記錄操作結果為: 當前數據庫的記錄是: 7.4.2 更新更新查詢查詢 2、刪除記、刪除記錄錄 【例7.7】刪除book表中的記錄。 listBean.javaqueryResult.append(刪除);queryResult.append();queryR
38、esult.append();conn.close();catch(Exception e) queryResult.append(請輸入正確的用戶名和密碼!+注意:用戶名為root,密碼為空。);return queryResult; deleteBean.javapackage mybean.database;import java.sql.*;public class deleteBean String strbid=;String deleteMessage=;public deleteBean()tryClass.forName(com.mysql.jdbc.Driver);catc
39、h(Exception e)public String getStrbid() return strbid;public void setStrbid(String strbid) this.strbid = strbid; ch7_7.jsp文件內容:查詢到的記錄:ch7_7delete.jsp文件內容:% String strbid=null; try strbid=request.getParameter(bid); 7.4.2 更新更新查詢查詢 3.修改記錄修改記錄 【例7.8】修改記錄,頁面如圖效果如圖所示:use booklibdelimiter $create procedure
40、 update_book_p(in p_bid char(20), in p_name char(20), in p_author char(10), in p_publish varchar(50), in p_price float)reads sql databegin update book set name=p_name, author=p_author, publish=p_publish, price=p_price where bid=p_bid;end $delimiter ; showBean.javapackage mybean.database;import java.
41、sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class showBean StringBuffer queryResult;public showBean()queryResult=new StringBuffer();try Class.forName(com.mysql.jdbc.Driver);catch(Exception e)public String getString(String str)String s=str.t
42、rim();trybyte bb=s.getBytes(ISO-8859-1); 三個頁面代碼: 第三個頁面ch7_8update.jsp文件內容: 第三個頁面上的Javabean代碼:pstmt.setString(3, author);pstmt.setString(4, publish);pstmt.setFloat(5, price);pstmt.executeUpdate();pstmt.close();conn.close();updateMessage=成功修改記錄;catch(SQLException e1)updateMessage=e1.toString();return
43、updateMessage; 7.4.3 分頁查詢分頁查詢 分頁顯示程序中可以使用CachedRowSetImpl類,CachedRowSetImpl對象可以保存ResultSet對象中的數據,它不依賴與Connection對象,并且繼承了ResultSet的所有方法。CachedRowSetImpl類在com.sun.rowset包中。 使用CachedRowSetImpl對象的代碼如下: 7.4.3 分頁查詢分頁查詢 import com.sun.rowse.*; ResultSet rs=stmt.executeQuery(select * from book); CachedRowSetImpl rowSet=new CachedRowSetImpl(); rowSet.populate(rs); while(rowS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年建造師考試準備攻略試題及答案
- 2025年MSOffice高級應用考試真題卷(Access高級查詢技巧)
- 2025年度中級會計考試試題及答案
- 企業在區塊鏈技術中的競爭與合作策略
- 各類題型分析中級審計師試題及答案
- 工程項目監理試題及答案
- 醫療保險制度在應急救援中的應用實踐
- 學習秘籍2025年入團考試試題答案
- 醫療大數據在農村健康教育中的價值
- 廣東全國計算機PowerPoint題庫單選題100道及答案
- 2022年廣東省深圳市南山區小升初數學試卷
- 樁頭破除專項施工方案
- 光電信息科學與工程職業生涯發招報告
- 新生兒住院期間母乳喂養課件
- 云計算與物聯網
- 江蘇省2022年高考數學考試真題與答案解析
- 大學生如何應對擔心和焦慮的情緒
- 信息技術合同和軟件法律規定法律合規的經驗與教訓
- 中醫藥治療慢性萎縮性胃炎的用藥規律演示稿件
- GB/T 30163-2023高爐用高風溫頂燃式熱風爐節能技術規范
- 如何從倫理角度分析工程案例
評論
0/150
提交評論