版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第七章JDBC連接數(shù)據(jù)庫JDBC工作原理通過JDBC對數(shù)據(jù)庫執(zhí)行SQL語句基于數(shù)據(jù)源訪問數(shù)據(jù)庫高級開發(fā)技巧本章主要內(nèi)容JDBC工作原理√通過JDBC對數(shù)據(jù)庫執(zhí)行SQL語句基于數(shù)據(jù)源訪問數(shù)據(jù)庫高級開發(fā)技巧JDBC為多種關(guān)系數(shù)據(jù)庫提供了統(tǒng)一訪問方式,作為特定廠商數(shù)據(jù)庫訪問API的一種高級抽象,它主要包含一些通用的接口類。真正的數(shù)據(jù)庫訪問操作實現(xiàn)是由各自數(shù)據(jù)庫廠商提供的。通常把廠商提供的特定于數(shù)據(jù)庫的訪問API稱為數(shù)據(jù)庫JDBC驅(qū)動程序。JDBC通過提供一個抽象的數(shù)據(jù)庫接口,使得程序開發(fā)人員在編程時可以不用綁定在特定數(shù)據(jù)庫廠商的API上,大大增加了應(yīng)用程序的可移植性。在實際運行過程中程序代碼通過JDBC訪問數(shù)據(jù)庫時,仍舊需要調(diào)用特定于數(shù)據(jù)庫的訪問API?。?!JDBC訪問數(shù)據(jù)庫層次結(jié)構(gòu)
要使服務(wù)器上的J2EE應(yīng)用能夠通過JDBC訪問數(shù)據(jù)庫,必須將JDBC驅(qū)動程序添加到應(yīng)用服務(wù)器的JVM可以訪問到的目錄下。對于Jboss服務(wù)器,可以將數(shù)據(jù)庫的JDBC驅(qū)動拷貝到Jboss安裝目錄下的server\all\lib子目錄下。創(chuàng)建數(shù)據(jù)庫連接,分為以下幾步:首先注冊數(shù)據(jù)庫驅(qū)動程序。Class.forName(“org.git.mm.mysql.Driver”);然后根據(jù)具體的JDBCURL地址,調(diào)用DriverManager對象的getConnection()來獲取一個代表數(shù)據(jù)庫連接的java.sql.connectuion對象。JDBCURL的格式如下:jdbc:子協(xié)議:數(shù)據(jù)庫定位器。MySQL數(shù)據(jù)庫:jdbc:mysql://機(jī)器名/數(shù)據(jù)庫名Oracle數(shù)據(jù)庫:jdbc:oracle:thin@機(jī)器名:端口名:數(shù)據(jù)庫名給定具體的JDBCURL,獲取數(shù)據(jù)庫連接的方法是在DriverManager對象上調(diào)用getConnection()。這種方法有兩種形式:DriverManager.getConnection(url)DriverManager.getConnection(url,user,password)其中第二種方式需要輸入用戶名和密碼信息進(jìn)行身份認(rèn)證。程序7-1:test.jsp<%@pagecontentType="text/html;charset=gb2312"%><%java.sql.Connection
conn;java.lang.String
strConn;try{Class.forName("org.gjt.mm.mysql.Driver").newInstance();conn=java.sql.DriverManager.getConnection("jdbc:mysql://localhost/test","root","");%>連接Mysql數(shù)據(jù)庫成功!<%}catch(java.sql.SQLExceptione){out.println(e.toString());}%>數(shù)據(jù)庫連接測試
JDBC工作原理通過JDBC對數(shù)據(jù)庫執(zhí)行SQL語句√
基于數(shù)據(jù)源訪問數(shù)據(jù)庫高級開發(fā)技巧
java.sql.Statement
對象代表一條發(fā)送到數(shù)據(jù)庫執(zhí)行的SQL語句。有三種Statement對象:Statement對象用于執(zhí)行不帶參數(shù)的簡單SQL語句;PreparedStatement
對象用于執(zhí)行帶或不帶參數(shù)的預(yù)編譯SQL語句;CallableStatement
對象用于執(zhí)行對數(shù)據(jù)庫存儲過程的調(diào)用。Statement接口注意:繼承了Statement接口中所有方法的PreparedStatement
接口也有自己的executeQuery、executeUpdate
和execute方法。Statement對象本身不包含SQL語句,因而必須給Statement.execute
方法提供SQL語句作為參數(shù)。PreparedStatement
對象并不將SQL語句作為參數(shù)提供給這些方法,因為它們已經(jīng)包含預(yù)編譯SQL語句。CallableStatement
對象繼承這些方法的PreparedStatement
形式。對于這些方法的PreparedStatement
或CallableStatement
版本,使用查詢參數(shù)將拋出SQLException。PreparedStatement接口PreparedStatement
實例包含已編譯的SQL語句,這也是將其命名冠以“Prepared”的原因。包含于PreparedStatement
對象中的SQL語句可具有一個或多個IN參數(shù)。IN參數(shù)的值在SQL語句創(chuàng)建時未被指定。相反的,該語句為每個IN參數(shù)保留一個問號(“?”)作為占位符。每個問號的值必須在該語句執(zhí)行之前通過適當(dāng)?shù)膕etXXX()方法來提供。由于PreparedStatement
對象已預(yù)編譯過,所以其執(zhí)行速度要快于Statement對象。因此多次執(zhí)行的SQL語句經(jīng)常創(chuàng)建為PreparedStatement
對象,以提高效率。ResultSet接口ResultSet對象代表SQL語句的執(zhí)行結(jié)果集,它包含符合SQL語句中條件的所有行。對于SQL語句執(zhí)行結(jié)果的操作,實質(zhì)上是對ResultSet對象的操作。Result維護(hù)指向其當(dāng)前數(shù)據(jù)行的光標(biāo)。每調(diào)用一次next()方法,光標(biāo)向下移動一行,最初光標(biāo)位于第一行之前。方法getxxx()提供了獲取當(dāng)前行中某列值的途徑。Statement對象執(zhí)行完畢后,將由Java垃圾收集程序自動關(guān)閉,而作為一種好的編程風(fēng)格,應(yīng)在不需要Statement對象時顯示關(guān)閉。<%@pagecontentType="text/html;charset=gb2312"%><%java.sql.Connection
conn;java.lang.String
strConn;java.sql.Statement
sqlStmt;//語句對象java.sql.ResultSet
sqlRst;//結(jié)果集對象try{Class.forName("org.gjt.mm.mysql.Driver").newInstance();conn=java.sql.DriverManager.getConnection("jdbc:mysql://localhost:3306/sample","root","");sqlStmt=conn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);//執(zhí)行Sql語句StringsqlQuery="selectcustomerid,address,phonefromcustomer";sqlRst=sqlStmt.executeQuery(sqlQuery);%><center>顧客信息表</center><tableborder="1"width="100%"bordercolorlight="#CC99FF"cellpadding="2"bordercolordark="#FFFFFF"cellspacing="0"><tr><tdalign="center"> ID</td><tdalign="center">地址</td><tdalign="center">電話</td></tr><%while(sqlRst.next()){//取得下一條記錄%><tr><!--顯示記錄--><td><%=sqlRst.getString("customerid")%></td><td><%=newString(sqlRst.getString("address").getBytes("iso-8859-1"))%></td><td><%=sqlRst.getString("phone")%></td></tr><%}%></table><%//關(guān)閉結(jié)果集對象
sqlRst.close();
//關(guān)閉語句對象
sqlStmt.close();
//關(guān)閉數(shù)據(jù)庫連接
conn.close();}catch(java.sql.SQLExceptione){out.println(e.toString());}%>執(zhí)行帶參數(shù)的SQL語句<!DOCTYPEHTMLPUBLIC"-//w3c//dtdhtml4.0transitional//en"><html><head><title>查詢條件</title></head><bodybgcolor="#FFFFFF"><formaction="searchResult.jsp"method="post"><label>顧客姓氏:</label><inputname="parm"value=""></input><inputtype="submit"name="Submit2"value="提交"><inputtype="reset"name="Submit"value="清空"></form></body></html><%@pagecontentType="text/html;charset=gb2312"%><%java.sql.Connection
conn;java.lang.String
strConn;java.sql.PreparedStatement
preparedStmt;//語句對象java.sql.ResultSet
sqlRst;//結(jié)果集對象try{Class.forName("org.gjt.mm.mysql.Driver").newInstance();conn=java.sql.DriverManager.getConnection("jdbc:mysql://localhost:3306/sample","root","");preparedStmt=conn.prepareStatement("select
customerid,firstname,lastname,addressfromcustomerwherefirstnamelike?");Stringparm=request.getParameter("parm");preparedStmt.setString(1,"%"+parm+"%");sqlRst=preparedStmt.executeQuery();%><center>顧客信息表</center><tableborder="1"width="100%"bordercolorlight="#CC99FF"cellpadding="2"bordercolordark="#FFFFFF"cellspacing="0"><tr><tdalign="center"> ID</td><tdalign="center">地址</td><tdalign="center">姓名</td></tr><%while(sqlRst.next()){//取得下一條記錄Stringname=newString(sqlRst.getString("firstname").getBytes("iso-8859-1"));name+=newString(sqlRst.getString("lastname").getBytes("iso-8859-1"));%><tr><!--顯示記錄--><td><%=sqlRst.getString("customerid")%></td><td><%=newString(sqlRst.getString("address").getBytes("iso-8859-1"))%></td><td><%=name%></td></tr><%}%></table><%//關(guān)閉結(jié)果集對象
sqlRst.close();//關(guān)閉語句對象
preparedStmt.close();//關(guān)閉數(shù)據(jù)庫連接
conn.close();}catch(java.sql.SQLExceptione){out.println(e.toString());}%>JDBC工作原理通過JDBC對數(shù)據(jù)庫執(zhí)行SQL語句基于數(shù)據(jù)源訪問數(shù)據(jù)庫√高級開發(fā)技巧數(shù)據(jù)源是在JDBC2.0中引入的一個概念。在JDBC2.0擴(kuò)展包中定義了javax.sql.DataSource接口來描述數(shù)據(jù)源的概念。如果用戶希望建立一個數(shù)據(jù)庫連接,通過查詢在JNDI(JavaNamingandDirectoryInterface)服務(wù)中的數(shù)據(jù)源,可以從數(shù)據(jù)源中獲取相應(yīng)的數(shù)據(jù)庫連接。這樣程序開發(fā)人員就只需要獲取一個邏輯名稱,而不是數(shù)據(jù)庫登錄的具體細(xì)節(jié),這樣代碼的移植能力就更強(qiáng)。屬性名稱屬性數(shù)據(jù)類型描述databaseNameString數(shù)據(jù)庫名稱,即數(shù)據(jù)庫的SIDdataSourceNameString數(shù)據(jù)源接口實現(xiàn)類的名稱。descriptionString對數(shù)據(jù)源的描述。networkProtocolString和服務(wù)器通訊使用的網(wǎng)絡(luò)協(xié)議名。passwordString用戶登錄密碼。portNumberInt數(shù)據(jù)庫服務(wù)器使用的端口,缺省值為1521。serverNameString數(shù)據(jù)庫服務(wù)器名稱。userString用戶登錄名。程序7-5:mysql-service.xml(片段)<mbeancode="org.jboss.resource.connectionmanager.RARDeployment"name="jboss.jca:service=LocalTxDS,name=MySqlDS"><attributename="JndiName">MySqlDS</attribute><attributename="ManagedConnectionFactoryProperties"><properties><config-propertyname="ConnectionURL"type="java.lang.String">jdbc:mysql://localhost:3306/sample</config-property><config-propertyname="DriverClass"type="java.lang.String">org.gjt.mm.mysql.Driver</config-property><!--settheseonlyifyouwantonlydefaultlogins,notthroughJAAS--><config-propertyname="UserName"type="java.lang.String">root</config-property><config-propertyname="Password"type="java.lang.String"></config-property></properties></attribute><dependsoptional-attribute-name="OldRarDeployment">jboss.jca:service=RARDeployment,name=JBoss
LocalTransactionJDBCWrapper</depends></mbean>…….try{javax.naming.InitialContext
ctx=new
javax.naming.InitialContext();
javax.sql.DataSource
ds=(javax.sql.DataSource)ctx.lookup("java:/MySqlDS");
conn=ds.getConnection();preparedStmt=conn.prepareStatement("select
customerid,address,phonefromcustomerwherefirstnamelike?");//設(shè)置參數(shù)Stringparm=request.getParameter("parm");preparedStmt.setString(1,"%"+parm+"%");//執(zhí)行Sql語句sqlRst=prepar
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 會議服務(wù)合同協(xié)議書的履行期限
- 苯板采購合同的履行威脅
- 螺旋式機(jī)器購買協(xié)議
- 房屋買賣合同的違約金計算及支付方式
- 電腦交易協(xié)議示范
- 招標(biāo)方案設(shè)計背景介紹
- 目標(biāo)責(zé)任書撰寫技巧
- 裝卸信譽(yù)保證
- 網(wǎng)絡(luò)打印機(jī)采購協(xié)議
- 致愛妻忠誠的保證書
- 水利信息化數(shù)據(jù)中心及軟件系統(tǒng)單元工程質(zhì)量驗收評定表、檢查記錄
- 2024年城市園林苗木移植合同范例
- 軍事理論課(2024)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 魅力歌劇-《飲酒歌》課件 2024-2025學(xué)年人音版初中音樂九年級上冊
- 2024年心血管運動醫(yī)學(xué)指南要點解讀課件
- 安防監(jiān)控系統(tǒng)技術(shù)標(biāo)投標(biāo)書例范本
- 牛肉丸銷售合同模板
- 2024年資格考試-高校教師崗前培訓(xùn)考試近5年真題集錦(頻考類試題)帶答案
- 上海市普陀區(qū)曹楊二中2025屆生物高二上期末綜合測試試題含解析
- 1.1 公有制為主體多種所有制經(jīng)濟(jì)共同發(fā)展 課件-2024-2025學(xué)年高中政治統(tǒng)編版必修二經(jīng)濟(jì)與社會
- 第三單元(單元測試)-2024-2025學(xué)年四年級上冊數(shù)學(xué)人教版
評論
0/150
提交評論