計算機軟件及應用第4章 JSP中使用數(shù)據(jù)庫_第1頁
計算機軟件及應用第4章 JSP中使用數(shù)據(jù)庫_第2頁
計算機軟件及應用第4章 JSP中使用數(shù)據(jù)庫_第3頁
計算機軟件及應用第4章 JSP中使用數(shù)據(jù)庫_第4頁
計算機軟件及應用第4章 JSP中使用數(shù)據(jù)庫_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

JDBC是Java數(shù)據(jù)庫連接〔JavaDataBaseConnectivity〕技術(shù)的簡稱它是由JavaSoft公司〔Sun公司負責開發(fā)Java產(chǎn)品的業(yè)務單位〕同數(shù)據(jù)庫及數(shù)據(jù)庫工具廠家一起建立的獨立于DBMS的機制。7/9/20233JDBC的組成JDBC是一種用于執(zhí)行SQL語句的JavaAPI。它由一組用Java編程語言編寫的類和接口組成。這個API由java.sql.*和javax.sql.*兩個包中的一些類和接口組成,它為數(shù)據(jù)庫開發(fā)人員提供了一個標準的API,使他們能夠用純JavaAPI來編寫數(shù)據(jù)庫應用程序。7/9/20234JDBC的優(yōu)點Java具有鞏固、平安、易于使用、易于理解和可從網(wǎng)絡(luò)上自動下載等優(yōu)點;可移植性強:不必為每一種數(shù)據(jù)庫編寫不同的調(diào)用程序,只需用JDBCAPI編寫一個程序就夠了;7/9/20235兩層模型和三層模型7/9/202364.1.3JDBC驅(qū)動程序的類型JDBC-ODBC橋加ODBC驅(qū)動本地API驅(qū)動JDBC網(wǎng)絡(luò)純Java驅(qū)動本地協(xié)議純Java驅(qū)動7/9/20237JDBC-ODBC橋加ODBC驅(qū)動ODBC(OpenDatabaseConnectivity,開放數(shù)據(jù)庫互連)是微軟公司開放效勞結(jié)構(gòu)中有關(guān)數(shù)據(jù)庫的一個組成局部它建立了一組標準,并提供了一組對數(shù)據(jù)庫訪問的標準API〔應用程序編程接口〕。這些API利用SQL來完成其大局部任務。ODBC本身也提供了對SQL語言的支持,用戶可以直接將SQL語句送給ODBC。7/9/20238JDBC-ODBC橋加ODBC驅(qū)動先把JDBC調(diào)用轉(zhuǎn)化為ODBC調(diào)用,再利用ODBC來與數(shù)據(jù)庫交互。現(xiàn)存許多可用的ODBC驅(qū)動程序與大量數(shù)據(jù)庫的交互,減少開發(fā)人員進行企業(yè)開發(fā)的麻煩。缺點:ODBC數(shù)據(jù)源需要提前在客戶端進行注冊,對于遠程的客戶端,操作極不方便,喪失平臺無關(guān)性。適用:企業(yè)網(wǎng)或用Java編寫的三層結(jié)構(gòu)的應用程序。7/9/20239JDBC-ODBC橋加ODBC驅(qū)動7/9/202310本地API驅(qū)動將標準的JDBC調(diào)用轉(zhuǎn)變?yōu)閷Ρ镜財?shù)據(jù)庫原始驅(qū)動程序調(diào)用,再通過數(shù)據(jù)庫的原始驅(qū)動程序與數(shù)據(jù)庫交互。比JDBC-ODBC橋具有更優(yōu)良的性能。缺點:喪失JDBC平臺無關(guān)性的好處,而且也需要安裝客戶端的數(shù)據(jù)庫原始驅(qū)動。7/9/202311本地API驅(qū)動7/9/202312JDBC網(wǎng)絡(luò)純Java驅(qū)動JDBC網(wǎng)絡(luò)驅(qū)動程序傳送JDBC命令到一個中間件上,這個中間件再將JDBC調(diào)用請求傳送到數(shù)據(jù)庫中,數(shù)據(jù)庫返回的結(jié)果集也通過這個中間件來返回到應用程序。優(yōu)點:與平臺無關(guān)的,并且不需要客戶端的安裝和管理,因此很適合于用做Internet的應用。缺點:必須處理Web所提出的平安性、通過防火墻的訪問等方面的額外要求。7/9/202313JDBC網(wǎng)絡(luò)純Java驅(qū)動7/9/202314本地協(xié)議純Java驅(qū)動直接訪問數(shù)據(jù)庫,中間不需要任何轉(zhuǎn)換或通過其它任何的中間件就能完成交互。將成為從JDBC訪問數(shù)據(jù)庫的首選方法,因為他們提供了Java的所有優(yōu)點。7/9/202315本地協(xié)議純Java驅(qū)動7/9/2023164.2使用JDBC要使用JDBC技術(shù)主要包括以下步驟:注冊和加載驅(qū)動器;與數(shù)據(jù)庫建立連接;發(fā)送SQL語句;處理結(jié)果;關(guān)閉連接;7/9/2023174.2.1注冊和加載驅(qū)動器加載JDBC驅(qū)動是通過調(diào)用方法(),下面列出常用的幾種數(shù)據(jù)庫驅(qū)動程序加載語句的形式:〞);//使用JDBC-ODBC橋驅(qū)動程序,事先必須在Windows中注冊O(shè)DBC數(shù)據(jù)源〞);//使用Oracle的JDBC驅(qū)動程序〞);//使用SQLServer的JDBC驅(qū)動程序Class.forName(“com.ibm.db2.jdbc.app.DB2Driver〞);//使用DB2的JDBC驅(qū)動程序");//使用MySql的JDBC驅(qū)動程序7/9/2023184.2.2建立連接與數(shù)據(jù)庫建立連接的方法是調(diào)用DriverManager.getConnection(Stringurl,Stringuser,Stringpassword)方法。下述代碼顯示如何翻開一個與位于URL為"jdbc:odbc:wombat"的數(shù)據(jù)庫的連接。所用的用戶標識符為"oboy",口令為"12Java":Stringurl="jdbc:odbc:wombat";

Connectioncon=DriverManager.getConnection(url,"oboy","12Java");7/9/202319幾種數(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ū)動程序Connectioncon=DriverManager.getConnection("jdbc:oracle:thin:@host:8080:db","scott",

"tiger");//使用Oracle的JDBCThin驅(qū)動程序sqlservermysqldb2oracle7/9/2023204.2.3發(fā)送SQL語句Statement對象用于將SQL語句發(fā)送到數(shù)據(jù)庫中。實際上有三種Statement對象:Statement:用于執(zhí)行不帶參數(shù)的簡單SQL語句;PreparedStatement〔從Statement繼承〕:用于執(zhí)行帶或不帶IN參數(shù)的預編譯SQL語句;CallableStatement〔從PreparedStatement繼承〕:用于執(zhí)行數(shù)據(jù)庫存儲過程的調(diào)用。7/9/202321.創(chuàng)立Statement對象Statement對象用Connection的方法createStatement()創(chuàng)立。createStatement()的語法形式為:publicStatementcreateStatement()throwsSQLException如以下代碼段中所示:Connectioncon=DriverManager.getConnection(url,"sunny","");

Statementstmt=con.createStatement();7/9/202322Statement接口中的主要方法ResultSetexecuteQuery(Stringsql)//執(zhí)行Statement對象,返回單個結(jié)果集intexecuteUpdate(Stringsql)//執(zhí)行Statement對象,返回本次操作影響的行數(shù)booleanexecute(Stringsql)//執(zhí)行Statement對象,返回布爾值voidclose()//關(guān)閉Statement對象intgetMaxFieldSize()//獲得字段最大長度voidsetMaxFieldSize(intmax)//設(shè)置字段最大長度intgetMaxRows()//獲得最大行數(shù)7/9/202323Statement接口中的主要方法intgetMaxRows()//獲得最大行數(shù)voidsetMaxRows(intmax)//設(shè)置最大行數(shù)intgetQueryTimeout()//獲得查詢超時時間限voidsetQueryTimeout(intseconds)//設(shè)定查詢超時時間限getWarnings()//獲得與statement對象有關(guān)的警告ResultSetgetResultSet()//得到下一個結(jié)果集intgetUpdateCount()//得到修改的行數(shù)booleangetMoreResults()//檢測是否有多個結(jié)果集7/9/202324.創(chuàng)立PreparedStatement對象如果需要屢次執(zhí)行一個SQL語句,可以使用PreparedStatement對象。在創(chuàng)立PreparedStatement對象時,通過傳遞不同參數(shù)值屢次執(zhí)行PreparedStatement對象,可以得到多個不同的結(jié)果。PreparedStatement對象用Connection的prepareStatement()方法創(chuàng)立。如:PreparedStatementpStmt=conn.preparedStatement(“insertintoemp(empno,ename)values(?,?)〞);生成PreparedStatement對象的字符串中用“?〞代表一個可以產(chǎn)生變化的IN型參數(shù)7/9/202325PreparedStatement接口的主要方法voidclearParameters()//去除PreparedStatement對象中的參數(shù)voidsetAsciiStream(intparameterIndex,x,intlength)voidsetBinaryStream(intparameterIndex,x,intlength)7/9/202326PreparedStatement接口的主要方法〔續(xù)〕voidsetBoolean(intparameterIndex,booleanx)voidsetByte(intparameterIndex,bytex)voidsetBytes(intparameterIndex,bytex[])

7/9/202327PreparedStatement接口的主要方法〔續(xù)〕voidsetDate(intparameterIndex,x)voidsetDouble(intparameterIndex,doublex)voidsetFloat(intparameterIndex,floatx)7/9/202328PreparedStatement接口的主要方法〔續(xù)〕voidsetInt(intparameterIndex,intx)voidsetLong(intparameterIndex,longx)voidsetShort(intparameterIndex,shortx)7/9/202329PreparedStatement接口的主要方法〔續(xù)〕voidsetString(intparameterIndex,Stringx)voidsetTime(intparameterIndex,x)voidsetTimestamp(intparameterIndex,x)7/9/202330PreparedStatement接口的主要方法〔續(xù)〕voidsetUnicodeStream(intparameterIndex,x,intlength)voidsetObject(intparameterIndex,Objectx)7/9/202331PreparedStatement接口的主要方法〔續(xù)〕ResultSetexecuteQuery()//執(zhí)行PreparedStatement對象,返回單結(jié)果集intexecuteUpdate()//執(zhí)行PreparedStatement對象,返回操作影響的行數(shù)booleanexecute()//執(zhí)行PreparedStatement對象,返回布爾值7/9/202332PreparedStatement接口的方法說明其中的參數(shù)parameterIndex表示在構(gòu)造PreparedStatement對象時〞?〞從左到右出現(xiàn)的位置,從1開始。參數(shù)x表示給〞?〞設(shè)定的值。究竟用哪一個setXXX()方法,由〞?〞所表示的參數(shù)類型來決定。因為x的類型是中的類型,而參數(shù)的類型是某種數(shù)據(jù)庫中的數(shù)據(jù)類型,因此應該保證它們的類型能夠相對應。一般來說,它們有下面的對應關(guān)系如下表所示:7/9/202333數(shù)據(jù)庫數(shù)據(jù)類型和Java數(shù)據(jù)類型的對應關(guān)系7/9/202334數(shù)據(jù)庫數(shù)據(jù)類型和Java數(shù)據(jù)類型的對應關(guān)系JDBC類型 Java類型DATALINK

DATE

TIME

BIGINT longSMALLINT shortCHAR,VARCHAR,LONGVARCHAR String7/9/202335數(shù)據(jù)庫數(shù)據(jù)類型和Java數(shù)據(jù)類型的對應關(guān)系JDBC類型 Java類型JAVA_OBJECT javaclassNUMERIC java,math.BigDecimalINTEGER int,IntegerREAL float,FloatDOUBLE double,Double7/9/202336數(shù)據(jù)庫數(shù)據(jù)類型和Java數(shù)據(jù)類型的對應關(guān)系JDBC類型 Java類型BIT,BOOLEAN boolean,BooleanARRAY ArrayTINYINT byteBINARY,VARBINARY,LONGVARBINARY byte[]7/9/202337使用PreparedStatement舉例………………st=con.prepareStatement("insertintoEMP(EMPNO,ENAME)values(?,?)");st.setInt(1,7777);st.setString(2,"Adam");………………7/9/202338.創(chuàng)立CallableStatement對象CallableStatement對象為數(shù)據(jù)庫提供了一種以標準形式調(diào)用儲存過程的方法。CallableStatement由Connection對象的方法prepareCall()創(chuàng)立。其中的參數(shù)sql形式為:{[?=]call<storedprocedurename>[<parameter>,<parameter>...]}call前面的〞?〞表示過程返回結(jié)果參數(shù)。方括號指示其中的內(nèi)容是可選的。它們不是語法的必要局部。7/9/202339如:CallableStatementcStmt=conn.prepareCall("{callshowEmployees(?,?)}");7/9/202340CallableStatement接口中的主要方法bytegetByte(intparameterIndex)

//返回序號為parameterIndex參數(shù)的字節(jié)值,參數(shù)類型為JDBCTINYINTDategetDate(intparameterIndex)//返回序號為parameterIndex參數(shù)的值,參數(shù)值的類型為7/9/202341CallableStatement接口中的主要方法doublegetDouble(intparameterIndex)//返回序號為parameterIndex參數(shù)的double類型值floatgetFloat(intparameterIndex)//返回序號為parameterIndex參數(shù)的float類型值7/9/202342CallableStatement接口中的主要方法intgetInt(intparameterIndex)//返回序號為parameterIndex參數(shù)的int類型值StringgetString(intparameterIndex)//返回序號為parameterIndex參數(shù)的String類型值7/9/202343CallableStatement接口中的主要方法voidregisterOutParameter(intparameterIndex,intsqlType)//將序號為parameterIndex的參數(shù)注冊為JDBC中的數(shù)據(jù)類型voidsetDouble(StringparameterName,doublex)//設(shè)置參數(shù)parameterName為double類型值x7/9/202344CallableStatement接口中的主要方法voidsetFloat(StringparameterName,floatx)//設(shè)置參數(shù)parameterName為float類型值xvoidsetInt(StringparameterName,intx)//設(shè)置參數(shù)parameterName為int類型值x7/9/202345方法說明這里的parameterIndex、x和sqlType的意義同prepareStatement中的說明。7/9/202346方法說明在創(chuàng)立CallableStatement對象前應檢查所用的數(shù)據(jù)庫是否支持存儲過程,可以使用DatabaseMetaData對象的supportsStoredProcedures()方法,其語法形式為:publicbooleansupportsStoredProcedures()throwsSQLException7/9/202347方法說明究竟〞?〞表示IN型參數(shù)還是表示OUT型參數(shù),取決于存儲過程定義。7/9/202348方法說明使用CallableStatement對象的過程為:創(chuàng)立CallableStatement對象、使用registerOutParameter()方法注冊登記OUT參數(shù)、使用setXXX()方法設(shè)置IN參數(shù)實際值、使用execute()方法執(zhí)行該存儲過程、使用getXXX()方法取得OUT參數(shù)返回值。7/9/202349使用CallableStatement舉例先建立一個存儲過程:createorreplaceprocedureshow(nameoutvarchar2,numinnumber)asbeginSelectEnameintonamefromempwhereempno=num;end;7/9/202350然后使用CallableStatement對象:CallableStatementcs=con.prepareCall("{callshow(?,?)}");cs.registerOutParameter(1,java.sql.Types.CHAR);cs.setInt(2,7777);cs.execute();Stringstr=cs.getString(1);7/9/202351使用Statement對象執(zhí)行語句創(chuàng)立了Statement對象,完成了SQL語句發(fā)送后,就要調(diào)用Statement對象中的方法執(zhí)行該SQL語句,進而得到執(zhí)行的結(jié)果。Statement接口提供了三種執(zhí)行SQL語句的方法:executeQuery()、executeUpdate()和execute()。它們的語法形式分別為:7/9/202352三種執(zhí)行SQL語句的方法executeQuery()返回語句執(zhí)行后的單個結(jié)果集的,所以通常用于SELECT語句executeUpdate()返回值是一個整數(shù),指示受影響的行數(shù)〔即更新計數(shù)〕。execute()返回一個boolean值,execute()方法執(zhí)行后可以得到多個結(jié)果集、多個更新計數(shù)或二者的組合。本章后面將在單獨一節(jié)中對其進行介紹。7/9/2023534.2.5ResultSet對象

.ResultSet對象.行和游標.數(shù)據(jù)類型和轉(zhuǎn)換.對非常大的值使用流.NULL結(jié)果值7/9/202354.ResultSet對象ResultSet對象是executeQuery()方法的返回值,它被稱為結(jié)果集,它代表符合SQL語句條件的所有行,并且它通過一套getXXX方法〔這些get方法可以訪問當前行中的不同列〕提供了對這些行中數(shù)據(jù)的訪問。7/9/202355ResultSet里的數(shù)據(jù)一行一行排列,每行有多個字段,并且有一個記錄指針,指針所指的數(shù)據(jù)行叫做當前數(shù)據(jù)行,我們只能來操作當前的數(shù)據(jù)行。我們?nèi)绻胍〉媚骋粭l記錄,就要使用ResultSet的next()方法,如果我們想要得到ResultSet里的所有記錄,就應該使用while循環(huán)。7/9/202356.行和游標ResultSet對象自動維護指向當前數(shù)據(jù)行的游標。每調(diào)用一次next()方法,游標向下移動一行。在SQL中,結(jié)果集的游標是有名字的??赏ㄟ^調(diào)用ResultSet對象的getCursorName()獲得游標名。7/9/202357有時候需要結(jié)果集的游標前后移動,這是可滾動結(jié)果集。為了獲得滾動結(jié)果集,必須先用下面方法得到一個Statement對象:Statementst=con.createStatement(inttype,intconcurrency);根據(jù)type和concurrency的取值,當執(zhí)行ResultSetr=st.executeQuery()時,會返回不同類型的結(jié)果集。結(jié)果集滾動的方法很多,詳見課本本章節(jié)。7/9/202358.數(shù)據(jù)類型和轉(zhuǎn)換對于getXXX()方法,JDBC驅(qū)動程序試圖將根本數(shù)據(jù)轉(zhuǎn)換成指定Java類型,然后返回適合的Java值。例如,如果為getString()方法,而數(shù)據(jù)庫中數(shù)據(jù)類型為VARCHAR,那么JDBC驅(qū)動程序?qū)裋ARCHAR轉(zhuǎn)換成JavaString。GetString()的返回值將為JavaString對象。7/9/202359再如,除了getBytes()和getBinaryStream()之外的任何getXXX()方法都可用來獲取LONGVARCHAR值,但是推薦根據(jù)返回的數(shù)據(jù)類型使用getAsciiStream()或getUnicodeStream()方法。方法getObject()將任何數(shù)據(jù)類型返回為JavaObject。7/9/202360.對非常大的值使用流ResultSet可以獲取任意大的LONGVARBINARY或LONGVARCHAR數(shù)據(jù)。方法之一是通過讓ResultSet類返回來完成。JDBCAPI具有三個獲取流的方法,分別具有不同的返回值:getBinaryStream():返回只提供數(shù)據(jù)庫字節(jié)而不進行任何轉(zhuǎn)換的流。

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

getUnicodeStream():返回提供雙字節(jié)Unicode字符的流。7/9/202361.NULL結(jié)果值要確定給定結(jié)果值是否是JDBCNULL,必須先讀取該列,然后使用ResultSet的wasNull()方法檢查該次讀取是否返回JDBCNULL。7/9/202362方法wasNull()將返回以下值之一〔1〕Javanull值:對于返回Java對象的getXXX()方法〔例如getString()、getDate()、getTime()、getTimestamp()、getAsciiStream()、getUnicodeStream()、getBinaryStream()、getObject()等〕?!?〕0值:對于getByte()、getShort()、getInt()、getLong()、getFloat()和getDouble()。〔3〕false值:對于getBoolean()。7/9/202363.可選結(jié)果集或多結(jié)果集但有些情況下,應用程序在執(zhí)行語句之前不知道該語句是否返回結(jié)果集。此外,有些已存儲過程可能返回幾個不同的結(jié)果集和/或更新計數(shù)。JDBC提供了一種機制,允許應用程序處理由結(jié)果集和更新計數(shù)組成的任意集合。7/9/202364這種機制的原理是:首先調(diào)用一個完全通用的execute()方法,然后調(diào)用getResultSet()、getUpdateCount()和getMoreResults()三個方法。7/9/2023654.2.6關(guān)閉Statement對象和Connection對象作為一種好的編程風格,應在不需要Statement對象和Connection對象時顯式地關(guān)閉它們。關(guān)閉Statement對象和Connection對象的語法形式為:publicvoidclose()throwsSQLException用戶不必關(guān)閉ResultSet。當它的Statement關(guān)閉、重新執(zhí)行或用于從多結(jié)果序列中獲取下一個結(jié)果時,該ResultSet將被自動關(guān)閉。7/9/2023664.2.7事務事務是由具有“原子性〞的一個或多個語句,即這些語句要么全部被執(zhí)行、完成并被提交,要么全部復原。當調(diào)用連接的提交方法commit()或回滾方法rollback()時,當前事務即告結(jié)束,另一個事務隨即開始。7/9/202367缺省情況下,新連接將處于自動提交模式。也就是說,當執(zhí)行完語句后,將自動對那個語句調(diào)用commit()方法。這種情況下,一個事務只由一個語句組成。如果禁用自動提交模式,事務將要等到commit()或rollback()方法被顯式調(diào)用時才結(jié)束,因此它將包括上一次調(diào)用commit()或rollback()方法以來所有執(zhí)行過的語句。對于第二種情況,事務中的所有語句將作為組來提交或復原。7/9/2023684.3在JSP中通過JDBC-ODBC橋使用數(shù)據(jù)庫無論訪問什么數(shù)據(jù)庫,使用JDBC-ODBC橋的方法完全一樣,即先注冊32位數(shù)據(jù)源,再按照上節(jié)中的步驟〔注冊和加載驅(qū)動器、與數(shù)據(jù)庫建立連接、發(fā)送SQL語句和處理結(jié)果〕使用數(shù)據(jù)庫。本節(jié)圖4-9到圖4-16演示了如何注冊數(shù)據(jù)源的全過程。7/9/2023694.3.1查詢舉例.順序查詢〔例example4_1.jsp,example4_2.jsp〕.隨機查詢〔例example4_3.jsp,example4_4.jsp〕.參數(shù)查詢〔例example4_5.jsp,bynename.jsp,byscore.jsp〕.排序查詢〔例example4_6.jsp,byname1.jsp〕7/9/2023704.3.2更新記錄舉例例example4_8.jsp輸入學生姓名和各科成績,并將請求提交給newResult.jsp,該頁面實現(xiàn)更新記錄。運行結(jié)果以下圖所示。7/9/2023714.3.3添加記錄舉例例example4_9.jsp輸入一個學生的全部信息,并將請求提交給newDatabase.jsp,該頁面實現(xiàn)添加記錄。運行結(jié)果以下圖所示。7/9/2023724.3.4刪除記錄舉例例example4_10.jsp輸入被刪除學生的學號,并將請求提交給delete.jsp,該頁面實現(xiàn)刪除記錄。運行結(jié)果以下圖所示。7/9/2023734.3.5通過本地協(xié)議純Java方式訪問SQLServer數(shù)據(jù)庫首先從網(wǎng)上下載SQLServer驅(qū)動程序,安裝在某個目錄下,。將安裝目錄\sqljdbc參加到環(huán)境變量classpath。下面例中,showByPage.jsp訪問SQLServer數(shù)據(jù)庫pubs中的表student,分頁顯示表中的所有記錄,運行結(jié)果以下圖所示。7/9/2023744.4在JSP中使用Excel電子表格〔1〕在控制面板中設(shè)置數(shù)據(jù)源,名字為star。為數(shù)據(jù)源選擇驅(qū)動程序為MicrosoftExcelDriver。〔2〕選擇一

溫馨提示

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

最新文檔

評論

0/150

提交評論