js|訪問|資料
JSP中早就有了類似.Net DataSet那樣的離線資料訪問了,拋棄ResultSet,擁抱Result吧!
微軟的.NET平台上面的資料訪問有一個特點,就是資料查詢的結果,可以放在記憶體中,以XML格式進行描述,不需要一直與資料庫保持線上串連,用DataSet + Data Adapter來實現!
而在JDBC中,我們通常使用javax.sql.ResultSet類來存放放回的資料,它的流程和生命週期如下:
使用ResultSet來返回資料庫查詢結果 |
Client |
--> |
Connection |
--> |
Statement |
--> |
JDBC Driver |
--+ |
|
Database |
Client |
<-- |
Parsing |
<-- |
ResultSet |
<-- |
JDBC Driver |
--+ |
|
|
|
|
|
|
|
|
|
Connection lifecycle |
|
|
|
|
|
|
ResultSet lifecycle |
|
|
我們可以看到,這樣會長期佔用資料庫連接的資源,是一個有點不爽的問題...
其實,在JSTL中提供了另外一種機制,讓我們在返回查詢結果到展示層的時候,可以做到離線使用!它就是javax.servlet.jsp.jstl.sql.Result類!
1 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
2 <%@page contentType="text/html; charset=UTF-8"%>
3 <%@page import="java.sql.Connection"%>
4 <%@page import="java.sql.DriverManager"%>
5 <%@page import="java.sql.ResultSet"%>
6 <%@page import="java.sql.SQLException"%>
7 <%@page import="java.sql.Statement"%>
8 <%@page import="javax.servlet.jsp.jstl.sql.Result"%>
9 <%@page import="javax.servlet.jsp.jstl.sql.ResultSupport"%>
10 <%
11 // 暫且把這個下面的內容看作多層架構中的DAO好了,我偷懶了!
12 Connection conn = null;
13 Statement stmt = null;
14 ResultSet rs = null;
15 String strDbUrl
16 = "jdbc:mysql://localhost/tutorial?user=tutorial&password=tutpwd";
17 try {
18 //開始與資料庫作查詢19 Class.forName("com.mysql.jdbc.Driver").newInstance();
20 conn = DriverManager.getConnection(strDbUrl);21 stmt = conn.createStatement();
22 String strSql = "SELECT * FROM R_TUT_USERS";23 rs = stmt.executeQuery(strSql);
24 //把ResultSet轉化成Result25 Result userData = ResultSupport.toResult(rs);
26 //當我們把結果放到某個Model bean後,就可以關閉資料庫連接了.
27 //為了簡化,我們暫且把pageContext看作Model Bean好了!
28 pageContext.setAttribute("userData", userData);
29 }
30 catch (Exception ex) {
31 // handle any errors
32 System.out.println("SQLException: " + ex.getMessage());
33 }
34 finally {
35 try {
36 if (rs != null) {
37 rs.close();
38 }
39 if (stmt != null) {
40 stmt.close();
41 }
42 if (conn != null) {
43 conn.close();
44 }
45 }
46 catch (SQLException ex) {
47 System.out.println("SQL Exception: " + ex.getMessage());
48 }
49 }
50 //DAO的邏輯結束
51 %>
52 <html>
53 <head>
54 <title>test</title>
55 </head>
56 <body>
57 <!--// 下面當作是展示層吧 //-->
58 <c:forEach items="${userData.rows}" var="user">
59 <c:out value='${user.name}'/>
60 </c:forEach>
61 </body>
62 </html>