版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第七章JDBC連接數據庫JDBC工作原理通過JDBC對數據庫執行SQL語句基于數據源訪問數據庫高級開發技巧本章主要內容JDBC工作原理√通過JDBC對數據庫執行SQL語句基于數據源訪問數據庫高級開發技巧JDBC為多種關系數據庫提供了統一訪問方式,作為特定廠商數據庫訪問API的一種高級抽象,它主要包含一些通用的接口類。真正的數據庫訪問操作實現是由各自數據庫廠商提供的。通常把廠商提供的特定于數據庫的訪問API稱為數據庫JDBC驅動程序。JDBC通過提供一個抽象的數據庫接口,使得程序開發人員在編程時可以不用綁定在特定數據庫廠商的API上,大大增加了應用程序的可移植性。在實際運行過程中程序代碼通過JDBC訪問數據庫時,仍舊需要調用特定于數據庫的訪問API!!!JDBC訪問數據庫層次結構
要使服務器上的J2EE應用能夠通過JDBC訪問數據庫,必須將JDBC驅動程序添加到應用服務器的JVM可以訪問到的目錄下。對于Jboss服務器,可以將數據庫的JDBC驅動拷貝到Jboss安裝目錄下的server\all\lib子目錄下。創建數據庫連接,分為以下幾步:首先注冊數據庫驅動程序。Class.forName(“org.git.mm.mysql.Driver”);然后根據具體的JDBCURL地址,調用DriverManager對象的getConnection()來獲取一個代表數據庫連接的java.sql.connectuion對象。JDBCURL的格式如下:jdbc:子協議:數據庫定位器。MySQL數據庫:jdbc:mysql://機器名/數據庫名Oracle數據庫:jdbc:oracle:thin@機器名:端口名:數據庫名給定具體的JDBCURL,獲取數據庫連接的方法是在DriverManager對象上調用getConnection()。這種方法有兩種形式:DriverManager.getConnection(url)DriverManager.getConnection(url,user,password)其中第二種方式需要輸入用戶名和密碼信息進行身份認證。程序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數據庫成功!<%}catch(java.sql.SQLExceptione){out.println(e.toString());}%>數據庫連接測試
JDBC工作原理通過JDBC對數據庫執行SQL語句√
基于數據源訪問數據庫高級開發技巧
java.sql.Statement
對象代表一條發送到數據庫執行的SQL語句。有三種Statement對象:Statement對象用于執行不帶參數的簡單SQL語句;PreparedStatement
對象用于執行帶或不帶參數的預編譯SQL語句;CallableStatement
對象用于執行對數據庫存儲過程的調用。Statement接口注意:繼承了Statement接口中所有方法的PreparedStatement
接口也有自己的executeQuery、executeUpdate
和execute方法。Statement對象本身不包含SQL語句,因而必須給Statement.execute
方法提供SQL語句作為參數。PreparedStatement
對象并不將SQL語句作為參數提供給這些方法,因為它們已經包含預編譯SQL語句。CallableStatement
對象繼承這些方法的PreparedStatement
形式。對于這些方法的PreparedStatement
或CallableStatement
版本,使用查詢參數將拋出SQLException。PreparedStatement接口PreparedStatement
實例包含已編譯的SQL語句,這也是將其命名冠以“Prepared”的原因。包含于PreparedStatement
對象中的SQL語句可具有一個或多個IN參數。IN參數的值在SQL語句創建時未被指定。相反的,該語句為每個IN參數保留一個問號(“?”)作為占位符。每個問號的值必須在該語句執行之前通過適當的setXXX()方法來提供。由于PreparedStatement
對象已預編譯過,所以其執行速度要快于Statement對象。因此多次執行的SQL語句經常創建為PreparedStatement
對象,以提高效率。ResultSet接口ResultSet對象代表SQL語句的執行結果集,它包含符合SQL語句中條件的所有行。對于SQL語句執行結果的操作,實質上是對ResultSet對象的操作。Result維護指向其當前數據行的光標。每調用一次next()方法,光標向下移動一行,最初光標位于第一行之前。方法getxxx()提供了獲取當前行中某列值的途徑。Statement對象執行完畢后,將由Java垃圾收集程序自動關閉,而作為一種好的編程風格,應在不需要Statement對象時顯示關閉。<%@pagecontentType="text/html;charset=gb2312"%><%java.sql.Connection
conn;java.lang.String
strConn;java.sql.Statement
sqlStmt;//語句對象java.sql.ResultSet
sqlRst;//結果集對象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);//執行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><%//關閉結果集對象
sqlRst.close();
//關閉語句對象
sqlStmt.close();
//關閉數據庫連接
conn.close();}catch(java.sql.SQLExceptione){out.println(e.toString());}%>執行帶參數的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;//結果集對象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><%//關閉結果集對象
sqlRst.close();//關閉語句對象
preparedStmt.close();//關閉數據庫連接
conn.close();}catch(java.sql.SQLExceptione){out.println(e.toString());}%>JDBC工作原理通過JDBC對數據庫執行SQL語句基于數據源訪問數據庫√高級開發技巧數據源是在JDBC2.0中引入的一個概念。在JDBC2.0擴展包中定義了javax.sql.DataSource接口來描述數據源的概念。如果用戶希望建立一個數據庫連接,通過查詢在JNDI(JavaNamingandDirectoryInterface)服務中的數據源,可以從數據源中獲取相應的數據庫連接。這樣程序開發人員就只需要獲取一個邏輯名稱,而不是數據庫登錄的具體細節,這樣代碼的移植能力就更強。屬性名稱屬性數據類型描述databaseNameString數據庫名稱,即數據庫的SIDdataSourceNameString數據源接口實現類的名稱。descriptionString對數據源的描述。networkProtocolString和服務器通訊使用的網絡協議名。passwordString用戶登錄密碼。portNumberInt數據庫服務器使用的端口,缺省值為1521。serverNameString數據庫服務器名稱。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?");//設置參數Stringparm=request.getParameter("parm");preparedStmt.setString(1,"%"+parm+"%");//執行Sql語句sqlRst=prepar
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026人工智能圖像識別行業技術演進與商業應用前景分析報告
- 探索接單易考試題目與答案
- 2026中國塑料加工設備行業市場現狀供需分析及投資評估規劃分析研究報告
- 2026中國物流成本控制方法及效率提升與數字化轉型路徑分析
- 2026 一級建造師考試試卷及答案解析
- 2026-高中工學電子技術試題及答案
- 中建一局集團建設發展公司筆試題目及答案
- 2026廣西壯族自治區經濟社會技術發展研究所招聘編外聘用人員3人考前沖刺密卷附參考答案詳解(A卷)
- 2026年蚌埠第十八中學編外校聘教師招聘模擬試卷及完整答案詳解【典優】
- 2026年福建省連江黃如論中學秋季招聘教師備考題庫附答案詳解【鞏固】
- 食堂交叉污染培訓
- GJB763.5A-2020艦船噪聲限值和測量方法第5部分艦船設備空氣噪聲測量
- 硫酸氫氯吡格雷課件
- 2025年安徽省中小學教師招聘考試小學語文試題及答案
- 模具檢驗管理制度流程
- 2025年陜西省中考英語試題卷(含答案)
- 銅砭刮痧治療肩周炎
- 園區光儲充智能微電網項目建議書
- 2024全國統一電力市場發展規劃藍皮書
- 入黨申請書專用紙-A4單面打印
- 《臨床技術操作規范病理學分冊》醫院用
評論
0/150
提交評論