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