計(jì)算機(jī)軟件及應(yīng)用JSP中使用數(shù)據(jù)庫_第1頁
計(jì)算機(jī)軟件及應(yīng)用JSP中使用數(shù)據(jù)庫_第2頁
計(jì)算機(jī)軟件及應(yīng)用JSP中使用數(shù)據(jù)庫_第3頁
計(jì)算機(jī)軟件及應(yīng)用JSP中使用數(shù)據(jù)庫_第4頁
計(jì)算機(jī)軟件及應(yīng)用JSP中使用數(shù)據(jù)庫_第5頁
已閱讀5頁,還剩77頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

2023/12/6JavaWeb開發(fā)技術(shù)14.1JDBC技術(shù)概述幾乎所有的應(yīng)用都要涉及到數(shù)據(jù)的保存。在很多系統(tǒng)中,數(shù)據(jù)庫都是生命的核心,作為軟件開發(fā)人員,必須懂得如何操作和維護(hù)數(shù)據(jù)庫。本章首先介紹JDBC的工作原理及其四種類型的驅(qū)動(dòng),隨后探討如何使用JDBC技術(shù)連接常用的數(shù)據(jù)庫,如SQLServer,Access,Oracle等,并給出在JSP中使用數(shù)據(jù)庫的具體例子。最后,介紹了數(shù)據(jù)庫連接池的優(yōu)點(diǎn)及工作原理并舉例。2023/12/6JavaWeb開發(fā)技術(shù)24.1.1什么是JDBC

JDBC是Java數(shù)據(jù)庫連接(JavaDataBaseConnectivity)技術(shù)的簡稱它是由JavaSoft公司(Sun公司負(fù)責(zé)開發(fā)Java產(chǎn)品的業(yè)務(wù)單位)同數(shù)據(jù)庫及數(shù)據(jù)庫工具廠家一起建立的獨(dú)立于DBMS的機(jī)制。

2023/12/6JavaWeb開發(fā)技術(shù)3JDBC的組成JDBC是一種用于執(zhí)行SQL語句的JavaAPI。它由一組用Java編程語言編寫的類和接口組成。這個(gè)API由java.sql.*和javax.sql.*兩個(gè)包中的一些類和接口組成,它為數(shù)據(jù)庫開發(fā)人員提供了一個(gè)標(biāo)準(zhǔn)的API,使他們能夠用純JavaAPI來編寫數(shù)據(jù)庫應(yīng)用程序。2023/12/6JavaWeb開發(fā)技術(shù)4JDBC的優(yōu)點(diǎn)Java具有堅(jiān)固、安全、易于使用、易于理解和可從網(wǎng)絡(luò)上自動(dòng)下載等優(yōu)點(diǎn);可移植性強(qiáng):不必為每一種數(shù)據(jù)庫編寫不同的調(diào)用程序,只需用JDBCAPI編寫一個(gè)程序就夠了;2023/12/6JavaWeb開發(fā)技術(shù)54.1.2兩層模型和三層模型2023/12/6JavaWeb開發(fā)技術(shù)64.1.3JDBC驅(qū)動(dòng)程序的類型JDBC-ODBC橋加ODBC驅(qū)動(dòng)本地API驅(qū)動(dòng)JDBC網(wǎng)絡(luò)純Java驅(qū)動(dòng)本地協(xié)議純Java驅(qū)動(dòng)2023/12/6JavaWeb開發(fā)技術(shù)7JDBC-ODBC橋加ODBC驅(qū)動(dòng)ODBC(OpenDatabaseConnectivity,開放數(shù)據(jù)庫互連)是微軟公司開放服務(wù)結(jié)構(gòu)中有關(guān)數(shù)據(jù)庫的一個(gè)組成部分它建立了一組規(guī)范,并提供了一組對數(shù)據(jù)庫訪問的標(biāo)準(zhǔn)API(應(yīng)用程序編程接口)。這些API利用SQL來完成其大部分任務(wù)。ODBC本身也提供了對SQL語言的支持,用戶可以直接將SQL語句送給ODBC。2023/12/6JavaWeb開發(fā)技術(shù)8JDBC-ODBC橋加ODBC驅(qū)動(dòng)先把JDBC調(diào)用轉(zhuǎn)化為ODBC調(diào)用,再利用ODBC來與數(shù)據(jù)庫交互?,F(xiàn)存許多可用的ODBC驅(qū)動(dòng)程序與大量數(shù)據(jù)庫的交互,減少開發(fā)人員進(jìn)行企業(yè)開發(fā)的麻煩。缺點(diǎn):ODBC數(shù)據(jù)源需要提前在客戶端進(jìn)行注冊,對于遠(yuǎn)程的客戶端,操作極不方便,丟失平臺(tái)無關(guān)性。適用:企業(yè)網(wǎng)或用Java編寫的三層結(jié)構(gòu)的應(yīng)用程序。2023/12/6JavaWeb開發(fā)技術(shù)9JDBC-ODBC橋加ODBC驅(qū)動(dòng)2023/12/6JavaWeb開發(fā)技術(shù)10本地API驅(qū)動(dòng)將標(biāo)準(zhǔn)的JDBC調(diào)用轉(zhuǎn)變?yōu)閷Ρ镜財(cái)?shù)據(jù)庫原始驅(qū)動(dòng)程序調(diào)用,再通過數(shù)據(jù)庫的原始驅(qū)動(dòng)程序與數(shù)據(jù)庫交互。比JDBC-ODBC橋具有更優(yōu)良的性能。缺點(diǎn):丟失JDBC平臺(tái)無關(guān)性的好處,而且也需要安裝客戶端的數(shù)據(jù)庫原始驅(qū)動(dòng)。

2023/12/6JavaWeb開發(fā)技術(shù)11本地API驅(qū)動(dòng)2023/12/6JavaWeb開發(fā)技術(shù)12JDBC網(wǎng)絡(luò)純Java驅(qū)動(dòng)JDBC網(wǎng)絡(luò)驅(qū)動(dòng)程序傳送JDBC命令到一個(gè)中間件上,這個(gè)中間件再將JDBC調(diào)用請求傳送到數(shù)據(jù)庫中,數(shù)據(jù)庫返回的結(jié)果集也通過這個(gè)中間件來返回到應(yīng)用程序。優(yōu)點(diǎn):與平臺(tái)無關(guān)的,并且不需要客戶端的安裝和管理,因此很適合于用做Internet的應(yīng)用。缺點(diǎn):必須處理Web所提出的安全性、通過防火墻的訪問等方面的額外要求。2023/12/6JavaWeb開發(fā)技術(shù)13JDBC網(wǎng)絡(luò)純Java驅(qū)動(dòng)2023/12/6JavaWeb開發(fā)技術(shù)14本地協(xié)議純Java驅(qū)動(dòng)直接訪問數(shù)據(jù)庫,中間不需要任何轉(zhuǎn)換或通過其它任何的中間件就能完成交互。將成為從JDBC訪問數(shù)據(jù)庫的首選方法,因?yàn)樗麄兲峁┝薐ava的所有優(yōu)點(diǎn)。2023/12/6JavaWeb開發(fā)技術(shù)15本地協(xié)議純Java驅(qū)動(dòng)2023/12/6JavaWeb開發(fā)技術(shù)164.2使用JDBC要使用JDBC技術(shù)主要包括以下步驟:注冊和加載驅(qū)動(dòng)器;與數(shù)據(jù)庫建立連接;發(fā)送SQL語句;處理結(jié)果;關(guān)閉連接;2023/12/6JavaWeb開發(fā)技術(shù)174.2.1注冊和加載驅(qū)動(dòng)器加載JDBC驅(qū)動(dòng)是通過調(diào)用方法java.lang.Class.forName(),下面列出常用的幾種數(shù)據(jù)庫驅(qū)動(dòng)程序加載語句的形式:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);//使用JDBC-ODBC橋驅(qū)動(dòng)程序,事先必須在Windows中注冊O(shè)DBC數(shù)據(jù)源Class.forName(“oracle.jdbc.driver.OracleDriver”);//使用Oracle的JDBC驅(qū)動(dòng)程序Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);//使用SQLServer的JDBC驅(qū)動(dòng)程序Class.forName(“com.ibm.db2.jdbc.app.DB2Driver”);//使用DB2的JDBC驅(qū)動(dòng)程序Class.forName("org.gjt.mm.mysql.Driver");//使用MySql的JDBC驅(qū)動(dòng)程序2023/12/6JavaWeb開發(fā)技術(shù)184.2.2建立連接與數(shù)據(jù)庫建立連接的方法是調(diào)用DriverManager.getConnection(Stringurl,Stringuser,Stringpassword)方法。下述代碼顯示如何打開一個(gè)與位于URL為"jdbc:odbc:wombat"的數(shù)據(jù)庫的連接。所用的用戶標(biāo)識符為"oboy",口令為"12Java":

Stringurl="jdbc:odbc:wombat";

Connectioncon=DriverManager.getConnection(url,"oboy","12Java");2023/12/6JavaWeb開發(fā)技術(shù)19幾種數(shù)據(jù)庫的連接語句的形式Stringurl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";Stringuser="sa";Stringpassword=“”;Connectionconn=DriverManager.getConnection(url,user,password);Stringurl="jdbc:db2://localhost:5000/sample";Stringuser="admin";Stringpassword="";Connectionconn=DriverManager.getConnection(url,user,password);

Stringurl="jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=

true&characterEncoding=8859_1";Connectionconn=DriverManager.getConnection(url);Connectioncon=DriverManager.getConnection(“jdbc:oracle:oci8:@db”,“scott”,“tiger”);//使用Oracle的JDBCOCI驅(qū)動(dòng)程序Connectioncon=DriverManager.getConnection("jdbc:oracle:thin:@host:8080:db","scott",

"tiger");//使用Oracle的JDBCThin驅(qū)動(dòng)程序

sqlservermysqldb2oracle2023/12/6JavaWeb開發(fā)技術(shù)204.2.3發(fā)送SQL語句Statement對象用于將SQL語句發(fā)送到數(shù)據(jù)庫中。實(shí)際上有三種Statement對象:Statement:用于執(zhí)行不帶參數(shù)的簡單SQL語句;PreparedStatement(從Statement繼承):用于執(zhí)行帶或不帶IN參數(shù)的預(yù)編譯SQL語句;

CallableStatement(從PreparedStatement繼承):用于執(zhí)行數(shù)據(jù)庫存儲(chǔ)過程的調(diào)用。2023/12/6JavaWeb開發(fā)技術(shù)21.創(chuàng)建Statement對象Statement對象用Connection的方法createStatement()創(chuàng)建。createStatement()的語法形式為:

publicStatementcreateStatement()throwsSQLException如下列代碼段中所示:

Connectioncon=DriverManager.getConnection(url,"sunny","");

Statementstmt=con.createStatement();

2023/12/6JavaWeb開發(fā)技術(shù)22Statement接口中的主要方法ResultSetexecuteQuery(Stringsql)//執(zhí)行Statement對象,返回單個(gè)結(jié)果集intexecuteUpdate(Stringsql)//執(zhí)行Statement對象,返回本次操作影響的行數(shù)booleanexecute(Stringsql)//執(zhí)行Statement對象,返回布爾值voidclose()//關(guān)閉Statement對象intgetMaxFieldSize()//獲得字段最大長度voidsetMaxFieldSize(intmax)//設(shè)置字段最大長度intgetMaxRows()//獲得最大行數(shù)2023/12/6JavaWeb開發(fā)技術(shù)23Statement接口中的主要方法intgetMaxRows()//獲得最大行數(shù)voidsetMaxRows(intmax)//設(shè)置最大行數(shù)intgetQueryTimeout()//獲得查詢超時(shí)時(shí)間限voidsetQueryTimeout(intseconds)//設(shè)定查詢超時(shí)時(shí)間限java.sql.SQLWarninggetWarnings()//獲得與statement對象有關(guān)的警告ResultSetgetResultSet()//得到下一個(gè)結(jié)果集intgetUpdateCount()//得到修改的行數(shù)booleangetMoreResults()//檢測是否有多個(gè)結(jié)果集2023/12/6JavaWeb開發(fā)技術(shù)24.創(chuàng)建PreparedStatement對象如果需要多次執(zhí)行一個(gè)SQL語句,可以使用PreparedStatement對象。在創(chuàng)建PreparedStatement對象時(shí),通過傳遞不同參數(shù)值多次執(zhí)行PreparedStatement對象,可以得到多個(gè)不同的結(jié)果。PreparedStatement對象用Connection的prepareStatement()方法創(chuàng)建。如:

PreparedStatementpStmt=conn.preparedStatement(“insertintoemp(empno,ename)values(?,?)”);生成PreparedStatement對象的字符串中用“?”代表一個(gè)可以產(chǎn)生變化的IN型參數(shù)

2023/12/6JavaWeb開發(fā)技術(shù)25PreparedStatement接口的主要方法voidclearParameters()//清除PreparedStatement對象中的參數(shù)voidsetAsciiStream(intparameterIndex,java.io.InputStreamx,intlength)voidsetBinaryStream(intparameterIndex,java.io.InputStreamx,intlength)2023/12/6JavaWeb開發(fā)技術(shù)26PreparedStatement接口的主要方法(續(xù))voidsetBoolean(intparameterIndex,booleanx)voidsetByte(intparameterIndex,bytex)voidsetBytes(intparameterIndex,bytex[])

2023/12/6JavaWeb開發(fā)技術(shù)27PreparedStatement接口的主要方法(續(xù))voidsetDate(intparameterIndex,java.sql.Datex)voidsetDouble(intparameterIndex,doublex)voidsetFloat(intparameterIndex,floatx)2023/12/6JavaWeb開發(fā)技術(shù)28PreparedStatement接口的主要方法(續(xù))voidsetInt(intparameterIndex,intx)voidsetLong(intparameterIndex,longx)voidsetShort(intparameterIndex,shortx)2023/12/6JavaWeb開發(fā)技術(shù)29PreparedStatement接口的主要方法(續(xù))voidsetString(intparameterIndex,Stringx)voidsetTime(intparameterIndex,java.sql.Timex)voidsetTimestamp(intparameterIndex,java.sql.Timestampx)2023/12/6JavaWeb開發(fā)技術(shù)30PreparedStatement接口的主要方法(續(xù))voidsetUnicodeStream(intparameterIndex,java.io.InputStreamx,intlength)voidsetObject(intparameterIndex,Objectx)2023/12/6JavaWeb開發(fā)技術(shù)31PreparedStatement接口的主要方法(續(xù))ResultSetexecuteQuery()//執(zhí)行PreparedStatement對象,返回單結(jié)果集intexecuteUpdate()//執(zhí)行PreparedStatement對象,返回操作影響的行數(shù)booleanexecute()//執(zhí)行PreparedStatement對象,返回布爾值2023/12/6JavaWeb開發(fā)技術(shù)32PreparedStatement接口的方法說明其中的參數(shù)parameterIndex表示在構(gòu)造PreparedStatement對象時(shí)”?”從左到右出現(xiàn)的位置,從1開始。參數(shù)x表示給”?”設(shè)定的值。究竟用哪一個(gè)setXXX()方法,由”?”所表示的參數(shù)類型來決定。因?yàn)閤的類型是java.sql.Types中的類型,而參數(shù)的類型是某種數(shù)據(jù)庫中的數(shù)據(jù)類型,因此應(yīng)該保證它們的類型能夠相對應(yīng)。一般來說,它們有下面的對應(yīng)關(guān)系如下表所示:2023/12/6JavaWeb開發(fā)技術(shù)33數(shù)據(jù)庫數(shù)據(jù)類型和Java數(shù)據(jù)類型的對應(yīng)關(guān)系2023/12/6JavaWeb開發(fā)技術(shù)34數(shù)據(jù)庫數(shù)據(jù)類型和Java數(shù)據(jù)類型的對應(yīng)關(guān)系JDBC類型

Java類型DATALINK .URLDATE java.sql.DateTIME java.sql.TimeBIGINT longSMALLINT shortCHAR,VARCHAR,LONGVARCHAR String2023/12/6JavaWeb開發(fā)技術(shù)35數(shù)據(jù)庫數(shù)據(jù)類型和Java數(shù)據(jù)類型的對應(yīng)關(guān)系JDBC類型

Java類型JAVA_OBJECT javaclassNUMERIC java,math.BigDecimalINTEGER int,IntegerREAL float,FloatDOUBLE double,Double2023/12/6JavaWeb開發(fā)技術(shù)36數(shù)據(jù)庫數(shù)據(jù)類型和Java數(shù)據(jù)類型的對應(yīng)關(guān)系JDBC類型

Java類型BIT,BOOLEAN boolean,BooleanARRAY ArrayTINYINT byteBINARY,VARBINARY,LONGVARBINARY byte[]2023/12/6JavaWeb開發(fā)技術(shù)37使用PreparedStatement舉例………………st=con.prepareStatement("insertintoEMP(EMPNO,ENAME)values(?,?)");st.setInt(1,7777);st.setString(2,"Adam");………………2023/12/6JavaWeb開發(fā)技術(shù)38.創(chuàng)建CallableStatement對象CallableStatement對象為數(shù)據(jù)庫提供了一種以標(biāo)準(zhǔn)形式調(diào)用儲(chǔ)存過程的方法。CallableStatement由Connection對象的方法prepareCall()創(chuàng)建。其中的參數(shù)sql形式為:{[?=]call<storedprocedurename>[<parameter>,<parameter>...]}call前面的”?”表示過程返回結(jié)果參數(shù)。方括號指示其中的內(nèi)容是可選的。它們不是語法的必要部分。2023/12/6JavaWeb開發(fā)技術(shù)39如:CallableStatementcStmt=conn.prepareCall("{callshowEmployees(?,?)}");2023/12/6JavaWeb開發(fā)技術(shù)40CallableStatement接口中的主要方法bytegetByte(intparameterIndex)

//返回序號為parameterIndex參數(shù)的字節(jié)值,參數(shù)類型為JDBCTINYINTDategetDate(intparameterIndex)//返回序號為parameterIndex參數(shù)的值,參數(shù)值的類型為java.sql.Date2023/12/6JavaWeb開發(fā)技術(shù)41CallableStatement接口中的主要方法doublegetDouble(intparameterIndex)//返回序號為parameterIndex參數(shù)的double類型值floatgetFloat(intparameterIndex)//返回序號為parameterIndex參數(shù)的float類型值2023/12/6JavaWeb開發(fā)技術(shù)42CallableStatement接口中的主要方法intgetInt(intparameterIndex)//返回序號為parameterIndex參數(shù)的int類型值StringgetString(intparameterIndex)//返回序號為parameterIndex參數(shù)的String類型值2023/12/6JavaWeb開發(fā)技術(shù)43CallableStatement接口中的主要方法voidregisterOutParameter(intparameterIndex,intsqlType)//將序號為parameterIndex的參數(shù)注冊為JDBC中的數(shù)據(jù)類型voidsetDouble(StringparameterName,doublex)//設(shè)置參數(shù)parameterName為double類型值x2023/12/6JavaWeb開發(fā)技術(shù)44CallableStatement接口中的主要方法voidsetFloat(StringparameterName,floatx)//設(shè)置參數(shù)parameterName為float類型值xvoidsetInt(StringparameterName,intx)//設(shè)置參數(shù)parameterName為int類型值x2023/12/6JavaWeb開發(fā)技術(shù)45方法說明這里的parameterIndex、x和sqlType的意義同prepareStatement中的說明。2023/12/6JavaWeb開發(fā)技術(shù)46方法說明在創(chuàng)建CallableStatement對象前應(yīng)檢查所用的數(shù)據(jù)庫是否支持存儲(chǔ)過程,可以使用DatabaseMetaData對象的supportsStoredProcedures()方法,其語法形式為:publicbooleansupportsStoredProcedures()throwsSQLException2023/12/6JavaWeb開發(fā)技術(shù)47方法說明究竟”?”表示IN型參數(shù)還是表示OUT型參數(shù),取決于存儲(chǔ)過程定義。2023/12/6JavaWeb開發(fā)技術(shù)48方法說明使用CallableStatement對象的過程為:創(chuàng)建CallableStatement對象、使用registerOutParameter()方法注冊登記OUT參數(shù)、使用setXXX()方法設(shè)置IN參數(shù)實(shí)際值、使用execute()方法執(zhí)行該存儲(chǔ)過程、使用getXXX()方法取得OUT參數(shù)返回值。2023/12/6JavaWeb開發(fā)技術(shù)49使用CallableStatement舉例先建立一個(gè)存儲(chǔ)過程:

createorreplaceprocedureshow(nameoutvarchar2,numinnumber)asbeginSelectEnameintonamefromempwhereempno=num;end;2023/12/6JavaWeb開發(fā)技術(shù)50然后使用CallableStatement對象:

CallableStatementcs=con.prepareCall("{callshow(?,?)}");

cs.registerOutParameter(1,java.sql.Types.CHAR);

cs.setInt(2,7777);

cs.execute();

Stringstr=cs.getString(1);2023/12/6JavaWeb開發(fā)技術(shù)514.2.4使用Statement對象執(zhí)行語句創(chuàng)建了Statement對象,完成了SQL語句發(fā)送后,就要調(diào)用Statement對象中的方法執(zhí)行該SQL語句,進(jìn)而得到執(zhí)行的結(jié)果。Statement接口提供了三種執(zhí)行SQL語句的方法:executeQuery()、executeUpdate()和execute()。它們的語法形式分別為:2023/12/6JavaWeb開發(fā)技術(shù)52三種執(zhí)行SQL語句的方法executeQuery()返回語句執(zhí)行后的單個(gè)結(jié)果集的,所以通常用于SELECT語句executeUpdate()返回值是一個(gè)整數(shù),指示受影響的行數(shù)(即更新計(jì)數(shù))。execute()返回一個(gè)boolean值,execute()方法執(zhí)行后可以得到多個(gè)結(jié)果集、多個(gè)更新計(jì)數(shù)或二者的組合。本章后面將在單獨(dú)一節(jié)中對其進(jìn)行介紹。2023/12/6JavaWeb開發(fā)技術(shù)534.2.5ResultSet對象

.ResultSet對象.行和游標(biāo).?dāng)?shù)據(jù)類型和轉(zhuǎn)換.對非常大的值使用流.NULL結(jié)果值2023/12/6JavaWeb開發(fā)技術(shù)54.ResultSet對象ResultSet對象是executeQuery()方法的返回值,它被稱為結(jié)果集,它代表符合SQL語句條件的所有行,并且它通過一套getXXX方法(這些get方法可以訪問當(dāng)前行中的不同列)提供了對這些行中數(shù)據(jù)的訪問。2023/12/6JavaWeb開發(fā)技術(shù)55ResultSet里的數(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)。2023/12/6JavaWeb開發(fā)技術(shù)56.行和游標(biāo)ResultSet對象自動(dòng)維護(hù)指向當(dāng)前數(shù)據(jù)行的游標(biāo)。每調(diào)用一次next()方法,游標(biāo)向下移動(dòng)一行。在SQL中,結(jié)果集的游標(biāo)是有名字的。可通過調(diào)用ResultSet對象的getCursorName()獲得游標(biāo)名。2023/12/6JavaWeb開發(fā)技術(shù)57有時(shí)候需要結(jié)果集的游標(biāo)前后移動(dòng),這是可滾動(dòng)結(jié)果集。為了獲得滾動(dòng)結(jié)果集,必須先用下面方法得到一個(gè)Statement對象:Statementst=con.createStatement(inttype,intconcurrency);根據(jù)type和concurrency的取值,當(dāng)執(zhí)行ResultSetr=st.executeQuery()時(shí),會(huì)返回不同類型的結(jié)果集。結(jié)果集滾動(dòng)的方法很多,詳見課本本章節(jié)。2023/12/6JavaWeb開發(fā)技術(shù)58.?dāng)?shù)據(jù)類型和轉(zhuǎn)換對于getXXX()方法,JDBC驅(qū)動(dòng)程序試圖將基本數(shù)據(jù)轉(zhuǎn)換成指定Java類型,然后返回適合的Java值。例如,如果為getString()方法,而數(shù)據(jù)庫中數(shù)據(jù)類型為VARCHAR,則JDBC驅(qū)動(dòng)程序?qū)裋ARCHAR轉(zhuǎn)換成JavaString。GetString()的返回值將為JavaString對象。2023/12/6JavaWeb開發(fā)技術(shù)59再如,除了getBytes()和getBinaryStream()之外的任何getXXX()方法都可用來獲取LONGVARCHAR值,但是推薦根據(jù)返回的數(shù)據(jù)類型使用getAsciiStream()或getUnicodeStream()方法。方法getObject()將任何數(shù)據(jù)類型返回為JavaObject。2023/12/6JavaWeb開發(fā)技術(shù)60.對非常大的值使用流ResultSet可以獲取任意大的LONGVARBINARY或LONGVARCHAR數(shù)據(jù)。方法之一是通過讓ResultSet類返回java.io.InputStream來完成。JDBCAPI具有三個(gè)獲取流的方法,分別具有不同的返回值:

getBinaryStream():返回只提供數(shù)據(jù)庫字節(jié)而不進(jìn)行任何轉(zhuǎn)換的流。

getAsciiStream():返回提供單字節(jié)ASCII字符的流。

getUnicodeStream():返回提供雙字節(jié)Unicode字符的流。2023/12/6JavaWeb開發(fā)技術(shù)61.NULL結(jié)果值要確定給定結(jié)果值是否是JDBCNULL,必須先讀取該列,然后使用ResultSet的wasNull()方法檢查該次讀取是否返回JDBCNULL。2023/12/6JavaWeb開發(fā)技術(shù)62方法wasNull()將返回下列值之一(1)Javanull值:對于返回Java對象的getXXX()方法(例如getString()、getDate()、getTime()、getTimestamp()、getAsciiStream()、getUnicodeStream()、getBinaryStream()、getObject()等)。(2)0值:對于getByte()、getShort()、getInt()、getLong()、getFloat()和getDouble()。(3)false值:對于getBoolean()。2023/12/6JavaWeb開發(fā)技術(shù)63.可選結(jié)果集或多結(jié)果集但有些情況下,應(yīng)用程序在執(zhí)行語句之前不知道該語句是否返回結(jié)果集。此外,有些已存儲(chǔ)過程可能返回幾個(gè)不同的結(jié)果集和/或更新計(jì)數(shù)。JDBC提供了一種機(jī)制,允許應(yīng)用程序處理由結(jié)果集和更新計(jì)數(shù)組成的任意集合。2023/12/6JavaWeb開發(fā)技術(shù)64這種機(jī)制的原理是:首先調(diào)用一個(gè)完全通用的execute()方法,然后調(diào)用getResultSet()、getUpdateCount()和getMoreResults()三個(gè)方法。2023/12/6JavaWeb開發(fā)技術(shù)654.2.6關(guān)閉Statement對象和Connection對象作為一種好的編程風(fēng)格,應(yīng)在不需要Statement對象和Connection對象時(shí)顯式地關(guān)閉它們。關(guān)閉Statement對象和Connection對象的語法形式為:

publicvoidclose()throwsSQLException用戶不必關(guān)閉ResultSet。當(dāng)它的Statement關(guān)閉、重新執(zhí)行或用于從多結(jié)果序列中獲取下一個(gè)結(jié)果時(shí),該ResultSet將被自動(dòng)關(guān)閉。2023/12/6JavaWeb開發(fā)技術(shù)664.2.7事務(wù)事務(wù)是由具有“原子性”的一個(gè)或多個(gè)語句,即這些語句要么全部被執(zhí)行、完成并被提交,要么全部還原。當(dāng)調(diào)用連接的提交方法commit()或回滾方法rollback()時(shí),當(dāng)前事務(wù)即告結(jié)束,另一個(gè)事務(wù)隨即開始。2023/12/6JavaWeb開發(fā)技術(shù)67缺省情況下,新連接將處于自動(dòng)提交模式。也就是說,當(dāng)執(zhí)行完語句后,將自動(dòng)對那個(gè)語句調(diào)用commit()方法。這種情況下,一個(gè)事務(wù)只由一個(gè)語句組成。如果禁用自動(dòng)提交模式,事務(wù)將要等到commit()或rollback()方法被顯式調(diào)用時(shí)才結(jié)束,因此它將包括上一次調(diào)用commit()或rollback()方法以來所有執(zhí)行過的語句。對于第二種情況,事務(wù)中的所有語句將作為組來提交或還原。2023/12/6JavaWeb開發(fā)技術(shù)684.3在JSP中通過JDBC-ODBC橋使用數(shù)據(jù)庫無論訪問什么數(shù)據(jù)庫,使用JDBC-ODBC橋的方法完全一樣,即先注冊32位數(shù)據(jù)源,再按照上節(jié)中的步驟(注冊和加載驅(qū)動(dòng)器、與數(shù)據(jù)庫建立連接、發(fā)送SQL語句和處理結(jié)果)使用數(shù)據(jù)庫。本節(jié)圖4-9到圖4-16演示了如何注冊數(shù)據(jù)源的全過程。2023/12/6JavaWeb開發(fā)技術(shù)694.3.1查詢舉例.順序查詢(例example4_1.jsp,example4_2.jsp).隨機(jī)查詢(例example4_3.jsp,example4_4.jsp

).參數(shù)查詢(例example4_5.jsp,bynename.jsp,byscore.jsp

).排序查詢(例example4_6.jsp,byname1.jsp

)2023/12/6JavaWeb開發(fā)技術(shù)704.3.2更新記錄舉例例example4_8.jsp輸入學(xué)生姓名和各科成績,并將請求提交給newResult.jsp,該頁面實(shí)現(xiàn)更新記錄。運(yùn)行結(jié)果下圖所示。2023/12/6JavaWeb開發(fā)技術(shù)714.3.3添加記錄舉例例example4_9.jsp輸入一個(gè)學(xué)生的全部信息,并將請求提交給newDatabase.jsp,該頁面實(shí)現(xiàn)添加記錄。運(yùn)行結(jié)果下圖所示。2023/12/6JavaWeb開發(fā)技術(shù)724.3.4刪除記錄舉例例example4_10.jsp輸入被刪除學(xué)生的學(xué)號,并將請求提交給delete.jsp,該頁面實(shí)現(xiàn)刪除記錄。運(yùn)行結(jié)果下圖所示。2023/12/6JavaWeb開發(fā)技術(shù)734.3.5通過本地協(xié)議純Java方式訪問SQLServer數(shù)據(jù)庫首先從網(wǎng)上下載SQLServer驅(qū)動(dòng)程序,安裝在某個(gè)目錄下,。將安裝目錄\sqljdbc加入到環(huán)境變量classpath。下面例中,showByPage.jsp訪問SQLServer數(shù)據(jù)庫pubs中的表student,分頁顯示表中的所有記錄,運(yùn)行結(jié)果下圖所示。2023/12/6JavaWeb開發(fā)技術(shù)744.4在JSP中使用Excel電子表格(1)在控制面板中設(shè)置數(shù)據(jù)源,名字為star。為數(shù)據(jù)源選擇驅(qū)動(dòng)程序?yàn)镸icrosoft

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論