Access資料庫 實作分頁查詢
- 目錄
-
- 說明
- 項目的結構
- SQL語句
- Servlet:page.java
- 顯示頁面query.jsp
- 通路頁面hello.jsp
- 總結
目錄
說明
項目環境:Eclipse+Tomcat伺服器+Access資料庫+servlet+jdbc驅動
項目的結構
圖檔:
SQL語句
分頁查找的SQL語句,
代碼片
.
String sql="select top 4 * from Histrjn where JourNo not in "
+ "(select top "+(n-1)*4+" JourNo from Histrjn order by JourNo ) "
+ "order by JourNo ";
//top:sql語句關鍵字
//4:分頁中一頁顯示的記錄條數
//Histrjn:表名
//JourNo:主鍵屬性
//n:目前頁面數
//not in:不在其中
//order by JourNo:對主鍵屬性排序
說明:
top是分頁sql語句的關鍵字
提醒:
1. 第一頁時n=1,sql中(n-1)是0
Servlet:page.java
page.java來進行資料庫分頁查詢,
代碼片
.
package hello;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//使用注解定義Servlet
@WebServlet("/page")
public class page extends HttpServlet {
private static final long serialVersionUID = 1L;
Connection con;
Statement st;
ResultSet rs;
public page() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Class.forName("com.hxtt.sql.access.AccessDriver");// jdbc資料庫驅動
String url = "jdbc:Access:///F:HrMS.accdb";// 資料源名稱
Connection con = DriverManager.getConnection(url, "", "");// 建立資料庫連接配接對象
Statement st = con.createStatement();
// 獲得Histrjn表中記錄的總數
ResultSet rs = st.executeQuery("select count(JourNo) from Histrjn");
rs.next();
int x = rs.getInt(1);
System.out.println("總記錄數:" + x);
// 判斷是否被平均分頁,确定分頁總數
if (x % 4 == 0) {
x = x / 4;
} else {
x = x / 4 + 1;
}
request.setAttribute("x", x);// 分頁總數加入required中
int n = 1;// 初始化目前頁面數
if (request.getParameter("n") == null) {
n = 1;
} else {
// 從頁面中擷取請求頁數
n = Integer.parseInt(request.getParameter("n"));
}
// 分頁查詢的sql語句
String sql = "select top 4 * from Histrjn where JourNo not in " + "(select top " + (n - 1) * 4
+ " JourNo from Histrjn order by JourNo ) " + "order by JourNo ";
rs = st.executeQuery(sql);//
List<Map<String, Object>> list = page.convertList(rs);
// 檢驗list對象,列印list内容,非必要
page.viewList(list);
// 獲得表屬性字段名
Set<String> key = list.get(0).keySet();
request.setAttribute("key", key);
request.setAttribute("list", list);
request.getRequestDispatcher("/query.jsp").forward(request, response);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
if (rs != null || st != null || con != null) {
try {
rs.close();
st.close();
con.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
// 将ResultSet對象轉為List<Map<String, Object>>
public static List<Map<String, Object>> convertList(ResultSet rs) throws SQLException {
List<Map<String, Object>> list = new LinkedList<Map<String, Object>>();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
while (rs.next()) {
// 第一個插入的為第一個map值對
Map<String, Object> rowData = new LinkedHashMap<String, Object>();
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), rs.getObject(i));
}
list.add(rowData);
}
return list;
}
// 檢驗list對象,顯示list,非必要
public static void viewList(List<Map<String, Object>> list) {
// 周遊list
Iterator<Map<String, Object>> li = list.iterator();
while (li.hasNext()) {
// 周遊map
for (Map.Entry<String, Object> ma : li.next().entrySet()) {
System.out.print(ma.getValue() + " ");
}
System.out.println("");
}
}
}
說明:
方法public static void viewList(List<Map<String, Object>> list)是非必要的
提醒:
在map中屬性的排列和資料庫的順序不同,因為map對象按照key的大小進行了排序
顯示頁面query.jsp
顯示分頁查詢的頁面query.jsp,使用了< c:forEach > 進行周遊,
代碼片
.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>顯示頁面</title>
<style type="text/css">
td {
text-align: middle;
text-align: center;
font-size:25px;
}
</style>
</head>
<body>
<br>
<br>
<br>
<table align="center" border="1" width="1000" height="170"
cellpadding="0" cellspacing="0">
<tr>
<!-- 周遊集合對象 -->
<c:forEach var="ke" items="${key}">
<td>${ke}</td>
</c:forEach>
</tr>
<!-- 嵌套周遊集合對象 -->
<c:forEach var="map" items="${list}">
<tr>
<c:forEach var="me" items="${map}">
<td>${me.value}</td>
</c:forEach>
</tr>
</c:forEach>
</table>
<br>
<br>
<div align="center">
<font size="5"> 第
<!-- 循環周遊 -->
<c:forEach begin="1" end="${x}" var="i">
<a href="page?n=${i}">${i}</a>
</c:forEach> 頁
</font>
</div>
</body>
</html>
說明:
1. 開啟c:标簽,<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>。
2. 使用c:标簽要引入兩個包jstl.jar和standard-1.1.2.jar
3. 使用<c:forEach>周遊,配合EL表達式${},友善的輸出集合内容。
4. 使用css來設定< td >的屬性。
通路頁面hello.jsp
,
代碼片
.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>分頁查詢通路頁面</title>
</head>
<body>
<a href="page" >分頁查詢</a>
</body>
</html>
提醒:
該頁面沒有設定編碼方式。
總結
1. 使用注解注冊servlet,不需要對web.xml進行配置了,使用預設的就行
2. 分頁查詢時如果id不連續,分頁效果則不能完成
**引用包是最大的困難(一步一步來)**