微軟的.NET平臺上面的數據訪(fǎng)問(wèn)有一個(gè)特點(diǎn),就是數據查詢(xún)的結果,可以放在內存中,以XML格式進(jìn)行描述,不需要一直與數據庫保持在線(xiàn)連接,用DataSet + Data Adapter來(lái)實(shí)現!
而在JDBC中,我們通常使用javax.sql.ResultSet類(lèi)來(lái)存放放回的數據,它的流程和生命周期如下:
使用ResultSet來(lái)返回數據庫查詢(xún)結果
Client-->Connection-->Statement-->JDBC Driver --+
Database
Client<--Parsing<--ResultSet<--JDBC Driver--+
Connection lifecycle
ResultSet lifecycle
我們可以看到,這樣會(huì )長(cháng)期占用數據庫連接的資源,是一個(gè)有點(diǎn)不爽的問(wèn)題...
其實(shí),在JSTL中提供了另外一種機制,讓我們在返回查詢(xún)結果到表示層的時(shí)候,可以做到離線(xiàn)使用!它就是javax.servlet.jsp.jstl.sql.Result類(lèi)!
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@page contentType="text/html; charset=UTF-8"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.Statement"%>
<%@page import="javax.servlet.jsp.jstl.sql.Result"%>
<%@page import="javax.servlet.jsp.jstl.sql.ResultSupport"%>
<%
// 暫且把這個(gè)下面的內容看作多層架構中的DAO好了,我偷懶了!
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String strDbUrl
= "jdbc:mysql://localhost/tutorial?user=tutorial&password=tutpwd";
try {
//開(kāi)始與數據庫作查詢(xún)
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(strDbUrl);
stmt = conn.createStatement();
String strSql = "SELECT * FROM R_TUT_USERS";
rs = stmt.executeQuery(strSql);
//把ResultSet轉化成Result
Result userData = ResultSupport.toResult(rs);
//當我們把結果放到某個(gè)Model bean后,就可以關(guān)閉數據庫連接了.
//為了簡(jiǎn)化,我們暫且把pageContext看作Model Bean好了!
pageContext.setAttribute("userData", userData);
}
catch (Exception ex) {
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
}
finally {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
catch (SQLException ex) {
System.out.println("SQL Exception: " + ex.getMessage());
}
}
//DAO的邏輯結束
%>
<html>
<head>
<title>test</title>
</head>
<body>
<c:forEach items="${userData.rows}" var="user">
<c:out value=‘${user.name}‘/>
</c:forEach>
</body>
</html>