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