




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、3/6/20221Java Web開發(fā)技術(shù)開發(fā)技術(shù)第第7章章 JSP中使用數(shù)據(jù)庫中使用數(shù)據(jù)庫3/6/2022.27.1 JDBC技術(shù)概述 幾乎所有的應(yīng)用都要涉及到數(shù)據(jù)的保存。在很多系統(tǒng)中,數(shù)據(jù)庫都是生命的核心,作為軟件開發(fā)人員,必須懂得如何操作和維護(hù)數(shù)據(jù)庫。 本章首先介紹JDBC的工作原理及其四種類型的驅(qū)動(dòng),隨后探討如何使用JDBC技術(shù)連接常用的數(shù)據(jù)庫,如SQL Server,Access,Oracle等,并給出在JSP中使用數(shù)據(jù)庫的具體例子。最后,介紹了數(shù)據(jù)庫連接池的優(yōu)點(diǎn)及工作原理并舉例。 3/6/20 什么是 JDBC lJDBC是Java數(shù)據(jù)庫連接(Java DataB
2、ase Connectivity)技術(shù)的簡(jiǎn)稱 ,它是由JavaSoft公司(Sun公司負(fù)責(zé)開發(fā)Java產(chǎn)品的業(yè)務(wù)單位)同數(shù)據(jù)庫及數(shù)據(jù)庫工具廠家一起建立的獨(dú)立于DBMS的機(jī)制。 JDBC是一種用于執(zhí)行SQL語句的Java API。它由一組用Java編程語言編寫的類和接口組成。這個(gè)API由java.sql.*和javax.sql.*兩個(gè)包中的一些類和接口組成,它為數(shù)據(jù)庫開發(fā)人員提供了一個(gè)標(biāo)準(zhǔn)的API,使他們能夠用純Java API 來編寫數(shù)據(jù)庫應(yīng)用程序。 3/6/2022.4JDBC的優(yōu)點(diǎn)的優(yōu)點(diǎn)lJava具有堅(jiān)固、安全、易于使用、易于理解和可從網(wǎng)絡(luò)上自動(dòng)下載 等優(yōu)點(diǎn);l可移植性強(qiáng):不必為每一種數(shù)據(jù)
3、庫編寫不同的調(diào)用程序 ,只需用JDBC API編寫一個(gè)程序就夠了;3/6/20兩層模型和三層模型 客戶端 JDBC 數(shù)據(jù)庫服務(wù)器 DBMS 相關(guān)協(xié)議 圖 4-1 兩層模型 web 服務(wù)器 JDBC 數(shù)據(jù)庫服務(wù)器 DBMS 相關(guān)協(xié)議 圖 4-2 三層模型 瀏覽器 HTTP,RMI,COBAR 調(diào)用 3/6/20 JDBC驅(qū)動(dòng)程序的類型lJDBC-ODBC橋加ODBC驅(qū)動(dòng) l本地API驅(qū)動(dòng) lJDBC 網(wǎng)絡(luò)純Java驅(qū)動(dòng) l本地協(xié)議純 Java 驅(qū)動(dòng) 3/6/2022.7JDBC-ODBC橋加橋加ODBC驅(qū)動(dòng)驅(qū)動(dòng)l先把JDBC調(diào)用轉(zhuǎn)化為ODBC調(diào)用,再利用ODB
4、C來與數(shù)據(jù)庫交互 。l現(xiàn)存許多可用的ODBC驅(qū)動(dòng)程序與大量數(shù)據(jù)庫的交互,減少開發(fā)人員進(jìn)行企業(yè)開發(fā)的麻煩 。 lODBC數(shù)據(jù)源需要提前在客戶端進(jìn)行注冊(cè),對(duì)于遠(yuǎn)程的客戶端,操作極不方便,丟失平臺(tái)無關(guān)性。 l適用于企業(yè)網(wǎng)或用Java編寫的三層結(jié)構(gòu)的應(yīng)用程序 。3/6/2022.8本地本地API驅(qū)動(dòng)驅(qū)動(dòng) l將標(biāo)準(zhǔn)的JDBC調(diào)用轉(zhuǎn)變?yōu)閷?duì)本地?cái)?shù)據(jù)庫原始驅(qū)動(dòng)程序調(diào)用,再通過數(shù)據(jù)庫的原始驅(qū)動(dòng)程序與數(shù)據(jù)庫交互。 l比JDBC-ODBC橋具有更優(yōu)良的性能 。l丟失JDBC平臺(tái)無關(guān)性的好處,而且也需要安裝客戶端的數(shù)據(jù)庫原始驅(qū)動(dòng)。 3/6/2022.9JDBC 網(wǎng)絡(luò)純網(wǎng)絡(luò)純Java驅(qū)動(dòng)驅(qū)動(dòng) lJDBC網(wǎng)絡(luò)驅(qū)動(dòng)程序傳送
5、JDBC命令到一個(gè)中間件上,這個(gè)中間件再將JDBC調(diào)用請(qǐng)求傳送到數(shù)據(jù)庫中,數(shù)據(jù)庫返回的結(jié)果集也通過這個(gè)中間件來返回到應(yīng)用程序。 l與平臺(tái)無關(guān)的,并且不需要客戶端的安裝和管理,因此很適合于用做Internet的應(yīng)用。 l必須處理Web所提出的安全性、通過防火墻的訪問等方面的額外要求。3/6/2022.10本地協(xié)議純本地協(xié)議純 Java 驅(qū)動(dòng)驅(qū)動(dòng) l直接訪問數(shù)據(jù)庫,中間不需要任何轉(zhuǎn)換或通過其它任何的中間件就能完成交互 。l將成為從JDBC訪問數(shù)據(jù)庫的首選方法,因?yàn)樗麄兲峁┝薐ava的所有優(yōu)點(diǎn)。3/6/2022.11四種四種JDBC驅(qū)動(dòng)程序原理比較驅(qū)動(dòng)程序原理比較 客戶端 本地 JAVA API 數(shù)
6、據(jù)庫 服務(wù)器 客戶端鏈接庫 圖 4-4 本地 API 驅(qū)動(dòng) 中間層服務(wù)器 數(shù)據(jù)庫 服務(wù)器 數(shù)據(jù)鏈接庫 圖4-5 網(wǎng)絡(luò)純Java驅(qū)動(dòng) 網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)程序 客戶機(jī) 客戶端 JDBC-ODBC 橋 ODBC 驅(qū)動(dòng)程序 數(shù)據(jù)庫 服務(wù)器 客戶端鏈接庫 圖 4-3 JDBC-ODBC 橋驅(qū)動(dòng) 客戶端 數(shù)據(jù)庫 服務(wù)器 數(shù)據(jù)庫驅(qū)動(dòng)協(xié)議 圖 4-6 本地協(xié)議純 Java 驅(qū)動(dòng) 3/6/2022.127.2 使用JDBCl要使用JDBC技術(shù)主要包括以下步驟:l注冊(cè)和加載驅(qū)動(dòng)器 ;l與數(shù)據(jù)庫建立連接;l發(fā)送SQL語句;l處理結(jié)果;1.關(guān)閉連接;3/6/20 注冊(cè)和加載驅(qū)動(dòng)器l加載JDBC驅(qū)動(dòng)是通過
7、調(diào)用方法java.lang.Class.forName(),下面列出常用的幾種數(shù)據(jù)庫驅(qū)動(dòng)程序加載語句的形式 : lClass.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);/使用JDBC-ODBC橋驅(qū)動(dòng)程序,事先必須在Windows中注冊(cè)O(shè)DBC數(shù)據(jù)源 lClass.forName(“oracle.jdbc.driver.OracleDriver”);/使用Oracle的JDBC驅(qū)動(dòng)程序 lClass.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);/使用SQL Server的JDBC驅(qū)動(dòng)程序 l
8、Class.forName(“com.ibm.db2.jdbc.app.DB2Driver”);/使用DB2的JDBC驅(qū)動(dòng)程序 lClass.forName(org.gjt.mm.mysql.Driver);/使用MySql的JDBC驅(qū)動(dòng)程序 3/6/20 建立連接l與數(shù)據(jù)庫建立連接的方法是調(diào)用DriverManager.getConnection(String url, String user, String password )方法。l下述代碼顯示如何打開一個(gè)與位于URL為jdbc:odbc:wombat 的數(shù)據(jù)庫的連接。所用的用戶標(biāo)識(shí)符為oboy,口令為12Java:
9、 String url = jdbc:odbc:wombat;Connection con = DriverManager.getConnection(url, oboy, 12Java);3/6/2022.15幾種數(shù)據(jù)庫的連接語句的形式幾種數(shù)據(jù)庫的連接語句的形式 String url=jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=pubs;String user=sa;String password=“”;Connection conn= DriverManager.getConnection(url,user,password)
10、;String url=jdbc:db2:/localhost:5000/sample;String user=admin; String password=; Connection conn= DriverManager.getConnection(url,user,password); String url=jdbc:mysql:/localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1; Connection conn= DriverManage
11、r.getConnection(url); Connection con=DriverManager.getConnection(“jdbc:oracle:oci8:db”,“scott”,“tiger”);/使用Oracle的JDBC OCI驅(qū)動(dòng)程序 Connection con=DriverManager.getConnection(jdbc:oracle:thin:host:8080:db,scott,tiger);/使用Oracle的JDBC Thin驅(qū)動(dòng)程序 3/6/20 發(fā)送SQL語句lStatement對(duì)象用于將 SQL 語句發(fā)送到數(shù)據(jù)庫中。實(shí)際上有三種 St
12、atement對(duì)象:lStatement:用于執(zhí)行不帶參數(shù)的簡(jiǎn)單SQL語句;lPreparedStatement(從 Statement 繼承):用于執(zhí)行帶或不帶IN參數(shù)的預(yù)編譯SQL語句;1. CallableStatement(從PreparedStatement 繼承):用于執(zhí)行數(shù)據(jù)庫存儲(chǔ)過程的調(diào)用。 3/6/20.1 創(chuàng)建Statement對(duì)象lStatement 對(duì)象用Connection的方法createStatement()創(chuàng)建。createStatement()的語法形式為: public Statement createStatement() throws
13、 SQLExceptionl如下列代碼段中所示: Connection con = DriverManager.getConnection(url, sunny, );Statement stmt = con.createStatement(); 3/6/2022.18Statement接口中的主要方法接口中的主要方法 lResultSet executeQuery (String sql) /執(zhí)行Statement對(duì)象,返回單個(gè)結(jié)果集lint executeUpdate (String sql) /執(zhí)行Statement對(duì)象,返回本次操作影響的行數(shù)lboolean execute (Stri
14、ng sql) /執(zhí)行Statement對(duì)象,返回布爾值lvoid close () /關(guān)閉Statement對(duì)象lint getMaxFieldSize () /獲得字段最大長(zhǎng)度lvoid setMaxFieldSize (int max) /設(shè)置字段最大長(zhǎng)度lint getMaxRows () /獲得最大行數(shù)lvoid setMaxRows (int max) /設(shè)置最大行數(shù)lint getQueryTimeout () /獲得查詢超時(shí)時(shí)間限lvoid setQueryTimeout (int seconds) /設(shè)定查詢超時(shí)時(shí)間限ljava.sql.SQLWarning getWarni
15、ngs () /獲得與statement對(duì)象有關(guān)的警告lResultSet getResultSet () /得到下一個(gè)結(jié)果集lint getUpdateCount () /得到修改的行數(shù)lboolean getMoreResults () /檢測(cè)是否有多個(gè)結(jié)果集 3/6/20.2創(chuàng)建PreparedStatement對(duì)象l如果需要多次執(zhí)行一個(gè)SQL語句,可以使用PreparedStatement對(duì)象。在創(chuàng)建PreparedStatement對(duì)象時(shí),通過傳遞不同參數(shù)值多次執(zhí)行PreparedStatement對(duì)象,可以得到多個(gè)不同的結(jié)果。 lPreparedStatemen
16、t對(duì)象用Connection的prepareStatement()方法創(chuàng)建。如: PreparedStatement pStmt = conn.prepareStatement(“insert into emp (empno , ename) values(?,?)”); 生成PreparedStatement對(duì)象的字符串中用“?”代表一個(gè)可以產(chǎn)生變化的IN型參數(shù) 3/6/2022.20PreparedStatement接口的主要方法接口的主要方法 lvoid clearParameters () /清除PreparedStatement對(duì)象中的參數(shù)lvoid setAsciiStream (
17、int parameterIndex, java.io.InputStream x, int length) lvoid setBinaryStream (int parameterIndex, java.io.InputStream x, int length) lvoid setBoolean (int parameterIndex, boolean x) lvoid setByte (int parameterIndex, byte x) lvoid setBytes (int parameterIndex, byte x) lvoid setDate (int parameterInd
18、ex, java.sql.Date x) lvoid setDouble (int parameterIndex, double x) lvoid setFloat (int parameterIndex, float x) lvoid setInt (int parameterIndex, int x) lvoid setLong (int parameterIndex, long x) lvoid setShort (int parameterIndex, short x) 3/6/2022.21PreparedStatement接口的主要方法(續(xù))接口的主要方法(續(xù))lvoid setS
19、tring (int parameterIndex, String x) lvoid setTime (int parameterIndex, java.sql.Time x) lvoid setTimestamp (int parameterIndex, java.sql.Timestamp x) lvoid setUnicodeStream (int parameterIndex, java.io.InputStream x, int length) lvoid setObject (int parameterIndex, Object x)lResultSet executeQuery
20、() /執(zhí)行PreparedStatement對(duì)象,返回單結(jié)果集lint executeUpdate () /執(zhí)行PreparedStatement對(duì)象,返回操作影響的行數(shù)lboolean execute () /執(zhí)行PreparedStatement對(duì)象,返回布爾值3/6/2022.22PreparedStatement接口的方法說明接口的方法說明l其中的參數(shù)parameterIndex表示在構(gòu)造PreparedStatement對(duì)象時(shí)”?”從左到右出現(xiàn)的位置,從1開始。l參數(shù)x表示給”?”設(shè)定的值。l究竟用哪一個(gè)setXXX()方法,由”?”所表示的參數(shù)類型來決定。l因?yàn)閤的類型是java
21、.sql.Types中的類型,而參數(shù)的類型是某種數(shù)據(jù)庫中的數(shù)據(jù)類型,因此應(yīng)該保證它們的類型能夠相對(duì)應(yīng)。一般來說,它們有下面的對(duì)應(yīng)關(guān)系如下表所示:3/6/2022.23數(shù)據(jù)庫數(shù)據(jù)類型和數(shù)據(jù)庫數(shù)據(jù)類型和Java數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系 3/6/2022.24使用使用PreparedStatement 舉例舉例st=con.prepareStatement(insert into EMP(EMPNO,ENAME) values (?,?);st.setInt(1,7777);st.setString(2,Adam);3/6/2022.2創(chuàng)建CallableStatemen
22、t對(duì)象lCallableStatement對(duì)象為數(shù)據(jù)庫提供了一種以標(biāo)準(zhǔn)形式調(diào)用儲(chǔ)存過程的方法。CallableStatement由Connection對(duì)象的方法prepareCall()創(chuàng)建。其中的參數(shù)sql形式為:? = call , . call前面的”?”表示過程返回結(jié)果參數(shù)。方括號(hào)指示其中的內(nèi)容是可選的。它們不是語法的必要部分。l如:CallableStatement cStmt = conn.prepareCall(call showEmployees(?,?); 3/6/2022.26CallableStatement接口中的主要方法接口中的主要方法 lbyte getByte(i
23、nt parameterIndex) l/返回序號(hào)為parameterIndex參數(shù)的字節(jié)值,參數(shù)類型為JDBC TINYINTlDate getDate(int parameterIndex)l/返回序號(hào)為parameterIndex參數(shù)的值,參數(shù)值的類型為java.sql.Dateldouble getDouble(int parameterIndex) /返回序號(hào)為parameterIndex參數(shù)的double類型值lfloat getFloat(int parameterIndex) /返回序號(hào)為parameterIndex參數(shù)的float類型值lint getInt(int para
24、meterIndex) /返回序號(hào)為parameterIndex參數(shù)的int類型值lString getString(int parameterIndex) /返回序號(hào)為parameterIndex參數(shù)的String類型值lvoid registerOutParameter(int parameterIndex, int sqlType) l/將序號(hào)為parameterIndex的參數(shù)注冊(cè)為JDBC中的數(shù)據(jù)類型lvoid setDouble(String parameterName, double x)l / 設(shè)置參數(shù)parameterName為double類型值xlvoid setFloat
25、(String parameterName, float x) / 設(shè)置參數(shù)parameterName為float類型值xlvoid setInt(String parameterName, int x) / 設(shè)置參數(shù)parameterName為int類型值x3/6/2022.27方法說明方法說明l這里的parameterIndex、x和sqlType的意義同prepareStatement中的說明。l在創(chuàng)建CallableStatement對(duì)象前應(yīng)檢查所用的數(shù)據(jù)庫是否支持存儲(chǔ)過程,可以使用DatabaseMetaData對(duì)象的supportsStoredProcedures()方法,其語法形
26、式為:public boolean supportsStoredProcedures() throws SQLExceptionl究竟”?”表示IN型參數(shù)還是表示OUT型參數(shù),取決于存儲(chǔ)過程定義。l使用CallableStatement對(duì)象的過程為:創(chuàng)建CallableStatement對(duì)象、使用registerOutParameter()方法注冊(cè)登記OUT參數(shù)、使用setXXX()方法設(shè)置IN參數(shù)實(shí)際值、使用execute()方法執(zhí)行該存儲(chǔ)過程、使用getXXX()方法取得OUT參數(shù)返回值。3/6/2022.28使用使用CallableStatement舉例舉例 l先建立一個(gè)存儲(chǔ)過程: cr
27、eate or replace procedure show(name out varchar2,num in number) as begin Select Ename into name from emp where empno=num; end;l然后使用CallableStatement對(duì)象: CallableStatement cs=con.prepareCall(call show(?,?); cs.registerOutParameter(1,java.sql.Types.CHAR); cs.setInt(2,7777); cs.execute(); String str=cs.
28、getString(1); 3/6/2022.297.2.4使用Statement 對(duì)象執(zhí)行語句l創(chuàng)建了Statement對(duì)象 ,完成了SQL語句發(fā)送后,就要調(diào)用Statement對(duì)象中的方法執(zhí)行該SQL語句,進(jìn)而得到執(zhí)行的結(jié)果。 lStatement接口提供了三種執(zhí)行SQL語句的方法:executeQuery()、executeUpdate()和execute()。它們的語法形式分別為:3/6/2022.30三種執(zhí)行三種執(zhí)行SQL語句的方法語句的方法lexecuteQuery()返回語句執(zhí)行后的單個(gè)結(jié)果集的,所以通常用于SELECT語句 lexecuteUpdate()返回值是一個(gè)整數(shù),指示
29、受影響的行數(shù)(即更新計(jì)數(shù))。lexecute()返回一個(gè)boolean值,execute()方法執(zhí)行后可以得到多個(gè)結(jié)果集、多個(gè)更新計(jì)數(shù)或二者的組合。本章后面將在單獨(dú)一節(jié)中對(duì)其進(jìn)行介紹。3/6/2022.317.2.5 ResultSet對(duì)象 lResultSet對(duì)象l行和游標(biāo)l 數(shù)據(jù)類型和轉(zhuǎn)換l對(duì)非常大的值使用流lNULL結(jié)果值3/6/2022.3ResultSet對(duì)象lResultSet對(duì)象是executeQuery()方法的返回值,它被稱為結(jié)果集,它代表符合SQL語句條件的所有行,并且它通過一套getXX
30、X方法(這些get方法可以訪問當(dāng)前行中的不同列)提供了對(duì)這些行中數(shù)據(jù)的訪問。lResultSet里的數(shù)據(jù)一行一行排列,每行有多個(gè)字段,并且有一個(gè)記錄指針,指針?biāo)傅臄?shù)據(jù)行叫做當(dāng)前數(shù)據(jù)行,我們只能來操作當(dāng)前的數(shù)據(jù)行。我們?nèi)绻胍〉媚骋粭l記錄,就要使用ResultSet的next()方法 ,如果我們想要得到ResultSet里的所有記錄,就應(yīng)該使用while循環(huán)。 3/6/2022.3行和游標(biāo)lResultSet對(duì)象自動(dòng)維護(hù)指向當(dāng)前數(shù)據(jù)行的游標(biāo)。每調(diào)用一次next()方法,游標(biāo)向下移動(dòng)一行。 l在SQL中,結(jié)果集的游標(biāo)是有名字的。可通過調(diào)用ResultSet對(duì)象的getCurso
31、rName()獲得游標(biāo)名。 l有時(shí)候需要結(jié)果集的游標(biāo)前后移動(dòng),這是可滾動(dòng)結(jié)果集。為了獲得滾動(dòng)結(jié)果集,必須先用下面方法得到一個(gè)Statement對(duì)象:Statement st=con.createStatement(int type, int concurrency);根據(jù)type和concurrency的取值,當(dāng)執(zhí)行ResultSet r=st.executeQuery()時(shí),會(huì)返回不同類型的結(jié)果集。l 結(jié)果集滾動(dòng)的方法很多,詳見課本本章節(jié)。3/6/2022.3 數(shù)據(jù)類型和轉(zhuǎn)換l對(duì)于getXXX()方法,JDBC驅(qū)動(dòng)程序試圖將基本數(shù)據(jù)轉(zhuǎn)換成指定Java類型,然后返回適合的Jav
32、a值。例如,如果為getString()方法,而數(shù)據(jù)庫中數(shù)據(jù)類型為 VARCHAR,則JDBC驅(qū)動(dòng)程序?qū)裋ARCHAR轉(zhuǎn)換成Java String。GetString()的返回值將為Java String 對(duì)象。再如,除了getBytes()和getBinaryStream()之外的任何getXXX()方法都可用來獲取LONGVARCHAR值,但是推薦根據(jù)返回的數(shù)據(jù)類型使用getAsciiStream()或 getUnicodeStream()方法。方法getObject()將任何數(shù)據(jù)類型返回為Java Object。 3/6/2022.3對(duì)非常大的值使用流lResultSe
33、t可以獲取任意大的LONGVARBINARY或LONGVARCHAR數(shù)據(jù)。方法之一是通過讓ResultSet類返回java.io.InputStream來完成。lJDBC API具有三個(gè)獲取流的方法,分別具有不同的返回值: getBinaryStream():返回只提供數(shù)據(jù)庫字節(jié)而不進(jìn)行任何轉(zhuǎn)換的流。getAsciiStream():返回提供單字節(jié)ASCII字符的流。getUnicodeStream():返回提供雙字節(jié)Unicode字符的流。 3/6/2022.3NULL結(jié)果值l要確定給定結(jié)果值是否是JDBC NULL,必須先讀取該列,然后使用ResultSet的wasNull
34、()方法檢查該次讀取是否返回JDBC NULL。l方法wasNull()將返回下列值之一: (1)Java null值:對(duì)于返回Java對(duì)象的getXXX()方法(例如 getString()、getDate()、getTime()、getTimestamp()、getAsciiStream()、getUnicodeStream()、getBinaryStream()、getObject()等)。 (2)0值:對(duì)于 getByte()、getShort()、getInt()、getLong()、getFloat() 和 getDouble()。 (3)false 值:對(duì)于 getBoolean
35、()。3/6/2022.3可選結(jié)果集或多結(jié)果集l但有些情況下,應(yīng)用程序在執(zhí)行語句之前不知道該語句是否返回結(jié)果集。此外,有些已存儲(chǔ)過程可能返回幾個(gè)不同的結(jié)果集和/或更新計(jì)數(shù)。 JDBC提供了一種機(jī)制,允許應(yīng)用程序處理由結(jié)果集和更新計(jì)數(shù)組成的任意集合。l這種機(jī)制的原理是:首先調(diào)用一個(gè)完全通用的execute()方法,然后調(diào)用getResultSet()、getUpdateCount()和getMoreResults()三個(gè)方法。 3/6/2022.38可選結(jié)果集或多結(jié)果集可選結(jié)果集或多結(jié)果集 (續(xù))(續(xù))下面的代碼演示了一種方法用來確認(rèn)已訪問方法execute()所產(chǎn)生的全部結(jié)果集
36、和更新計(jì)數(shù):stmt.execute();while (true) int rowCount = stmt.getUpdateCount();if (rowCount 0) / 它是更新計(jì)數(shù)System.out.println(Rows changed = + count);stmt.getMoreResults();continue;if (rowCount = 0) / DDL 命令或 0 個(gè)更新System.out.println( No rows changed or statement was DDL command);stmt.getMoreResults();continue;/
37、 執(zhí)行到這里,證明有一個(gè)結(jié)果集/ 或沒有其它結(jié)果ResultSet rs = stmt.getResultSet();if (rs != null) . . . / 使用元數(shù)據(jù)獲得關(guān)于結(jié)果集列的信息stmt.getMoreResults();lelsebreak; / 沒有其它結(jié)果3/6/2022.397.2.6 關(guān)閉 Statement對(duì)象和Connection對(duì)象l作為一種好的編程風(fēng)格,應(yīng)在不需要Statement對(duì)象和Connection對(duì)象時(shí)顯式地關(guān)閉它們。關(guān)閉Statement對(duì)象和Connection對(duì)象的語法形式為: public void close() throws SQLE
38、xceptionl用戶不必關(guān)閉ResultSet。當(dāng)它的 Statement 關(guān)閉、重新執(zhí)行或用于從多結(jié)果序列中獲取下一個(gè)結(jié)果時(shí),該ResultSet將被自動(dòng)關(guān)閉。l例:Employee.java,EmployeePrepStat.java3/6/2022.407.2.7 事務(wù)l事務(wù)是由具有“原子性”的一個(gè)或多個(gè)語句,即這些語句要么全部被執(zhí)行、完成并被提交,要么全部還原。當(dāng)調(diào)用連接的提交方法commit()或回滾方法rollback()時(shí),當(dāng)前事務(wù)即告結(jié)束,另一個(gè)事務(wù)隨即開始。l缺省情況下,新連接將處于自動(dòng)提交模式。也就是說,當(dāng)執(zhí)行完語句后,將自動(dòng)對(duì)那個(gè)語句調(diào)用commit()方法。這種情況下
39、,一個(gè)事務(wù)只由一個(gè)語句組成。如果禁用自動(dòng)提交模式,事務(wù)將要等到commit()或rollback()方法被顯式調(diào)用時(shí)才結(jié)束,因此它將包括上一次調(diào)用commit()或rollback()方法以來所有執(zhí)行過的語句。對(duì)于第二種情況,事務(wù)中的所有語句將作為組來提交或還原。 l例:SimpledbBatch.java3/6/2022.417.3 在JSP中通過JDBC-ODBC橋使用數(shù)據(jù)庫l無論訪問什么數(shù)據(jù)庫,使用JDBC-ODBC橋的方法完全一樣,即先注冊(cè)32位數(shù)據(jù)源,再按照上節(jié)中的步驟(注冊(cè)和加載驅(qū)動(dòng)器、與數(shù)據(jù)庫建立連接、發(fā)送SQL語句和處理結(jié)果)使用數(shù)據(jù)庫。 l本節(jié)圖4-9到圖4-16演示了如何注
40、冊(cè)數(shù)據(jù)源的全過程。3/6/2022.427.3.1 查詢舉例l順序查詢(例example4_1.jsp,example4_2.jsp )l 隨機(jī)查詢(例example4_3.jsp ,example4_4.jsp )l 參數(shù)查詢(例example4_5.jsp ,bynename.jsp , byscore.jsp )l 排序查詢(例example4_6.jsp ,byname1.jsp )3/6/2022.437.3.2 更新記錄舉例l例example4_8.jsp輸入學(xué)生姓名和各科成績(jī),并將請(qǐng)求提交給newResult.jsp,該頁面實(shí)現(xiàn)更新記錄。運(yùn)行結(jié)果下圖所示。3/6/2022.447.3.3 添加記錄舉例
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 石棉廢棄物處理與生態(tài)效益評(píng)價(jià)考核試卷
- 耐高溫與去污性能考核試卷
- 貨物運(yùn)輸安全管理考核試卷
- 航空航天器裝配工藝與質(zhì)量控制考核試卷
- 谷物種植與農(nóng)業(yè)遙感技術(shù)考核試卷
- 潛水裝備的水下導(dǎo)航技術(shù)考核試卷
- 運(yùn)動(dòng)場(chǎng)地用塑膠的耐高低溫循環(huán)性能考核試卷
- 搪瓷衛(wèi)生潔具基礎(chǔ)知識(shí)考核試卷
- 物料管理盤點(diǎn)體系構(gòu)建與實(shí)施
- 新生兒急癥護(hù)理
- 滴滴管理制度
- 2025年全國中小學(xué)生百科知識(shí)競(jìng)賽題庫及答案(480題)
- 貨車掛靠協(xié)議合同
- 規(guī)?;B(yǎng)豬場(chǎng)非洲豬瘟生物安全防控策略研究
- 2025年度專業(yè)技術(shù)人員繼續(xù)教育公需科目考試題(附答案)
- DB44-T 2623-2025 道路工程高韌超薄磨耗層技術(shù)規(guī)范
- 第6課 我國國家機(jī)構(gòu)(教學(xué)設(shè)計(jì))2023-2024學(xué)年八年級(jí)道德與法治下冊(cè)同步教學(xué)(河北專版)
- 靜脈輸血相關(guān)制度及流程
- 統(tǒng)編版初中必背 文言文 古詩文
- DB33T 628.1-2021 交通建設(shè)工程工程量清單計(jì)價(jià)規(guī)范 第1部分:公路工程
- 生產(chǎn)安全質(zhì)量培訓(xùn)
評(píng)論
0/150
提交評(píng)論