《《數(shù)據(jù)庫(kù)連接JDBC》PPT課件.ppt》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《《數(shù)據(jù)庫(kù)連接JDBC》PPT課件.ppt(26頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、第7講,數(shù)據(jù)庫(kù)連接(JDBC),2,綱要,數(shù)據(jù)庫(kù)知識(shí)的復(fù)習(xí) 基本SQL語(yǔ)句 JDBC基礎(chǔ) 增、刪、改、查操作舉例 預(yù)處理語(yǔ)句的使用,3,1. 數(shù)據(jù)庫(kù)知識(shí)的復(fù)習(xí),大家已修讀過(guò)數(shù)據(jù)庫(kù)系統(tǒng)課程,這里只復(fù)習(xí)有關(guān)知識(shí): 關(guān)系型數(shù)據(jù)庫(kù)、DBMS、表、字段、記錄、數(shù)據(jù)庫(kù),,,,,一個(gè)數(shù)據(jù)庫(kù)可以包含多個(gè)表,4,數(shù)據(jù)的各種操作技術(shù),數(shù)據(jù)查找(SELECT) 例如:SELECT * FROM factory_tb where factory_id=12 數(shù)據(jù)插入(INSERT) 例如:INSERT INTO productClass_tb VALUES(背包) 數(shù)據(jù)刪除(DELETE) 例如:DELETE FRO
2、M factory_tb WHERE factory_id =04 數(shù)據(jù)更新(UPDATE) 例如: UPDATE productClass_tb SET productClass_name=挎包 WHERE productClass_id=01,5,JDBC是Java DataBase Connectivity(Java 數(shù)據(jù)連接)技術(shù)的簡(jiǎn)稱(chēng),是一種可用于執(zhí)行SQL語(yǔ)句的Java API。它由一些Java語(yǔ)言編寫(xiě)的類(lèi)和接口組成; JDBC為數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)人員、數(shù)據(jù)庫(kù)前臺(tái)工具開(kāi)發(fā)人員提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計(jì)接口,使開(kāi)發(fā)人員可以用純Java語(yǔ)言編寫(xiě)完整的數(shù)據(jù)庫(kù)應(yīng)用程序。,JDBC基礎(chǔ),6,J
3、DBC主要功能: (1)與數(shù)據(jù)庫(kù)建立連接;(2)向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句; (3)處理數(shù)據(jù)返回的結(jié)果。,7,JDBC有兩個(gè)程序包: java.sql:核心包,這個(gè)包中的類(lèi)主要完成數(shù)據(jù)庫(kù)的基本操作,如生成連接、執(zhí)行SQL語(yǔ)句、預(yù)處理SQL語(yǔ)句等; javax.sql:擴(kuò)展包,主要為數(shù)據(jù)庫(kù)方面的高級(jí)操作提供了接口和類(lèi)。 JDBC常用類(lèi)和接口: Driver 接口:加載驅(qū)動(dòng)程序 DriverManager類(lèi):裝入所需的驅(qū)動(dòng)程序,編程時(shí)調(diào)用它的方法來(lái)創(chuàng)建連接; Connection接口:編程時(shí)使用該類(lèi)對(duì)象創(chuàng)建Statement對(duì)象; Statement接口:編程時(shí)使用該類(lèi)對(duì)象得到ResultSet對(duì)象,
4、JDBC的類(lèi)與接口,8,JDBC,JDBC (Java 數(shù)據(jù)庫(kù)連接) (sun公司提供),Java 應(yīng)用程序編程接口,Java應(yīng)用程序,,,數(shù)據(jù)庫(kù),插 入,,,修 改,刪 除,查詢(xún),,,9,數(shù)據(jù)庫(kù),ODBC,客戶(hù)機(jī)/服務(wù)器 GUI應(yīng)用程序,ODBC (開(kāi)放式數(shù)據(jù)庫(kù)連接) (Microsoft 提供),,,插 入,,刪 除,修 改,應(yīng)用程序編程接口,,查詢(xún),,,10,JDBC 驅(qū)動(dòng)程序的類(lèi)型,JDBC 驅(qū)動(dòng)程序 的類(lèi)型,,,,,,JDBC-ODBC橋驅(qū)動(dòng)程序及ODBC驅(qū)動(dòng)程序,本地API部分Java驅(qū)動(dòng)程序,JDBC-Net 純Java驅(qū)動(dòng)程序,本地協(xié)議純Java驅(qū)動(dòng)程序,,每種不同的數(shù)據(jù)庫(kù)的驅(qū)
5、動(dòng)程序都不同,但從類(lèi)型上分為四類(lèi),11,操作步驟: 創(chuàng)建數(shù)據(jù)源(使用JDBC-ODBC橋式驅(qū)動(dòng)程序時(shí)必需創(chuàng)建); 注冊(cè)、加載特定的驅(qū)動(dòng)程序; 創(chuàng)建連接-- Connection對(duì)象; 利用Connection對(duì)象生成Statement對(duì)象; 利用Statement對(duì)象執(zhí)行SQL語(yǔ)句,如增、刪、改、查; 若是執(zhí)行查詢(xún)語(yǔ)句,還要從ResultSet讀取數(shù)據(jù); 關(guān)閉ResultSet、Statement、Connection等。,JDBC的使用(重點(diǎn)),12,(1)創(chuàng)建數(shù)據(jù)源: Windows操作系統(tǒng):開(kāi)始/管理工具/數(shù)據(jù)源(ODBC),選擇用戶(hù)DSN,點(diǎn)擊”添加”按鈕; 選擇對(duì)應(yīng)的驅(qū)動(dòng)程序,如:M
6、icrosoft Access Driver (*.mdb)。,13,(1)創(chuàng)建數(shù)據(jù)源(續(xù)):,14,(2)加載驅(qū)動(dòng)程序: 格式:Class.forName(驅(qū)動(dòng)程序名稱(chēng)); 請(qǐng)注意:不同類(lèi)型的數(shù)據(jù)庫(kù)加載的驅(qū)動(dòng)程序不同: JDBC-ODBC橋式: Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); Ms SQL sever : SQL 2000: Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”); SQL 2005: Class.forName(“com.microsoft.sq
7、lserver.jdbc.SQLServerDriver ”);,15,下載對(duì)應(yīng)的JDBC驅(qū)動(dòng)程序jar包文件,放入Tomcat的lib子目錄中或web項(xiàng)目的WEB-INF/lib中。,SQL Server 2000驅(qū)動(dòng)程序的Jar包有3個(gè)文件:,SQL Server 2005驅(qū)動(dòng)程序的Jar包有1個(gè)文件:,16,成功加載后,會(huì)將加載的驅(qū)動(dòng)類(lèi)注冊(cè)給DriverManager類(lèi),如果加載失敗,將拋出ClassNotFoundException異常,即未找到指定的驅(qū)動(dòng)類(lèi),所以需要在加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)類(lèi)時(shí)捕捉可能拋出的異常。,try Class.forName(sun.jdbc.odbc.JdbcO
8、dbcDriver); catch (ClassNotFoundException e) System.out.println(加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)時(shí)拋出異常,內(nèi)容如下:); e.printStackTrace(); ,17,(3)創(chuàng)建數(shù)據(jù)庫(kù)連接: 格式:Connection conn = DriverManager.getConnection(url,“用戶(hù)名, 密碼); 其中:url類(lèi)似于互聯(lián)網(wǎng)的地址,它由三部分組成,即: 協(xié)議:子協(xié)議:子命名,協(xié)議通常是jdbc,子協(xié)議是接受DBMS的名稱(chēng)和版本,子名字通常是數(shù)據(jù)源。 JDBC-ODBC橋式: jdbc:odbc:數(shù)據(jù)源名,例如: jdb
9、c:odbc:myAccess Ms SQL sever : jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=數(shù)據(jù)庫(kù)名 (適用于SQL 2000) jdbc:sqlserver://127.0.0.1:1433;DatabaseName= 數(shù)據(jù)庫(kù)名 (適用于SQL 2005),18,(4)利用Connection對(duì)象生成Statement對(duì)象(即會(huì)話(huà)): 格式:Statement stmt = conn.createStatement( ); 或 conn.createStatement(int resultSetType,
10、 int resultSetConcurrency) 其中: resultSetType只能是以下三個(gè)值之一: ResultSet.TYPE_FORWARD_ONLY ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.TYPE_SCROLL_SENSITIVE resultSetConcurrency只能是以下兩個(gè)值之一: ResultSet.CONCUR_READ_ONLY ResultSet.CONCUR_UPDATABLE,19,(5)利用Statement對(duì)象執(zhí)行SQL語(yǔ)句: 執(zhí)行select語(yǔ)句:將返回一個(gè) ResultSet 對(duì)象 格式:
11、ResultSet rs = stmt.executeQuery(“Select 語(yǔ)句”); 例如:ResultSet rs = stmt.executeQuery(“SELECT * FROM factory_tb “); 結(jié)果集(即ResultSet 對(duì)象 ):也就是符合查詢(xún)條件的記錄構(gòu)成的集合。,20,執(zhí)行update(更新)、insert(插入)、delete(刪除)語(yǔ)句: 格式: int n= stmt.executeUpdate(“update、insert、delete語(yǔ)句等”); 例如:stmt.executeUpdate(“DELETE FROM factory_tb WHE
12、RE factory_id =04“); 返回結(jié)果:行計(jì)數(shù)或者 0(表示不返回任何內(nèi)容),可以不保存。 請(qǐng)注意: stmt.executeQuery()與stmt.executeUpdate()方法的不同,21,(6)若是執(zhí)行查詢(xún)語(yǔ)句,需要從ResultSet讀取數(shù)據(jù): 通過(guò)返回的ResultSet對(duì)象來(lái)獲得查詢(xún)結(jié)果: ResultSet對(duì)象的指針一開(kāi)始定位在第一條記錄之前,即當(dāng)前行為第一行; ResultSet提供了指針下移的方法:next(),指針可以不斷下移,直到最后。除此之外,還有其它移動(dòng)指針的方法; 通常,也是用rs.next()是否為false來(lái)判斷結(jié)果集是否為空? ResultS
13、et提供了一些方法來(lái)獲得當(dāng)前行中的不同字段的值: getXXX(int 列序號(hào)) 或 getXXX(String 列名),22,(7)調(diào)用close()方法,依次關(guān)閉ResultSet、Statement、Connection對(duì)象。注意:關(guān)閉順序與打開(kāi)順序相反。,23,預(yù)處理語(yǔ)句(自學(xué)),問(wèn)題的提出: 當(dāng)向數(shù)據(jù)庫(kù)發(fā)送一個(gè)SQL語(yǔ)句,比如“Select * from student”,數(shù)據(jù)庫(kù)中的SQL解釋器負(fù)責(zé)將把SQL語(yǔ)句生成底層的內(nèi)部命令,然后執(zhí)行該命令,完成有關(guān)的數(shù)據(jù)操作; 如果不斷地向數(shù)據(jù)庫(kù)提交SQL語(yǔ)句勢(shì)必增加數(shù)據(jù)庫(kù)中SQL解釋器的負(fù)擔(dān),影響執(zhí)行的速度; 如果應(yīng)用程序能針對(duì)連接的數(shù)據(jù)庫(kù)
14、,事先就將SQL語(yǔ)句解釋為數(shù)據(jù)庫(kù)底層的內(nèi)部命令,然后直接讓數(shù)據(jù)庫(kù)去執(zhí)行這個(gè)命令,顯然不僅減輕了數(shù)據(jù)庫(kù)的負(fù)擔(dān),而且也提高了訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的速度。,24,問(wèn)題的解決:對(duì)于JDBC,如果使用Connection和某個(gè)數(shù)據(jù)庫(kù)建立了連接對(duì)象conn,那么 conn就可以調(diào)用 preparedStatement(String sql)方法對(duì)SQL語(yǔ)句進(jìn)行預(yù)編譯處理,生成該數(shù)據(jù)庫(kù)底層的內(nèi)部命令,并將該命令封裝在PreparedStatement對(duì)象中,那么該對(duì)象調(diào)用相應(yīng)的方法都可以使得該底層的內(nèi)部命令被數(shù)據(jù)庫(kù)執(zhí)行; 在創(chuàng)建PreparedStatement 對(duì)象時(shí),SQL 語(yǔ)句是作為參數(shù)提供的;由于只有這些值的
15、位置是已知的,故使用? 符號(hào)來(lái)表示。運(yùn)行SQL語(yǔ)句時(shí),將設(shè)置實(shí)際值。,25,例如: PreparedStatement ps; ps = conn.prepareStatement(“insert into table (col1,col2) values (?, ?)”); ps.setInt(1,100); ps.setString(2,”Dennis”); ps.execute();,26,總結(jié),JDBC概念的理解 使用 Class.forName() 方法可以將驅(qū)動(dòng)程序加載到 Java 解釋器中 使用 DriverManager 類(lèi)的 getConnection() 方法和 Connection 對(duì)象的 createStatement() 方法可建立連接 最后,使用 executeQuery() 或 executeUpdate() 方法通過(guò) Statement 實(shí)例構(gòu)建并執(zhí)行 SQL 語(yǔ)句 PreparedStatement 接口允許創(chuàng)建預(yù)編譯的 SQL 語(yǔ)句,并使得在后續(xù)階段可以指定語(yǔ)句的參數(shù) 結(jié)果集可以是可滾動(dòng)的,也可以是不可滾動(dòng)的,