Java網(wǎng)絡(luò)編程原理與JSP-Web開發(fā)核心技術(shù)-09第九章-JSP數(shù)據(jù)庫編程技術(shù)新課件_第1頁
Java網(wǎng)絡(luò)編程原理與JSP-Web開發(fā)核心技術(shù)-09第九章-JSP數(shù)據(jù)庫編程技術(shù)新課件_第2頁
Java網(wǎng)絡(luò)編程原理與JSP-Web開發(fā)核心技術(shù)-09第九章-JSP數(shù)據(jù)庫編程技術(shù)新課件_第3頁
Java網(wǎng)絡(luò)編程原理與JSP-Web開發(fā)核心技術(shù)-09第九章-JSP數(shù)據(jù)庫編程技術(shù)新課件_第4頁
Java網(wǎng)絡(luò)編程原理與JSP-Web開發(fā)核心技術(shù)-09第九章-JSP數(shù)據(jù)庫編程技術(shù)新課件_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Java網(wǎng)絡(luò)編程原理與JSPWeb核心開發(fā)技術(shù)

1Java網(wǎng)絡(luò)編程原理與JSPWeb核心開發(fā)技術(shù)1第九章

JSP數(shù)據(jù)庫編程技術(shù)9.1JDBC概述9.2

MySQL數(shù)據(jù)庫的安裝與配置9.3連接數(shù)據(jù)庫9.4 數(shù)據(jù)庫高級操作9.5數(shù)據(jù)庫連接池技術(shù)9.6應(yīng)用實例2第九章

JSP數(shù)據(jù)庫編程技術(shù)9.1JDBC概述29.1 JDBC概述9.1.1JDBC工作原理

9.1.2JDBCAPI簡介

39.1 JDBC概述9.1.1JDBC工作原理39.1 JDBC概述9.1.1JDBC工作原理

Java程序通過JDBCAPI來訪問數(shù)據(jù)庫。JDBCAPI主要位于JDK的java.sql包中,它為Java程序訪問數(shù)據(jù)庫提供了統(tǒng)一的編程接口,但對接口的具體實現(xiàn)需要數(shù)據(jù)庫的設(shè)計者完成,JDBC的驅(qū)動器封裝了與各種數(shù)據(jù)庫服務(wù)器通信的細節(jié)。實現(xiàn)調(diào)用Java程序JDBCAPI各種數(shù)據(jù)庫管理系統(tǒng)連接JDBC驅(qū)動器49.1 JDBC概述9.1.1JDBC工作原理實現(xiàn)調(diào)9.1 JDBC概述9.1.1JDBC工作原理

java.sql.DriverManager類,已經(jīng)由Sun公司實現(xiàn),該類負責(zé)管理注冊到系統(tǒng)中的JDBC驅(qū)動器,并能通過驅(qū)動器實現(xiàn)與數(shù)據(jù)庫服務(wù)器建立連接。java.sql.Driver接口,由Sun公司制定,為數(shù)據(jù)庫服務(wù)提供商提供了開發(fā)JDBC驅(qū)動器的統(tǒng)一接口。JDBC驅(qū)動器實現(xiàn)了java.sql.Driver接口,由數(shù)據(jù)庫供應(yīng)商創(chuàng)建,負責(zé)與特定的數(shù)據(jù)庫建立連接,處理通信細節(jié),Java程序要訪問數(shù)據(jù)庫,必須先獲得相應(yīng)的JDBC驅(qū)動器,并將其注冊到JDBC驅(qū)動器管理器中。JDBC驅(qū)動器可分為以下四類:JDBC-ODBC驅(qū)動器JDBC本地代碼驅(qū)動器JDBC網(wǎng)絡(luò)驅(qū)動器純JDBC驅(qū)動器59.1 JDBC概述9.1.1JDBC工作原理59.1 JDBC概述9.1.2JDBCAPI簡介JDBCAPI位于java.sql包中,使用JDBC的程序要導(dǎo)入該包。1.Driver接口由Sun公司制定,為數(shù)據(jù)庫服務(wù)提供商提供了開發(fā)JDBC驅(qū)動器的統(tǒng)一接口,所有JDBC驅(qū)動器都必須實現(xiàn)該接口。使用JDBC驅(qū)動器前,要將其對應(yīng)的類庫設(shè)置到classpath中,然后在程序中通過Class.forName()方法對其加載。如果使用的是JDBC-ODBC的方法,則使用如下的語句:Class.forName(“sun.jdbc.odbc.Jdbc.OdbcDriver”);如果使用的是JDBC,則使用以下的語句:Class.forName(“driver_class_name”);例如:Class.forName(“com.Microsoft.jdbc.sqlserver.SQLServerDriver”);//SQLServerClass.forName(“org.gjt.mm.mysql.Driver”);//MySQLClass.forName(“Oracle.jdbc.driver.OracleDriver”);//Oracle

69.1 JDBC概述9.1.2JDBCAPI簡介69.1 JDBC概述9.1.2JDBCAPI簡介2.DriverManager類

該類負責(zé)管理注冊到系統(tǒng)中的JDBC驅(qū)動器,已經(jīng)由Sun公司實現(xiàn),并能通過特定驅(qū)動器實現(xiàn)與數(shù)據(jù)庫服務(wù)器建立連接。該類主要定義以下幾個方法:registerDriver(Driverdriver):用來在DriverManager類中注冊JDBC驅(qū)動器。getConnection():可以創(chuàng)建一個數(shù)據(jù)庫連接對象。例如:DriverManager.getConnection(“驅(qū)動類型:數(shù)據(jù)源”,”用戶名”,”密碼”)當(dāng)驅(qū)動類型是JDBC-ODBC時用JDBC:ODBC,如果是JDBC時就用JDBC。不同數(shù)據(jù)庫系統(tǒng)對應(yīng)的數(shù)據(jù)源格式有所不同:DriverManager.getConnection(“jdbc:odbc:DSname”,”用戶名”,”密碼”);//JDBC-ODBCDriverManager.getConnection(“jdbc:microsoft:sqlserver://主機:端口號;DatabaseName=數(shù)據(jù)庫名”,“用戶名”,“密碼”);//SQLServerDriverManager.getConnection(“jdbc:mysql://主機:端口號/數(shù)據(jù)庫名”,“用戶名”,“密碼”);//MySQLDriverManager.getConnection(“jdbc:Oracle:thin:@主機:端口號:數(shù)據(jù)庫名”,“用戶名”,“密碼”);//Oracle79.1 JDBC概述9.1.2JDBCAPI簡介79.1 JDBC概述9.1.2JDBCAPI簡介3.Connection接口

該接口代表與一個特定數(shù)據(jù)庫的會話,即數(shù)據(jù)庫的連接。通過該接口可以向數(shù)據(jù)庫發(fā)送SQL語句并取得返回結(jié)果,該接口主要定義以下幾個方法:close()//用來關(guān)閉數(shù)據(jù)庫連接,立即釋放JDBC資源。getAutoCommit()//用于獲得當(dāng)前自動提交狀態(tài)。默認(rèn)情況下,每執(zhí)行一個SQL語句后,Connection會自動地提交更改。如果禁止自動提交,必須進行顯式的提交。setAutoCommit()//用于設(shè)置連接是否處于自動提交狀態(tài)。commit()//提交上一次操作后的更改,使之成為永久的更改,只有當(dāng)禁止自動提交時可以使用該方法。rollback()//回滾從上一次操作后的所有更改。createStatement()//用于創(chuàng)建SQL語句對象。返回的對象可用于執(zhí)行基本的SQL語句,可以帶一些參數(shù),例如:Statementstatement=connection.createStatement(intType,intconcurrency);89.1 JDBC概述9.1.2JDBCAPI簡介89.1 JDBC概述9.1.2JDBCAPI簡介4.Statement接口該接口提供了用于執(zhí)行一條靜態(tài)的SQL語句并獲取它產(chǎn)生的結(jié)果的方法,任何時候每條語句僅能打開一個ResultSet,ResultSet是語句執(zhí)行后返回的記錄結(jié)果集。該接口定義的常用方法如下:execute(Stringsql)//執(zhí)行各種SQL語句。返回值布爾型,如果返回true,則表明有結(jié)果集,可通過getResultSet()獲得結(jié)果集。executeQuery()//執(zhí)行一條返回單個結(jié)果集的select語句,返回值是ResultSet類型。executeUpdate()//執(zhí)行SQL的INSERT、UPDATE和DELETE語句。返回受語句影響的記錄行數(shù)。getResultSet()//獲得當(dāng)前的ResultSet結(jié)果。getUpdateCount()//獲得受語句影響的記錄行數(shù),返回值是int型數(shù)據(jù),如果結(jié)果是一個ResultSet或沒有其他結(jié)果,返回-1。close()//關(guān)閉Statement對象,立即釋放相應(yīng)JDBC資源,同時關(guān)閉與之相關(guān)聯(lián)的ResultSet對象。99.1 JDBC概述9.1.2JDBCAPI簡介99.1 JDBC概述9.1.2JDBCAPI簡介5.PreparedStatement它從Statement繼承而來,該接口提供封裝一條預(yù)編譯的SQL語句的功能,可用于高效地多次執(zhí)行該語句,該接口定義的常用方法如下:setBoolean()//設(shè)置布爾型參數(shù)值。setByte()//設(shè)置字節(jié)型參數(shù)值。setBytes()//設(shè)置字節(jié)數(shù)組型參數(shù)值。setDate()//設(shè)置日期型參數(shù)值。setDouble()//設(shè)置雙精度型參數(shù)值。setFloat()//設(shè)置單精度型參數(shù)值。setInt()//設(shè)置整型參數(shù)值。setShort()//設(shè)置短整型參數(shù)值。setString()//設(shè)置字符串型參數(shù)值。clearParameters()//立即清除當(dāng)前參數(shù)值內(nèi)容。

109.1 JDBC概述9.1.2JDBCAPI簡介109.1 JDBC概述9.1.2JDBCAPI簡介6.CallableStatement繼承自PreparedStatement,用來執(zhí)行數(shù)據(jù)庫中的存儲過程。JDBC允許以所有RDBMS的標(biāo)準(zhǔn)方式調(diào)用存儲過程,具體語法格式如下:?=call[?,?…]//包含結(jié)果參數(shù)的格式call[?,?…]//不包含結(jié)果參數(shù)的格式可用PreparedStatement接口的set方法設(shè)置IN參數(shù)值,所有OUT參數(shù)的類型必須在執(zhí)行該存儲過程之前注冊,執(zhí)行后的參數(shù)值用該接口提供的get方法可以獲得,該接口定義的常用方法如下:getBoolean()//獲得一個BIT參數(shù)的值,作為一個boolean值返回。getByte()//獲得一個TINYINT參數(shù)的值,作為一個byte值返回。getBytes()//獲得一個BINARY或VARBINARY參數(shù)的值,作為一個byte[]值返回。getDate()//獲得一個Date參數(shù)的值,作為一個Date值返回。getDouble()//獲得一個double參數(shù)的值,作為一個double值返回。getFloat()//獲得一個float參數(shù)的值,作為一個float值返回。getInt()//獲得一個integer參數(shù)的值,作為一個int值返回。getLong()//獲得一個float參數(shù)的值,作為一個long值返回。getShort()//獲得一個smallint參數(shù)的值,作為一個short值返回。getString()//獲得一個CHAR、VARCHAR或LONGVARCHAR參數(shù)的值,作為一個String值返回。119.1 JDBC概述9.1.2JDBCAPI簡介119.1 JDBC概述9.1.2JDBCAPI簡介7.ResultSet接口ResultSet接口用來接收執(zhí)行SQL查詢語句后得到的記錄集,next()把當(dāng)前記錄指針往下移動一行時,可用get()方法可得到記錄中不同列的數(shù)據(jù),getXXXX()方法獲取當(dāng)前行的列值,可通過使用列的索引或名字來獲取值。通常使用列索引會更有效,列索引從1開始。getXXXX()方法中的列名是大小寫敏感的。當(dāng)使用列名執(zhí)行一個getXXXX()方法時,如果幾個列有同樣的名字,則返回第一個匹配的列。,該接口定義的常用方法如下:first()//當(dāng)記錄指針可以上下移動查詢時移動當(dāng)前記錄指針到第一行。last()//當(dāng)記錄指針可以上下移動查詢時移動當(dāng)前記錄指針到最后一行。next()//把當(dāng)前記錄指針往下移一行。ResultSet初始定位于它的第一行之前。如果當(dāng)前行有效,返回true;如果沒有更多的行則返回false。previous()//當(dāng)記錄指針可以上下移動查詢時把當(dāng)前記錄指針向上移動一行。當(dāng)移動到第一行之前時返回false,否則返回true。isFirst()//當(dāng)記錄指針可以上下移動查詢時判斷當(dāng)前記錄指針是否在第一行。isLast()//當(dāng)記錄指針可以上下移動查詢時判斷當(dāng)前記錄指針是否在最后一行。getBoolean()//把當(dāng)前行的列值作為一個boolean值獲取,如果列值為空則返回false。getInt()//把當(dāng)前行的列值作為一個int值獲取,如果列值為空則返回0。getLong()//把當(dāng)前行的列值作為一個long值獲取,如果列值為空則返回0。getShort()//把當(dāng)前行的列值作為一個short值獲取,如果列值為空則返回0。getString()//把當(dāng)前行的列值作為一個String值獲取,如果列值為空則返回null。getRow()//當(dāng)記錄指針可以上下移動查詢時返回當(dāng)前記錄指針?biāo)赶虻男刑枺刑枏?開始,如果記錄集中沒有記錄則返回0。close()//立即釋放該語句的數(shù)據(jù)庫和JDBC資源。

129.1 JDBC概述9.1.2JDBCAPI簡介129.2 MySQL數(shù)據(jù)庫的安裝與配置

9.2.1安裝MySQL5.0

9.2.2使用MySQL5.0

139.2 MySQL數(shù)據(jù)庫的安裝與配置9.2.1安裝M9.2 MySQL數(shù)據(jù)庫的安裝與配置

9.2.1安裝MySQL5.0

MySQL是一個多用戶、多線程的強壯的關(guān)系數(shù)據(jù)庫服務(wù)器,MySQL的官方網(wǎng)站提供了免費安裝軟件MySQL5.0的安裝比較簡單,首先從MySQL的官方網(wǎng)站下載軟件,雙擊安裝程序,出現(xiàn)安裝界面,接下來:選擇安裝類型,確定安裝目錄,注冊賬號,選擇配置方式。149.2 MySQL數(shù)據(jù)庫的安裝與配置9.2.1安裝M9.2 MySQL數(shù)據(jù)庫的安裝與配置

9.2.2使用MySQL5.0MySQL在安裝根目錄的bin子目錄中提供了mysql.exe文件,它是客戶程序,支持在命令行中輸入SQL語句,啟動時需要輸入root用戶的密碼。目前,有很多可視化的工具軟件提供了對MySQL系統(tǒng)的支持,例如:MySQL-Front,它可以連接到MySQL數(shù)據(jù)庫,在圖形界面中進行對數(shù)據(jù)庫和數(shù)據(jù)表進行操作。安裝MySQL-Front軟件。為方便以后程序的運行,我們可以通過MySQL-Front軟件在MySQL數(shù)據(jù)庫中創(chuàng)建名為shopdb的數(shù)據(jù)庫,在數(shù)據(jù)庫中創(chuàng)建books表和accounts表,并且向表中插入數(shù)據(jù)。159.2 MySQL數(shù)據(jù)庫的安裝與配置9.2.2使用M9.3 連接數(shù)據(jù)庫

9.3.1連接數(shù)據(jù)庫的一般過程

9.3.2使用JDBC-ODBC驅(qū)動連接Access數(shù)據(jù)庫9.3.3使用JDBC驅(qū)動連接MySQL數(shù)據(jù)庫

9.3.4通過JSP頁面連接數(shù)據(jù)庫9.3.5通過JavaBean連接數(shù)據(jù)庫

9.3.6通過Servlet連接數(shù)據(jù)庫169.3 連接數(shù)據(jù)庫9.3.1連接數(shù)據(jù)庫的一般過程169.3 連接數(shù)據(jù)庫

9.3.1連接數(shù)據(jù)庫的一般過程

1.設(shè)置類路徑獲得驅(qū)動器類庫,并將其設(shè)置到classpath中,對于采用JDBC-ODBC驅(qū)動的連接方式可以不用設(shè)置classpath。2.加載并注冊驅(qū)動器在程序中引入java.sql包,接下來加載并注冊驅(qū)動器,其中JDBC-ODBC在JDK中自帶,默認(rèn)注冊。通過調(diào)用方法Class.forName()可顯式地加載驅(qū)動程序類。例如:Class.forName(“sun.jdbc.odbc.Jdbc.OdbcDriver”);//加載JDBC-ODBC驅(qū)動Class.forName(“org.gjt.mm.mysql.Driver”);//加載MySql的JDBC驅(qū)動DriverManager.registerDriver(neworg.gjt.mm.mysql.Driver());//注冊MySql的JDBC驅(qū)動3.建立與數(shù)據(jù)庫的連接使用DriverManager的getConnection()方法建立與數(shù)據(jù)庫的連接并返回一個Connection對象引用,例如:Connectionconn=DriverManager.getConnection("jdbc:odbc:datasource",”sa”,”sa”);Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:3306/shopdb",“root”,“root”);179.3 連接數(shù)據(jù)庫9.3.1連接數(shù)據(jù)庫的一般過程179.3 連接數(shù)據(jù)庫

9.3.1連接數(shù)據(jù)庫的一般過程

4.創(chuàng)建Statement對象獲得數(shù)據(jù)庫連接對象后,通過該對象創(chuàng)建用于執(zhí)行SQL語句的Statement對象,例如:Statementstmt=conn.createStatement();PrepareStatementpstmt=conn.prepareStatement(sql);CallableStatementcstmt=con.prepareCall("{callgetTestData(?,?)}");5.執(zhí)行SQL語句Stringsql="selectid,bookname,publisherfrombooks";ResultSetrs=stmt.executeQuery(sql);6.遍歷ResultSet對象中的記錄例如:while(rs.next()){longid=rs.getLong(1);Stringbookname=rs.getString(2);Stringpublisher=rs.getString(3);//打印所顯示的數(shù)據(jù)

System.out.println("id="+id+",name="+bookname+",publisher="+publisher);}189.3 連接數(shù)據(jù)庫9.3.1連接數(shù)據(jù)庫的一般過程189.3 連接數(shù)據(jù)庫

9.3.2使用JDBC-ODBC驅(qū)動連接Access數(shù)據(jù)庫首先創(chuàng)建名為student.mdb的Access數(shù)據(jù)庫,數(shù)據(jù)庫中包含名為userTable的數(shù)據(jù)表,表結(jié)構(gòu)描述userTable(id,name,password,address)。接下來,通過控制面板設(shè)置ODBC數(shù)據(jù)源,具體過程為:打開“控制面板”,雙擊“管理工具”,雙擊“數(shù)據(jù)源(ODBC)”,打開“ODBC數(shù)據(jù)源管理器”對話框,在“系統(tǒng)DSN”選項卡中單擊“添加”按鈕,彈出“創(chuàng)建新數(shù)據(jù)源”對話框,選擇“MicrosoftAccessDriver(*.mdb)”后,點擊“完成”。彈出“MicrosoftODBCAccess安裝”對話框,輸入數(shù)據(jù)源名(例如stu),點擊“選擇”按鈕,彈出“選擇數(shù)據(jù)庫”對話框,選擇數(shù)據(jù)庫文件后,點擊“確定”后回到“MicrosoftODBCAccess安裝”對話框,點擊“確定”后,完成對ODBC數(shù)據(jù)源的設(shè)置。例程9-2:useJdbcOdbcDriver.java

199.3 連接數(shù)據(jù)庫9.3.2使用JDBC-ODBC驅(qū)動連接9.3 連接數(shù)據(jù)庫

9.3.3使用JDBC驅(qū)動連接MySQL數(shù)據(jù)庫

首先,下載MySQL的JDBC驅(qū)動包,并將其設(shè)置到classpath類路徑中,接下來創(chuàng)建相應(yīng)的數(shù)據(jù)庫,這里使用9.2節(jié)中創(chuàng)建的名為shopdb的數(shù)據(jù)庫。例程9-3:useJdbcDriver.java209.3 連接數(shù)據(jù)庫9.3.3使用JDBC驅(qū)動連接MySQL9.3 連接數(shù)據(jù)庫

9.3.4通過JSP頁面連接數(shù)據(jù)庫在JSP頁面中通過添加用于連接數(shù)據(jù)庫的Java代碼即可實現(xiàn)對數(shù)據(jù)庫的訪問。將MySQL的JDBC驅(qū)動包部署到Tomcat服務(wù)器安裝目錄的common\lib文件夾即可部署并訪問例程9-4。例程9-4:jspJdbc.jsp

219.3 連接數(shù)據(jù)庫9.3.4通過JSP頁面連接數(shù)據(jù)庫219.3 連接數(shù)據(jù)庫

9.3.5通過JavaBean連接數(shù)據(jù)庫在JSP頁面中嵌入用來連接數(shù)據(jù)庫的Java代碼,這種編程模式可維護性較差,無法實現(xiàn)代碼的可重用性,我們可以將訪問數(shù)據(jù)庫的代碼寫到JavaBean中或Servlet中,這樣,既容易對頁面進行維護,又可以實現(xiàn)代碼的重用性。例程9-5將對數(shù)據(jù)庫的連接與操作定義到JavaBean中。例程9-5:ConnectionBean.java

使用例程9-5前應(yīng)該先創(chuàng)建數(shù)據(jù)庫,并將MySQL的JDBC驅(qū)動器部署到Tomcat服務(wù)器。例程9-6對例程9-5中定義的JavaBean進行引用。例程9-6:useConnectionBean.jsp

229.3 連接數(shù)據(jù)庫9.3.5通過JavaBean連接數(shù)據(jù)庫9.3 連接數(shù)據(jù)庫

9.3.5通過JavaBean連接數(shù)據(jù)庫例程9-5將訪問數(shù)據(jù)庫所需要的參數(shù)都寫在程序中,而在實際應(yīng)用中,為了增強程序的靈活性,我們可以將參數(shù)存儲在單獨的一個配置文件中,JavaBean執(zhí)行時可以從配置文件中獲取參數(shù)。例程9-7中存儲了與數(shù)據(jù)庫建立連接相關(guān)的參數(shù)。例程9-7:property.conf

例程9-8中定義一個工具類,用來讀取配置文件中的參數(shù)并將參數(shù)存儲到一個Properties對象中,可以按參數(shù)名從Properties中獲取相應(yīng)參數(shù)值,可以通過獲取的參數(shù)來實現(xiàn)數(shù)據(jù)庫連接的建立。例程9-8:GetConnection.java

對例程9-8進行編譯并部署,例程9-9可通過例程9-8建立數(shù)據(jù)庫連接。例程9-9:UseGetConnectionBean.jsp

239.3 連接數(shù)據(jù)庫9.3.5通過JavaBean連接數(shù)據(jù)庫9.3 連接數(shù)據(jù)庫

9.3.6通過Servlet連接數(shù)據(jù)庫我們可以將對數(shù)據(jù)庫的操作封裝到Servlet中,在實際應(yīng)用中為了增強靈活性,一般將建立數(shù)據(jù)庫連接所需要的參數(shù)以初始化參數(shù)的形式配置到web.xml中,這樣Servlet可以方便地對參數(shù)進行獲取。例程9-10用來實現(xiàn)建立數(shù)據(jù)庫連接,并進行相應(yīng)的操作,其中連接數(shù)據(jù)庫所需要的參數(shù)可以從Servlet配置信息中獲取。例程9-10:ConnectionServlet.java對例程9-10進行編譯并部署后,在服務(wù)器的web.xml中對ConnectionServlet進行配置

例程9-11用來向Servlet提交請求,要求按圖書名查詢圖書信息。例程9-11:ConnectionServletTest.html

249.3 連接數(shù)據(jù)庫9.3.6通過Servlet連接數(shù)據(jù)庫2<servlet><description>配置ConnectionServlet的初始化參數(shù)</description><display-name>ConnectionServlet</display-name><servlet-name>ConnectionServlet</servlet-name>

<servlet-class>ConnectionServlet</servlet-class>

<init-param> <param-name>driver</param-name> <param-value>org.gjt.mm.mysql.Driver</param-value>

</init-param>

<init-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/shopdb</param-value>

</init-param>

<init-param> <param-name>username</param-name> <param-value>root</param-value>

</init-param>

<init-param> <param-name>password</param-name> <param-value>root</param-value>

</init-param></servlet><servlet-mapping><servlet-name>ConnectionServlet</servlet-name><url-pattern>/ConnectionServlet</url-pattern></servlet-mapping>25<servlet>259.4 數(shù)據(jù)庫高級操作

9.4.1

使用存儲過程

9.4.2事務(wù)操作9.4.3操作二進制數(shù)據(jù)

269.4 數(shù)據(jù)庫高級操作9.4.1

使用存儲過程269.4 數(shù)據(jù)庫高級操作

9.4.1

使用存儲過程

存儲過程是定義在數(shù)據(jù)庫管理系統(tǒng)服務(wù)器上的一組經(jīng)過預(yù)編譯的SQL語句集合,由數(shù)據(jù)庫管理系統(tǒng)管理控制,由服務(wù)器直接執(zhí)行。由于存儲過程是預(yù)編譯的,能夠節(jié)約SQL語句的編譯時間,同時可以減少網(wǎng)絡(luò)的數(shù)據(jù)傳輸量。CallableStatement接口用來執(zhí)行數(shù)據(jù)庫中的存儲過程,由Connection對象的prepareCall()創(chuàng)建。從PreparedStatement接口中繼承了用于處理IN參數(shù)的方法,還增加了用于處理OUT參數(shù)和INOUT參數(shù)的方法。調(diào)用存儲過程一般有兩種形式:一種形式帶結(jié)果參數(shù),另一種形式不帶結(jié)果參數(shù)。結(jié)果參數(shù)是一種輸出(OUT)參數(shù),是儲存過程的返回值。兩種形式都可帶有數(shù)量可變的輸入(IN參數(shù))、輸出(OUT參數(shù))或輸入和輸出(INOUT參數(shù))的參數(shù)。問號將用作參數(shù)的占位符。在JDBC中調(diào)用儲存過程的語法如下所示(方括號表示其間的內(nèi)容是可選項)。{call過程名[(?,?,...)]}//調(diào)用無返回結(jié)果參數(shù)的存儲過程{?=call過程名[(?,?,...)]}//調(diào)用有返回結(jié)果參數(shù)的存儲過程{call過程名}//調(diào)用不帶參數(shù)的存儲過程例如,下例創(chuàng)建CallableStatement的實例,其中含有對儲存過程getTestData調(diào)用。該過程有兩個變量,但不含結(jié)果參數(shù)。CallableStatementcstmt=con.prepareCall("{callgetTestData(?,?)}");其中?占位符的類型(IN、OUT還是INOUT參數(shù)),取決于儲存過程getTestData的定義。279.4 數(shù)據(jù)庫高級操作9.4.1

使用存儲過程279.4 數(shù)據(jù)庫高級操作

9.4.1

使用存儲過程

將IN參數(shù)傳給CallableStatement對象是通過setXXX方法完成的,傳入?yún)?shù)的類型決定了所用的setXXX方法(例如,用setFloat()來傳入float值等)。如果儲存過程返回OUT參數(shù),則在執(zhí)行CallableStatement對象以前必須先注冊每個OUT參數(shù)的JDBC類型,注冊JDBC類型是用registerOutParameter()方法來完成的。語句執(zhí)行完后,CallableStatement的getXXX方法可以取回參數(shù)值。既支持輸入又接受輸出的參數(shù)(INOUT參數(shù))除了調(diào)用registerOutParameter()方法外,還要求調(diào)用適當(dāng)?shù)膕etXXX()方法。setXXX()方法將參數(shù)值設(shè)置為輸入?yún)?shù),而registerOutParameter()方法將它的JDBC類型注冊為輸出參數(shù)。下面介紹如何在Java程序中調(diào)用數(shù)據(jù)庫服務(wù)器端的存儲過程。首先在MySQL的shopdb數(shù)據(jù)庫中創(chuàng)建如下的存儲過程,創(chuàng)建語句如下:CREATEPROCEDUREdemo_procedure(INparam1varchar(20),INparam2varchar(20),INparam3float(2))BEGIN insertintobooks(bookname,publisher,price)values(param1,param2,param3);END;例程9-12:ProcedureDemo.jsp289.4 數(shù)據(jù)庫高級操作9.4.1

使用存儲過程289.4 數(shù)據(jù)庫高級操作

9.4.2事務(wù)操作事務(wù)是構(gòu)成單一邏輯工作單元的操作集合,表現(xiàn)為一組SQL語句,是一個獨立的運行處理單元,其中的若干個操作,要么全都做,要么全都不做。如果事務(wù)中的所有操作成功則永久保存更新數(shù)據(jù),如果失敗則回滾到執(zhí)行事務(wù)前的初始狀態(tài)。數(shù)據(jù)庫系統(tǒng)支持兩種事務(wù)模式:一是自動提交,即每個語句是一個事務(wù);二是手工提交,即指定事務(wù)邊界。JDBC中默認(rèn)的方式是自動提交的方式,用setAutoCommit()方法可以設(shè)定是否自動提交。Java中用Connection對象的commit()方法提交事務(wù),用rollback()方法回滾事務(wù)?;貪L事務(wù)就是把事務(wù)中已做的操作取消,恢復(fù)到事務(wù)操作前的數(shù)據(jù)庫的狀態(tài)。例程9-13用來實現(xiàn)數(shù)據(jù)庫的事務(wù)控制。例程9-13:TransactionDemo.jsp

299.4 數(shù)據(jù)庫高級操作9.4.2事務(wù)操作299.4 數(shù)據(jù)庫高級操作

9.4.3操作二進制數(shù)據(jù)在數(shù)據(jù)庫編程中,往往需要把二進制數(shù)據(jù)保存到數(shù)據(jù)庫,MySQL使用Blob類型來表示。在JDBC中操作二進制對象和其他數(shù)據(jù)類型有所不同,二進制對象通常使用輸入、輸出流的方式來寫入和讀取。PreparedStatement的setBinaryStream()方法可以向數(shù)據(jù)庫中寫入Blob類型的數(shù)據(jù)。要讀取數(shù)據(jù)庫中的Blob類型數(shù)據(jù),可以先通過ResultSet對象的getBlob()方法返回一個Blob對象,然后,調(diào)用Blob對象的getBinaryStream()獲得一個輸入流,最后,通過這個輸入流將Blob數(shù)據(jù)讀取到內(nèi)存中。例程9-14用來向shopdb數(shù)據(jù)庫中accounts數(shù)據(jù)表中保存Blob類型數(shù)據(jù),然后從中讀取Blob數(shù)據(jù)。例程9-14:ProcessBlobData.java

309.4 數(shù)據(jù)庫高級操作9.4.3操作二進制數(shù)據(jù)309.5 數(shù)據(jù)庫連接池技術(shù)

9.5.1

連接池與數(shù)據(jù)源概述

9.5.2使用連接池連接MySQL數(shù)據(jù)庫319.5 數(shù)據(jù)庫連接池技術(shù)9.5.1

連接池與數(shù)據(jù)源概述39.5 數(shù)據(jù)庫連接池技術(shù)

9.5.1

連接池與數(shù)據(jù)源概述建立和銷毀數(shù)據(jù)庫連接需要浪費大量的系統(tǒng)時間,消耗大量的系統(tǒng)資源。數(shù)據(jù)庫連接池的基本實現(xiàn)原理是,事先在連接池中建立一定數(shù)量的數(shù)據(jù)庫連接,當(dāng)Java程序需要一個連接時,可以從連接池獲取一個空閑的連接,當(dāng)Java程序使用完連接時,再將其放回連接池。數(shù)據(jù)庫連接池負責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個現(xiàn)有的數(shù)據(jù)庫連接,而不是重新建立一個;釋放空閑時間超過最大空閑時間的數(shù)據(jù)庫連接來避免因為釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。例程9-15實現(xiàn)了一個能夠取出、釋放和關(guān)閉連接的數(shù)據(jù)庫連接池。例程9-15:ConnectionPool.java

例程9-16對例程9-15中定義的數(shù)據(jù)庫連接池進行使用。例程9-16:UseConnectionPool.java

329.5 數(shù)據(jù)庫連接池技術(shù)9.5.1

連接池與數(shù)據(jù)源概述329.5 數(shù)據(jù)庫連接池技術(shù)

9.5.2使用連接池連接MySQL數(shù)據(jù)庫Tomcat5.5和MySQL5.0為例,介紹如何在服務(wù)器端配置數(shù)據(jù)源。首先,打開Tomcat5.5\conf\server.xml文件,在</host>標(biāo)記前添加<Context>標(biāo)記對。配置時要指定數(shù)據(jù)庫驅(qū)動程序的類、連接數(shù)據(jù)庫的URL、連接數(shù)據(jù)庫的用戶名和

溫馨提示

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

評論

0/150

提交評論