微軟的.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轉化成Result 25 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> |