《Java Web 應用程序設計立體化教程》第5章數(shù)據(jù)庫訪問技術(shù)_第1頁
《Java Web 應用程序設計立體化教程》第5章數(shù)據(jù)庫訪問技術(shù)_第2頁
《Java Web 應用程序設計立體化教程》第5章數(shù)據(jù)庫訪問技術(shù)_第3頁
《Java Web 應用程序設計立體化教程》第5章數(shù)據(jù)庫訪問技術(shù)_第4頁
《Java Web 應用程序設計立體化教程》第5章數(shù)據(jù)庫訪問技術(shù)_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

5數(shù)據(jù)庫訪問技術(shù)學習目標了解JDBC連接數(shù)據(jù)庫的方式。掌握JDBC-ODBC橋接數(shù)據(jù)庫的方法。掌握JDBC連接數(shù)據(jù)常用的接口。學會用JavaBean封裝數(shù)據(jù)庫操作類連接數(shù)據(jù)庫。了解數(shù)據(jù)庫連接池的工作原理,掌握創(chuàng)建數(shù)據(jù)庫連接池。5.1JavaWeb中訪問數(shù)據(jù)庫在JavaBean章節(jié)應用開發(fā)實例中,應用集合HashMap存放學生對象,當Tomcat服務器重新啟動時,所有的數(shù)據(jù)將丟失。真實項目設計中,涉及到多個數(shù)據(jù)表,數(shù)據(jù)量大,表之間的關(guān)聯(lián)多,應用集合存儲數(shù)據(jù)也不能滿足要求,這就需要應用數(shù)據(jù)庫。JDBC作為JavaWeb訪問數(shù)據(jù)庫最直接的方式,為數(shù)據(jù)庫訪問提供了一組用Java語言編寫的類和接口。5.1.1JDBC簡介Java數(shù)據(jù)庫連接(JavaDatabaseConnectivity)簡稱JDBC,是Java語言中用來規(guī)范客戶端程序如何訪問數(shù)據(jù)庫的應用程序接口,提供了諸如查詢和更新數(shù)據(jù)庫中數(shù)據(jù)的方法。我們通常說的JDBC是面向關(guān)系型數(shù)據(jù)庫的,在關(guān)系數(shù)據(jù)庫的“對象/關(guān)系”映射中,表中的每行對應于類的一個實例,而每列的值對應于該實例的一個屬性。程序員可直接對Java對象進行操作,存取數(shù)據(jù)所需的SQL調(diào)用將在“掩蓋下”自動生成。此外還可提供更復雜的映射,例如將多個表中的行結(jié)合到一個Java類中。5.1.1JDBC簡介JDBC的特點是與任何關(guān)系型數(shù)據(jù)庫協(xié)同工作的方式完全相同,也就是說,使用JDBC后沒有必要為訪問SQLServer數(shù)據(jù)庫寫一個程序,而為訪問Oracle數(shù)據(jù)庫再寫另一個專門的程序。同時,將Java語言和JDBC結(jié)合起來,使程序員不必為不同的平臺編寫不同的應用程序,只須寫一遍程序就可以讓它在任何平臺上運行,這也是Java語言“編寫一次,處處運行”的優(yōu)勢。5.1.2JDBC連接數(shù)據(jù)庫的方式數(shù)據(jù)庫建立連接發(fā)送操作數(shù)據(jù)庫的SQL語句處理結(jié)果關(guān)閉與數(shù)據(jù)庫的連接方式1:JDBC-ODBC橋利用JDBC-ODBC橋,ODBC驅(qū)動程序?qū)DBC訪問。我們可以使用JDBCAPI通過ODBC去訪問數(shù)據(jù)庫,它實際上是把標準的JDBC調(diào)用轉(zhuǎn)換成相應的ODBC調(diào)用,并通過ODBC把它們發(fā)送給ODBC數(shù)據(jù)源。方式2:本地API這種驅(qū)動程序由部分Java程序和特定廠商的本地API組成。在程序中利用JDBCAPI訪問數(shù)據(jù)庫,JDBC驅(qū)動程序?qū)⒄{(diào)用請求轉(zhuǎn)換成廠商提供的本地API調(diào)用。請求處理后,這些API將結(jié)果返回給JDBC驅(qū)動程序,由JDBC驅(qū)動程序負責將結(jié)果轉(zhuǎn)換成JDBC標準形式后返回給客戶端程序。方式3:JDBC網(wǎng)絡純Java驅(qū)動程序這種驅(qū)動程序?qū)DBC轉(zhuǎn)換為與DBMS無關(guān)的網(wǎng)絡協(xié)議,之后這種協(xié)議又被某個服務器轉(zhuǎn)換為一種DBMS協(xié)議。網(wǎng)絡服務器中間件能夠?qū)⑺募僇ava客戶機連接到多種不同的數(shù)據(jù)庫上,這是最為靈活的JDBC驅(qū)動程序方式4:本地協(xié)議純Java驅(qū)動程序這種驅(qū)動程序完全用Java編寫,將JDBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的網(wǎng)絡協(xié)議。這將允許從客戶機上直接調(diào)用DBMS服務器。由于許多這樣的協(xié)議都是專用的,因此數(shù)據(jù)庫提供者自己是主要來源。5.2JDBC與ODBCMicrosoft的ODBCAPI可能是使用最廣的、用于訪問關(guān)系數(shù)據(jù)庫的編程接口,它能在幾乎所有平臺上連接幾乎所有的數(shù)據(jù)庫。ODBC定義了訪問數(shù)據(jù)庫API的一組規(guī)范,這些API獨立于形色各異的DBMS和編程語言。一個基于ODBC的應用程序,對數(shù)據(jù)庫的操作不依賴任何DBMS,不直接與DBMS打交道,所有的數(shù)據(jù)庫操作由對應的DBMS的ODBC驅(qū)動程序完成。例題5-1,以Windows7系統(tǒng)為例,配置SQLServer系統(tǒng)數(shù)據(jù)源。1.打開控制面板,找到【管理工具】,并打開2.在【管理工具】頁面找到【ODBC數(shù)據(jù)源】并打開3.找到“系統(tǒng)DSN”,選擇“添加”按鈕

4.在彈出的【創(chuàng)建新數(shù)據(jù)源】界面,選中“SQLServer”5.

【創(chuàng)建到SQLServer的新數(shù)據(jù)源】界面填寫數(shù)據(jù)源

6.設置SQLServer數(shù)據(jù)庫管理系統(tǒng)中的數(shù)據(jù)庫xinxi7.測試數(shù)據(jù)源并添加數(shù)據(jù)源5.3JDBC的數(shù)據(jù)庫編程5.3.1JDBC常用接口1.Driver接口不同數(shù)據(jù)庫廠商提供不同實現(xiàn)的驅(qū)動類:SQLServer2000:com.microsoft.jdbc.sqlserver.SQLServerDriverSQLServer2008:com.microsoft.sqlserver.jdbc.SQLServerDriverSQLServer2017:com.microsoft.sqlserver.jdbc.SQLServerDriverOracle:oracle.jdbc.driver.OracleDriverMySQL:com.mysql.jdbc.DriverJDBC-ODBC數(shù)據(jù)庫連接驅(qū)動類:sun.jdbc.odbc.JdbcOdbcDriver加載數(shù)據(jù)庫驅(qū)動的語句:Class.forName(“驅(qū)動類”);2.DriverManager類staticDrivergetDriver(Stringurl)throwsSQLException嘗試查找給定URL的驅(qū)動程序。DriverManager嘗試從一組已注冊的JDBC驅(qū)動程序中選擇適當?shù)尿?qū)動程序。staticConnectiongetConnection(Stringurl)throwsSQLException嘗試建立與給定數(shù)據(jù)庫URL的連接。Connectioncon=DriverManager.getConnection(url,“user”,“password”);user-數(shù)據(jù)庫用戶,連接是為該用戶建立的。password-數(shù)據(jù)庫用戶的密碼。2.DriverManager類url用于標識數(shù)據(jù)庫位置,常用數(shù)據(jù)庫url地址的寫法:SQLServer:jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=“數(shù)據(jù)庫名稱”O(jiān)racle:jdbc:oracle:thin:@localhost:1521:“數(shù)據(jù)庫名稱”MySql:jdbc:mysql://localhost:3306/“數(shù)據(jù)庫名稱”3.Connection接口Connection接口用于代表數(shù)據(jù)庫的連接,Collection是數(shù)據(jù)庫編程中最重要的一個對象,客戶端與數(shù)據(jù)庫所有交互都是通過connection對象完成的,這個對象的常用方法:StatementcreateStatement()throwsSQLExceptionPreparedStatementprepareStatement(Stringsql)throwsSQLExceptionCallableStatementprepareCall(Stringsql)throwsSQLException3.Connection接口voidclose()throwsSQLException:立即釋放此Connection對象的數(shù)據(jù)庫和JDBC資源,要主動執(zhí)行close()方法,不要等待它們被自動釋放。voidcommit()throwsSQLException:使所有上一次提交進行的更改成為持久更改。voidrollback()throwsSQLException取消在當前事務中進行的所有更改,并釋放此Connection對象當前持有的所有數(shù)據(jù)庫鎖。4.Statement接口在建立與數(shù)據(jù)庫的連接后需要對數(shù)據(jù)庫進行訪問,Statement接口用于執(zhí)行不帶參數(shù)的簡單SQL語句,用來向數(shù)據(jù)庫提交SQL語句交返回SQL語句的執(zhí)行結(jié)果。創(chuàng)建了Statement接口的實例后,可調(diào)用其中的方法執(zhí)行SQL語句,JDBC中提供了三種執(zhí)行方法。executeUpdate()。executeQuery()execute()(1)executeUpdate()intexecuteUpdate(Stringsql)throwsSQLException:執(zhí)行給定SQL語句,該語句可能為INSERT、UPDATE或DELETE語句,或者不返回任何內(nèi)容的SQL語句。例如:st.executeUpdate(“UPDATESCORESETC_SCORE=99WHEREage=20”);該語句將數(shù)據(jù)表中年齡為20的行中C_SCORE值改成99,如果該語句帶來了三行記錄的修改,則返回影響的行數(shù)3,如果沒有對任何行產(chǎn)生影響,則返回值為0。(2)executeQuery()ResultSetexecuteQuery(Stringsql)throwsSQLException:執(zhí)行給定的SQL語句,通常為靜態(tài)SQLSELECT語句,該語句返回單個ResultSet對象。例如:st.executeQuery(“select*fromSCOREWHEREage=20”);該語句將查詢到的年齡20歲的所有行放入ResultSet對象。(3)execute()booleanexecute(Stringsql)throwsSQLException:一般是在用戶不知道執(zhí)行SQL語句后會產(chǎn)生什么結(jié)果或可能有多種類型的結(jié)果產(chǎn)生時才會使用。execute()的執(zhí)行結(jié)果包括包含多個ResultSet、多條記錄被影響、既包含結(jié)果集也有記錄被影響三種情況。5.PreparedStatement接口PreparedStatement接口繼承了Statement接口,但它包含了經(jīng)過預編譯的SQL語句,因此獲得更高的執(zhí)行效率。在PreparedStatement語句中可以包含多個用“?”代表的字段,在程序中可以利用setXXX方法設置該字段的內(nèi)容,從而增強了程序設計的動態(tài)性。PreparedStatementpstmt=conn.prepareStatement(“UPDATESCORESETC_SCORE=?WHEREID=?”);pstmt.setInt(1,100); //設置第一個字段C_SCORE值為100pstmt.setInt(2,1001); //設置第二個字段ID值為10016.CallableStatement接口CallableStatement接口繼承了PreparedStatement接口用于執(zhí)行數(shù)據(jù)庫的存儲過程。在CallableStatement對象中,有一個通用的成員方法call,這個方法用于以名稱的方式調(diào)用數(shù)據(jù)庫中的存儲過程。7.ResultSet接口ResultSet對象包含了executeQuery方法中SELECT查詢的結(jié)果集,即符合指定SQL語句中條件的所有行。ResultSet對象維護了一個指向表格數(shù)據(jù)行的游標,初始的時候,游標在第一行之前,調(diào)用ResultSet.next()方法,用于移動到ResultSet中的下一行,使下一行成為當前行。ResultSet提供的都是用于獲取數(shù)據(jù)的get方法:獲取任意類型的數(shù)據(jù):getObject(intindex)或getObject(stringcolumnName)獲取指定類型的數(shù)據(jù):getString(intindex)或getString(StringcolumnName)5.3.2用JavaBeans封裝數(shù)據(jù)庫訪問操作訪問數(shù)據(jù)庫時一系列操作:設置驅(qū)動程序,連接數(shù)據(jù)庫,生成一條語句,進行SQL操作,最后斷開連接。首先要裝載并注冊數(shù)據(jù)庫的JDBC驅(qū)動程序例題5-2,編寫數(shù)據(jù)庫訪問的JavaBeanConnectioncon=null;

Statementst=null;

ResultSetrs=null;Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");con=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=student",

"sa",

"123456");st=con.createStatement();rs=st.executeQuery("select*fromxs");while(rs.next()){System.out.println("學號:"+rs.getString(1)+"姓名:"+rs.getString(2)+"年齡:"+rs.getString(3)+"性別:"+rs.getString(4));}5.3.3實例:JavaBean+Jdbc技術(shù)實現(xiàn)用戶登錄public

classConnectDbase{

privateStringdiverName="com.microsoft.sqlserver.jdbc.SQLServerDriver"; Stringurl1="jdbc:sqlserver://localhost:1433;databaseName=login";

privateStringuserName="sa";privateStringuserPwd="123456"; Connectionconn;

publicConnectiongetConnect(){

try

{Class.forName(diverName);

conn

=DriverManager.getConnection(url1,userName,userPwd);

}catch(SQLExceptione){

e.printStackTrace();}

return

conn;}}2.編寫User.java,創(chuàng)建查詢,返回是否查找到相關(guān)信息public

classUser{

privateStringname=null;

private

Stringpassword=null;

publicStringgetName(){return

name;}

public

voidsetName(Stringname){

=name;}

publicStringgetPassword(){return

password;}

public

voidsetPassword(Stringpassword){this.password=password;}

public

booleanyanzheng_user(Stringxm2,Stringmm2)throwsException

{

booleanf=false; ConnectDbasecdb=newConnectDbase(); Connectionconn=cdb.getConnect(); PreparedStatementpstmt=conn.prepareStatement("select*fromdengluwherename=?andpassword=?"); pstmt.setString(1,xm2);pstmt.setString(2,mm2); ResultSetrs=pstmt.executeQuery();

if(rs.next())

f=true;

else

f=false;

return

f;}}3.編寫input.html,顯示登錄頁面<%@

page

language="java"

pageEncoding="GB2312"

%><html>

<head>

<title>用戶登錄頁面</title>

</head>

<body>

<form

action="show.jsp"

method="post">

用戶名:<input

type="text"

name="name"><br><br>

密  碼:<input

type="password"

name="password"><br><br>

<input

type="submit"

value="登錄">

</form>

</body></html>4.編寫show.jsp,顯示登錄結(jié)果<html><body>

<%request.setCharacterEncoding("gbk");%>

<jsp:useBeanid="us"

class="com.db.User"

scope="page"><jsp:setProperty

name="us"

property="*"

/></jsp:useBean>

<%if

(us.yanzheng_user(us.getName(),us.getPassword())){%>

<%=us.getName()%>:登錄成功!<br>

<%}else

{

%>

<%=us.getName()%>:登錄失??!<br>

<%

}

%></body></html>測試程序當用zhangsan賬號和對應密碼登錄時,登錄成功當用lisi賬號和對應密碼登錄時,登錄失敗5.4數(shù)據(jù)庫連接池的訪問類實現(xiàn)5.4.1為什么使用數(shù)據(jù)庫連接池每次創(chuàng)建和斷開Connection對象都會消耗一定的時間和IO資源,頻繁地創(chuàng)建、斷開數(shù)據(jù)庫連接勢必會影響數(shù)據(jù)庫的訪問效率,如果訪問數(shù)據(jù)庫的次數(shù)過于頻繁,這個過程就會非常浪費系統(tǒng)資源,并直接影響運行速度。為了避免頻繁的創(chuàng)建數(shù)據(jù)庫連接,提出了數(shù)據(jù)庫連接池技術(shù),系統(tǒng)可以通過連接池來實現(xiàn)對數(shù)據(jù)庫的訪問。5.4.2數(shù)據(jù)庫連接池的工作原理一個“緩沖池”。預先在緩沖池中放入一定數(shù)量的連接,當需要建立數(shù)據(jù)庫連接時,只需從“緩沖池”中取出一個連接,使用完畢之后再放回去。數(shù)據(jù)庫連接池的優(yōu)缺點數(shù)據(jù)庫連接池的優(yōu)點:創(chuàng)建一個新的數(shù)據(jù)庫連接所耗費的時間主要取決于網(wǎng)絡的速度以及應用程序和數(shù)據(jù)庫服務器的(網(wǎng)絡)距離,而且這個過程通常是一個很耗時的過程。而采用數(shù)據(jù)庫連接池后,數(shù)據(jù)庫連接請求可以直接通過連接池滿足而不需要為該請求重新連接到數(shù)據(jù)庫服務器,這樣就節(jié)省了時間,提高了性能。數(shù)據(jù)庫連接池的缺點:服務器啟動就會創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接,項目實施中,數(shù)據(jù)庫連接池中可能存在著多個沒有被使用的連接一直連接著數(shù)據(jù)庫,這意味著資源的浪費。5.4.3創(chuàng)建連接池進行數(shù)據(jù)庫訪問

1.在項目中的META-INF文件夾中創(chuàng)建context.xml文件<?xml

version="1.0"

encoding="UTF-8"?><Context

reloadable="true"

crossContext="true"><Resource

name="jdbc/student"

auth="Container"

type="javax.sql.DataSource"driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"

url="jdbc:sqlserver://localhost:1433;DataBaseName=student"

username="sa"

password="123456"

maxActive="100"

maxIdle="30"

maxWait="1000"

/></Context>2.打開WEB-INF下的Web.xml文件<resource-ref><description>NorthWind</description><res-ref-name>jdbc/wshopData</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth>

</resource-ref>3.把JDBC驅(qū)動拷貝到WEB-INF下的lib里4.測試代碼<body><table

border="1">

<%DataSourceds=null;

InitialContextctx=new

InitialContext();

ds=(DataSource)ctx.lookup("java:comp/env/jdbc/student");

Connectionconn=ds.getConnection();

Statementstmt=conn.createStatement();

StringstrSql="SELECT*FROMxsxx";ResultSetrs=stmt.executeQuery(strSql)

溫馨提示

  • 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

提交評論