基于WEB的JAVA開發(fā)設計PPT課件.ppt_第1頁
基于WEB的JAVA開發(fā)設計PPT課件.ppt_第2頁
基于WEB的JAVA開發(fā)設計PPT課件.ppt_第3頁
基于WEB的JAVA開發(fā)設計PPT課件.ppt_第4頁
基于WEB的JAVA開發(fā)設計PPT課件.ppt_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1,基于WEB的JAVA開發(fā)設計 - JDBC數(shù)據(jù)庫訪問,2,主要內容,JDBC簡介 JDBC驅動程序類型 JDBC基本編程 JDBC高級編程,3,JDBC簡介,JDBC(Java Database Connectivity)是一組用來按照統(tǒng)一方式訪問數(shù)據(jù)庫的API。 它向程序員提供了獨立于數(shù)據(jù)庫的統(tǒng)一接口,可以使開發(fā)人員不必考慮所用的特定數(shù)據(jù)庫便可編寫應用程序,實現(xiàn)了Java與數(shù)據(jù)庫的互連。 它能夠: 提供對數(shù)據(jù)庫的跨平臺存取 無需知道數(shù)據(jù)庫具體的位置 無需要知道數(shù)據(jù)庫實現(xiàn)的具體細節(jié),4,5,JDBC驅動程序類型,6,TYPE 1,TYPE 1驅動程序: 是JDBCODBC橋連接方式 通常運

2、行在Windows系統(tǒng)上 需要在客戶機上安裝ODBC驅動程序,7,TYPE 2,TYPE 2驅動程序: 需要在客戶機上安裝所用數(shù)據(jù)對應的本地驅動(這些驅動通常是C或C+語言所編寫的)。 該驅動將JDBC對數(shù)據(jù)庫的調用轉換成數(shù)據(jù)庫本地的API調用,8,TYPE 3,9,TYPE 3,網絡服務可以采用多種技術來提高系統(tǒng)性能,這些服務包括: 負載均衡 緩存技術 連接池技術 容錯機制,10,TYPE 4,TYPE 4是一種純Java的驅動實現(xiàn),他不需要任何客戶端配置。 這也是最為常見的數(shù)據(jù)庫連接方式,11,12,DriverManager,DriverManager類 DriverManager(驅動

3、程序管理器)類負責管理JDBC驅動程序。在使用JDBC驅動程序之前,必須先將驅動程序加載并向DriverManager注冊后才可使用,在程序中可以通過調用Class.forName()方法來完成。 常用方法如下: Public static synchronized Connection getConnection(String url,String user,String password) throws SQLException 獲得url對應數(shù)據(jù)庫的一個連接 Public static void setLoginTimeout(int seconds) 設置要進行數(shù)據(jù)庫登錄時驅動程序等待

4、的延遲時間,13,Connection,Connection接口 Connection對象是通過DriverManager.getConnection()方法獲得,代表與數(shù)據(jù)庫的連接,也就是在已經加載的驅動程序和數(shù)據(jù)庫之間建立連接。Connection接口是JSP編程中使用最頻繁的接口之一。 常用方法如下: Statement createStatement() throws SQLException 創(chuàng)建一個Statement對象 PrepareStatement prepareStatement(String sql) throws SQLException 創(chuàng)建一個Preparestat

5、ement對象,并能把SQL語句提交到數(shù)據(jù)庫進行預編譯 void setAutoCommit(Boolean autocommit) throws SQLException 設置事務提交的模式 void commit() throws SQLException 提交對數(shù)據(jù)庫的更改,使更改生效 void rollback() throws SQLException 放棄當前事務開始以來對數(shù)據(jù)庫所作的修改,14,Statement,Statement接口 Statement用來執(zhí)行靜態(tài)SQL語句。例如,執(zhí)行insert、update、delete語句,可以調用executeUpdate(Strin

6、g sql)方法,執(zhí)行select語句可以調用executeQuery(String sql)方法,該方法返回ResultSet對象。 常用方法如下: ResultSet executeQuery(String sql) throws SQLException 執(zhí)行一個查詢語句并返回結果集 int executeUpdate(String sql) throws SQLException 執(zhí)行更新操作,返回更新的行數(shù) Boolean execute(String sql) throws SQLException 執(zhí)行更新或查詢語句,返回是否有結果集,15,PreparedStatement,P

7、reparedStatement接口 PreparedStatement接口繼承Statement接口,作為提高性能的一條措施,PreparedStatement提供了可以與查詢信息一起預編譯的一種語句類型,16,CallableStatement,CallableStatement是JDBC用來調用數(shù)據(jù)庫中存儲過程的機制 具體的使用和PreparedStatement相似 需要注意的是:要調用的存儲過程必須在數(shù)據(jù)庫中存在,否則將拋出異常,17,ResultSet,ResultSet接口 在Statement執(zhí)行SQL查詢語句時,會返回ResultSet查詢結果記錄集。ResultSet接口提

8、供了逐行訪問這些記錄的方法。 常用方法如下: Boolean next() throws SQLException 把當前指針定位到下一行。注意,最初,ResultSet的指針位于第一行之前。 void close() throws SQLException 釋放ResultSet對象資源 ResultSet提供了getXXX()方法,用于獲取當前行中某列的值,其中“XXX”與列的數(shù)據(jù)類型有關,例如,如要獲取的列是String類型,則使用getString()方法獲取該列的值。getXXX()方法如下所示: getString() getInt() getFloat() getDouble()

9、 getDate() getBoolean(,18,19,import java.sql.* Try Class.forName(oracle.jdbc.driver.OracleDriver); String oraURL= “jdbc:oracle:thin:host:port:dbName”; Connection con=DriverManager.getConnection(oraURL, username,password); Statement statement =connection.createStatement(); String query = SELECT name,

10、 pwd FROM sometable; ResultSet resultSet= statement.executeQuery(query); while(resultSet.next() name =resultSet.getString(1); phone =resultSet.getString(2); System.out.println(name+,+phone); resultSet.close(); statement.close(); con.close(); catch(SQLException e,第一步,第二步,第三步,第四步,第五步,第六步,第七步,20,連接數(shù)據(jù)庫的

11、典型步驟,第一步:加載正確的數(shù)據(jù)庫驅動程序 為什么要加載 如何加載 Class.forName(oracle.jdbc.driver.OracleDriver); DriverManager.registerDriver( new oracle.jdbc.driver.OracleDriver(); 經過以上其中之一語句的聲明后,驅動程序就會自動地加載。 注意:如果classpath路徑中沒有找到所需的驅動程序則會拋出 ClassNotFoundException異常,21,第二步,定義所要連接數(shù)據(jù)庫的地址 String ODBCURL“jdbc:odbc:dbName”; String or

12、acleURL= jdbc:oracle:thin:host:port:dbName“; String mysqlURL= jdbc:mysql:/ host:port/dbName“; String sqlURL“jdbc:microsoft:sqlserver:/host:1433;DatabaseName=dbName”; 通過此步驟,定義要連接的數(shù)據(jù)庫資源 不同數(shù)據(jù)庫連接的地址不同,這點需要特別注意,對弈一些常見的數(shù)據(jù)庫連接地址,要求大家能夠掌握。 URL由3部分組成,各個部分用冒號間隔,格式如下:jdbc: JDBC URL的3部分可分解如下: jdbc:JDBC中的協(xié)議就是jdbc

13、。 :數(shù)據(jù)庫驅動程序名或數(shù)據(jù)庫連接機制的名稱。子協(xié)議的典型示例為oracle,它用于連接oracle數(shù)據(jù)庫。 :一種標記數(shù)據(jù)庫的方法。子名稱根據(jù)子協(xié)議的不同而不同,使用子名稱的目的是為定位數(shù)據(jù)庫 例如 jdbc:oracle:thin:ip:port:sid,22,第三步,建立與數(shù)據(jù)庫的連接 String username = jay_debesee; String password = secret; Connection connection = DriverManager.getConnection(oracleURL, username, password); 通過此步獲得與數(shù)據(jù)庫服務

14、器的連接 另外,數(shù)據(jù)庫連接還可以使用連接屬性信息,如下: Properties dbprops= new Properties(); dbprops.put(user, sa); dbprops.put(password, ); dbprops.put(server, DEMO); dbprops.put(“db, myDB); try Class.forName(weblogic.jdbc.mssqlserver4.Driver); Connectionconn= DriverManager.getConnection(jdbc:weblogic:mssqlserver4, dbprops)

15、; catch(Exception e,23,第四步,創(chuàng)建語句對象 Statement statement = connection.createStatement(); 第五步,聲明SQL語句,并將該語句通過Statement對象提交給服務器進行執(zhí)行。 Stringsql= “SELECT * FROM ONTACT_TABLE”; ResultSet resultSet=statement.executeQuery(sql); 該語句將sql命令提交給數(shù)據(jù)庫服務器進行執(zhí)行,并將執(zhí)行結果存儲在ResultSet對象中進行執(zhí)行,24,Statement接口主要有如下三個方法: 1. Resul

16、tSet executeQuery(String sql) 用于執(zhí)行查詢語句,返回 ResultSet結果集(一個二維表) 2. int executeUpdate(String sql) 用于執(zhí)行添加、刪除或修改操作,返回被更新記錄的條數(shù) 3. boolean execute(String sql) 執(zhí)行參數(shù)部分的SQL語句; 當SQL語句的執(zhí)行結果是一個ResultSet結果集時,本方法返回true;并可以通過StatementgetResultSet()方法得到返回的結果集 當SQL語句執(zhí)行后沒有返回的結果集時,該方法返回false,25,第六步:對查詢結果進行分析 while(resu

17、ltSet.next() name =resultSet.getString(1); phone =resultSet.getString(2); System.out.println(name+,+phone); 針對不同的類型調用不同的getXxx方法(getString(col), getDate(col), ) 通過指定列名或相對順序的方式調用getXxx()方法對應列的內容獲取出來(getString(String) 對結果集中的內容進行修改(updateString(col,val), ) 可以通過(first(), last(), previous(), next(), abso

18、lute(int), ) 方法瀏覽可滾動結果集中的內容 支持多個結果集,26,Java數(shù)據(jù)類型和SQL數(shù)據(jù)類型之間的映射關系,27,第七步,關閉打開的資源 resultSet.close(); statement.close(); connection.close(); 將打開的資源關閉。 注意:資源關閉的順序和打開的順序恰恰相反,28,JDBC-ODBC橋編程實例(Access數(shù)據(jù)庫,創(chuàng)建Access數(shù)據(jù)庫student,表info,字段id(整型),username(文本),pass(文本),name(文本),age(整型) 具體步驟: 建立ODBC數(shù)據(jù)源 使用JDBC-ODBC驅動建立數(shù)

19、據(jù)庫連接 插入/增加兩條記錄 修改一條記錄 刪除一條記錄 查詢所有記錄,29,info表結構,30,建立ODBC數(shù)據(jù)源,控制面板管理工具數(shù)據(jù)源 (ODBC)系統(tǒng)DSN添加Microsoft Access Driver(*.mdb)數(shù)據(jù)源名student,選擇剛才所創(chuàng)建的數(shù)據(jù)庫,31,程序代碼增加,32,程序代碼修改,33,程序代碼刪除,34,程序代碼查詢,); rs.close(); stmt.close(); con.close(); ,35,JDBC訪問Oracle數(shù)據(jù)庫,打開Oracle的“企業(yè)管理器”,為scott用戶添加DBA權限。然后在scott中建立一個表table1,該表的結構

20、包括三個字段:name(varchar2)、sex(varchar2)、score(number)。 創(chuàng)建成功后,在該表中插入幾條測試數(shù)據(jù): 分別為: aaam66 bbbm73 cccf91 dddm85,36,部署Oracle驅動程序,在 “Oracle安裝目錄/jdbc/lib/” 下找到所需的驅動程序classes12.jar,并將其拷貝到當前應用的 “/WEB-INF/lib” 目錄下 然后重新啟動tomcat服務,37,一個JDBC訪問Oracle 數(shù)據(jù)庫的例子,38,); rs.close(); stmt.close(); con.close(); ,39,連接MySQL數(shù)據(jù)庫和

21、連接Oracle數(shù)據(jù)庫的方法非常類似。只是有兩個地方需要注意一下 1). 需要把MySQL的驅動程序mysql-connector-java-5.0.4-bin.jar部署到“/WEB-INF/lib/”下。(MySQL驅動程序可以從其官方網站上下載,連接MySQL數(shù)據(jù)庫,40,2). 注冊驅動程序和獲取連接的語句變?yōu)椋?Class.forName(com.mysql.jdbc.Driver); 或者Class.forName(org.gjt.mm.mysql.Driver); Connection con = DriverManager.getConnection (jdbc:mysql:/

22、ip:port/sid,Login,password,密碼,用戶名,數(shù)據(jù)庫名,IP地址,端口號,連接MySQL數(shù)據(jù)庫,41,例:,MySQL數(shù)據(jù)庫編程實例,42,連接SQL Server數(shù)據(jù)庫同樣和連接Oracle數(shù)據(jù)庫相似。有兩個地方需要注意一下 1). 需要把SQL Server的驅動程序 mssqlserver.jar msbase.jar msutil.jar 部署到“/WEB-INF/lib/”下。(SQL Server的驅動程序可以從微軟的官方網站上下載,連接SQL Server數(shù)據(jù)庫,43,2). 注冊驅動程序和獲取連接的語句變?yōu)椋?Class.forName(com.micro

23、soft.jdbc.sqlserver.SQLServerDriver); Connection con = DriverManager.getConnection (jdbc:sqlserver:/ip:port;databasename=sid,Login,password,密碼,用戶名,數(shù)據(jù)庫名,IP地址,端口號,連接SQL Server數(shù)據(jù)庫,44,例:,SQL Server數(shù)據(jù)庫編程實例,45,高級編程部分,在該部分,內容包括: 事務的概念 使用批處理更新 使用PreparedStatement對象 使用CallableStatement對象 處理可滾動的結果集 處理多個結果集 處理

24、元數(shù)據(jù) 處理BLOB和CLOB 使用事務隔離,46,事務,事務可以將一組SQL語句組成原子操作以保證數(shù)據(jù)的完整性 默認情況下,JDBC使用auto-commit事務模型 一個使用commit和rollabck的示例: Connection con = null; try Class.forName(COM.cloudscape.core.JDBCDriver); con=DriverManager.getConnection( jdbc:cloudscape:c:/PhoneBook); con.setAutoCommit(false); Statement statement = conne

25、ction.createStatement(); statement.executeUpdate(“UPDATE .”);. mit(); catch(Exception e) if(null != con) con.rollback();,47,批處理更新,批處理更新是同時執(zhí)行多個語句的機制。 要執(zhí)行批處理,需要: 按照正常的方式創(chuàng)建一個語句對象 向語句對象中添加多個要執(zhí)行的SQL語句 執(zhí)行批處理 示例: Statement stmt = connection.createStatement(); stmt.addBatch(insert into test values(. . .); s

26、tmt.addBatch(insert into test values(. . .); . . . stmt.executeBatch(,48,PreparedStatement,PreparedStatement 就是帶有占位符的SQL 語句 數(shù)據(jù)庫對他們事先進行編譯,因此,客戶端需要做的只是傳送占位符位置所需要的數(shù)據(jù)。 而普通Statement的SQL語句,只有在程序運行時才對他們進行編譯 因此PreparedStatement運行的速度更快,49,PreparedStatement,示例1: PreparedStatement stmt = connection.prepareStat

27、ement( insert into test values(?,?); stmt.setString(1,”first value”); stmt.setString(2,”second value”); stmt.executeUpdate(); stmt.setString(2,”new record, with different second value”); stmt.executeUpdate(,50,PreparedStatement,示例2: Connection connection =DriverManager.getConnection(url, user, passw

28、ord); PreparedStatement statement =connection.prepareStatement(UPDATE employees +SET salary = ? +WHERE id = ?); int newSalaries=getSalaries(); int employeeIDs=getIDs(); for(int i=0; iemployeeIDs.length; i+) statement.setInt(1,newSalariesi); statement.setInt(2,employeeIDsi); statement.executeUpdate(,

29、51,CallableStatement,CallableStatement是JDBC用來調用數(shù)據(jù)庫中存儲過程的機制 具體的使用和PreparedStatement相似 需要注意的是:要調用的存儲過程必須在數(shù)據(jù)庫中存在,否則將拋出異常 示例: CallableStatement stmt=connection.prepareCall( “ CALL GET_BOOKS(?,?) ); stmt.setString(1,”first value”); stmt.setString(2,”second value”); ResultSet books = stmt.execute(,52,可滾動的

30、結果集,可滾動結果集是允許你在結果集中的不同行之間進行任意瀏覽的ResultSet對象。 具體的操縱方式包括: 使用next()和previous()分別向后和向前跳一行 使用first()或last()方法直接跳到結果集中的第一行或最后一行。 使用absolute(int)方法直接跳到結果集中指定的行 使用relative(int)方法向前或向后跳轉指定的行數(shù),53,可滾動的結果集,此外,你還可以使用其他方法: beforeFirst(), afterLast():將游標置于第一行之前或最后一行之后。 isFirst(), isLast(), isBeforeFirst(), isAfter

31、Last(): 告訴你游標是否指向指定的位置。 而beforeFirst() and afterLast()方法告訴你是否還有更多的數(shù)據(jù)需要處理,54,示例: Statement stmt = connection.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet books = stmt.executeQuery(“SELECT * FROM Books”); if(books.last() /this scrolls from the end backwards

32、do /do something with this row while(books.previous(,55,為了使創(chuàng)建的結果集具有可滾動性,在創(chuàng)建Statement對象時需要使用指定的構建函數(shù),該構建函數(shù)需要指定兩個參數(shù): 支持滾動 ResultSet.TYPE_FORWARD_ONLY (不支持滾動) ResultSet.TYPE_SCROLL_SENSITIVE (支持滾動,當更新時,及時更新結果集中的內容) ResultSet.TYPE_SCROLL_INSENSITIVE (支持滾動,但當數(shù)據(jù)更新時,并不在本結果集中體現(xiàn)) 支持并發(fā) ResultSet.CONCUR_READ_ON

33、LY (禁用更新) ResultSet.CONCUR_UPDATABLE (允許更新,56,多個結果集,批處理和CallableStatement可能返回多個結果集 你可以使用getResultSet()和getMoreResults()來對結果進行檢索 示例: stmt.addBatch(.); . stmt.executeBatch(); do isAnUpdate=false; if(stmt.getUpdateCount() != -1) isAnUpdate=true; /the operation was an update, skip else ResultSet rs = st

34、mt.getResultSet(); /. do something with results while(stmt.getMoreResults() | isAnUpdate); /loop if more results or last operation was an update,57,處理元數(shù)據(jù),元數(shù)據(jù)可以提供一些關于數(shù)據(jù)庫結果的一些信息: 數(shù)據(jù)庫本身的信息 DatabaseMetaData dbmd = connection.getMetaData(); 單表的信息 ResultSet tableRS = connection.getMetaData(). getTables(nu

35、ll,null,”TableName”,null); 結果集的信息 ResultSetMetaData rsmd = resultSet.getMetaData(,58,使用MetaData的例子: Connection connection = null; Class.forName(COM.cloudscape.core.JDBCDriver); connection =DriverManager.getConnection( jdbc:cloudscape:c:/PhoneBook); DatabaseMetaData dbmd = connection.getMetaData(); String version = dbmd.getDriverVersion(); System.out.println(“The driver version is:” + version); ResultSet aTable = dbmd.getTables(null,null,”b%”,null); String table

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論