《c23數(shù)據(jù)庫連接jdbc.ppt》由會員分享,可在線閱讀,更多相關(guān)《c23數(shù)據(jù)庫連接jdbc.ppt(30頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、Java 數(shù)據(jù)庫連接 (JDBC) 第 23 章 回顧 線程的概念 Java中線程的實現(xiàn)方式 共享數(shù)據(jù)的保護(同步) 線程間通信 “死鎖”的概念及預(yù)防 目標(biāo) JDBC的概念 JDBC的使用 PreparedStatement 接口 CallableStatement 接口 JDBC 概念 2-1 JDBC是 JDK核心的一部分 由一組用 Java 編程語言編寫的類和接口組成 用于執(zhí)行 SQL語句 使數(shù)據(jù)庫開發(fā)人員能夠用純 Java API 來編寫數(shù)據(jù) 庫應(yīng)用程序 基本功能 與數(shù)據(jù)庫建立連接 發(fā)送 SQL 語句到數(shù)據(jù)庫 處理返回結(jié)果 JDBC 概念 2-2 特性 易于理解和使用 允許 Java用
2、一致的方法訪問不同類型的數(shù)據(jù)庫 提供多種選擇,適應(yīng)不同需求 屏蔽不同數(shù)據(jù)庫數(shù)據(jù)類型定義的差異 在類 Java.SQL.Types 中定義了一組通用 SQL 類型 標(biāo)識符 提供 DatabaseMetaData 接口,允許用戶檢索關(guān)于 所使用的 DBMS 信息 JDBC 驅(qū)動程序 JDBC的三個組件 應(yīng)用程序 驅(qū)動程序管理器 ( DriverManager ) 驅(qū)動程序 ( Driver ) JDBC驅(qū)動程序的類型 JDBC-ODBC 橋加 ODBC 驅(qū)動程序 本地 API JDBC 網(wǎng)絡(luò)純 Java 驅(qū)動程序 本地協(xié)議純 Java 驅(qū)動程序 第一種驅(qū)動程序 JDBC-ODBC 橋 優(yōu)點 JDK
3、 的標(biāo)準部分 到處都有 ODBC 驅(qū) 動程序 缺點 中間層次可能會導(dǎo) 致性能降低 客戶端需要安裝 ODBC, 不適合大型 網(wǎng)絡(luò)分布式應(yīng)用 第二種驅(qū)動程序 本地 API 優(yōu)點 數(shù)據(jù)庫客戶端好時, 會獲得高效率 缺點 客戶端需要安裝合 適的數(shù)據(jù)庫客戶機庫 程序,不適合大型網(wǎng) 絡(luò)分布式應(yīng)用 第三種驅(qū)動程序 JDBC 網(wǎng)絡(luò)純 Java 驅(qū)動 程序 優(yōu)點 中間層次提供了靈活性: 可以用相同的代碼訪問不 同的數(shù)據(jù)庫 純 Java 驅(qū)動程序,客戶 端安裝容易,適合大型網(wǎng) 絡(luò)分布應(yīng)用 缺點 額外的中間層次可能有 損整體系統(tǒng)性能 第四種驅(qū)動程序 本地協(xié)議純 Java 驅(qū)動 程序 優(yōu)點 直接與數(shù)據(jù)庫進行通訊, 性
4、能最佳 純 Java 驅(qū)動程序,客戶 端安裝容易,適合大型網(wǎng) 絡(luò)分布應(yīng)用 缺點 緊密耦合會影響靈活性, 特別是如果您需要改變應(yīng) 用程序中的底層數(shù)據(jù)庫時 四種驅(qū)動使用的差異 不同點 準備工作不同 比如, JDBC-ODBC 橋需要先建立數(shù)據(jù)源;本地協(xié) 議純 Java 驅(qū)動程序需要下載 jar文件,設(shè)置 classpath 程序不同 驅(qū)動程序名稱字符串不同 數(shù)據(jù)庫 URL標(biāo)識字符串不同 如果將驅(qū)動程序、數(shù)據(jù)庫 URL標(biāo)識字符串通過配置 文件實現(xiàn),則程序可以完全相同 除此之外沒有區(qū)別 JDBC 使用步驟 7-1 加載驅(qū)動程序 Class.forName 通過名字 className加載類 class
5、Name 因驅(qū)動不同而不同 第一種: sun.jdbc.odbc.JdbcOdbcDriver 第四種舉例: oracle.jdbc.OracleDriver try Class.forName(className); catch(ClassNotFoundException e) JDBC 使用步驟 7-2 建立數(shù)據(jù)庫連接 數(shù)據(jù)庫 URL標(biāo)識 jdbc: 第一種舉例: jdbc:odbc:dsn_name 第四種舉例: jdbc:oracle:thin:zhuxg:1521:oracledb import java.sql.*; / 其他代碼 try Connection con = Dri
6、verManager.getConnection(“URL” ,“登錄名” ,“口令 ); catch(SQLException e) JDBC 使用步驟 7-3 創(chuàng)建 Statement 對象 Statement 對象負責(zé)將 SQL 語句發(fā)送到 DBMS Statement sql = con.createStatement(); JDBC 使用步驟 7-4 提交 SQL 語句 Statement 對象的方法 int rt = stmt.executeUpdate(sqlString); 用于提交 DDL 、 insert、 update和 delete 返回值為語句影響行數(shù)或 0 Resu
7、ltSet rs = stmt.executeQuery(sqlString); 用于提交 SELECT 返回值為 ResultSet 對象,記錄的集合 boolean b = stmt.execute(sqlString); 用于執(zhí)行任何 SQL 語句,可能返回多個結(jié)果。結(jié)果可通 過 getResultSet(), getUpdateCount(), getMoreResults() 獲得 返回 true 表示第一個 返回 結(jié)果為 ResultSet JDBC 使用步驟 7-5 處理返回結(jié)果 ResultSet 使用 next()方法可以順序查詢 結(jié)果集將游標(biāo)最初定位在第一行的前面 第一次調(diào)
8、用 next()方法使游標(biāo)移動到第一行 以后每次調(diào)用,下移一行 next()方法返回一個 boolean型數(shù)據(jù),當(dāng)游標(biāo)移動到最后一行 之后返回 false 使用 getXXX 方法檢索數(shù)據(jù) getInt() 用于檢索整型值 getString() 用于檢索字符串值 getXXX 方法可按字段名和字段順序,按字段順序時不可顛倒順 序,比如先 rs.getInt(5); 再 rs.getString (3); JDBC 使用步驟 7-6 關(guān)閉 Statement 一個 Statement 對象同時只能打開一個 ResultSet 執(zhí)行完 SQL 語句可以關(guān)閉 Statement stmt.clos
9、e(); JDBC 使用步驟 7-7 斷開數(shù)據(jù)庫連接 建立連接比較費時 所有數(shù)據(jù)庫操作完成,可以斷開連接 Connection con.close(); 一個完整的例子 Ch4_1Employees.java Statement 高級應(yīng)用 4-1 Statement sql =con.createStatement(type, concurrency); 根據(jù) type, concurrency 的取值, stmt返回相應(yīng)類型的結(jié)果 集 type的取值 ResultSet.TYPE_FORWARD_ONLY ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet
10、.TYPE_SCROLL_SENSITIVE concurrency的取值 ResultSet.CONCUR_READ_ONLY ResultSet.CONCUR_UPDATABLE Statement 高級應(yīng)用 4-2 ResultSet.TYPE_FORWARD_ONLY 結(jié)果集只能向前滾動 默認方式 ResultSet 有關(guān)方法 next() ResultSet.TYPE_SCROLL_INSENSITIVE 結(jié)果集可前后滾動 數(shù)據(jù)庫內(nèi)容變化時 ResultSet 內(nèi)容不變 ResultSet.TYPE_SCROLL_SENSITIVE 結(jié)果集可前后滾動 數(shù)據(jù)庫內(nèi)容變化時 ResultS
11、et 內(nèi)容同步改變 Statement 高級應(yīng)用 4-3 前后滾動 ResultSet 有關(guān)方法 previous(); next(); beforeFirst(); afterLast(); first(); last(); isAfterLast(); isBeforeFirst(); isFirst(); islast(); getRow(); absolute(int row); 注意 行號從 1開始 如果取負值,就是倒數(shù)的行數(shù), absolute(-1);表示移到最 后一行 移到最后一行再用 getRow()獲取行號,就得到總的行數(shù) Statement 高級應(yīng)用 4-4 Result
12、Set.CONCUR_READ_ONLY ResultSet 只能讀數(shù)據(jù)庫 ResultSet.CONCUR_UPDATABLE ResultSet 能用于更新數(shù)據(jù)表 ResultSet 的相關(guān)方法 public void updateXXX(String columnName, XXX x) throws SQLException public void updateRow() throws SQLException 例程序 JdbcDemo.java 高級查詢 使用過濾條件 sql.executeQuery(Select * from Student where Id2); 排序查詢 sq
13、l.executeQuery(Select * from Student Order By Id); 模糊查詢 可以用 SQL語句操作符 LIKE進行模式匹配,使用“ %” 代替一個或多個字符,用一個下劃線“ _”代替一個字 符。 sql.executeQuery(“Select * from Student Where Name Like 王 % ); 更新添加刪除記錄 添加新記錄 sql. executeUpdate(“INSERT INTO Student VALUES(33,LiuMing,xcn)”); 刪除記錄 sql. executeUpdate(“Delete From Stu
14、dent Where Id 2”); 更新記錄 sql. executeUpdate(“Update Student Set Name= Wang Where Id =2”); PreparedStatement接口 2-1 要多次執(zhí)行一個 SQL語句, 使用 PreparedStatement SQL 語句在創(chuàng)建時提供參數(shù) 在執(zhí)行 PreparedStatement 時,只傳遞參數(shù)值 通過不同的參數(shù)值多次調(diào)用 PreparedStatement pStmt = conn.preparedStatement( insert into emp (empno , ename) values(?,?
15、); PreparedStatement接口 2-2 在創(chuàng)建 PreparedStatement 對象之后,必須為參 數(shù)賦值 使用 setXXX方法 用 executeUpdate() 方法執(zhí)行 SQL語句 例程序 Ch4_2EmployeesPrepStat.java CallableStatement 接口 CallableStatement 用于執(zhí)行 SQL 存儲過程 CallableStatement cStmt = conn.prepareCall(call showEmployees(?,?); IN參數(shù) setXXX(index,value); OUT參數(shù) registerOutParameter(index,Type) getXXX(index); IN OUT參數(shù) 設(shè)置輸入和 IN參數(shù)相同 也需要象 OUT參數(shù)一樣注冊和獲取返回值 例程序 JDBCPureJava.java 使用套接字 客戶端程序 服務(wù)端程序 JDBC 數(shù)據(jù)庫( DBMS) Socket發(fā)送 SQL語句,接 收查詢結(jié)果 優(yōu)點:客戶端不需 要任何驅(qū)動程序 總結(jié) JDBC的概念 JDBC的使用 PreparedStatement 接口 CallableStatement 接口 作業(yè) P329 習(xí)題 2