天天看點

Access資料庫 實作分頁查詢目錄

Access資料庫 實作分頁查詢

  • 目錄
    • 說明
    • 項目的結構
    • SQL語句
    • Servlet:page.java
    • 顯示頁面query.jsp
    • 通路頁面hello.jsp
    • 總結

目錄

說明

項目環境:Eclipse+Tomcat伺服器+Access資料庫+servlet+jdbc驅動

項目的結構

圖檔:

Access資料庫 實作分頁查詢目錄

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不連續,分頁效果則不能完成
**引用包是最大的困難(一步一步來)**
           

繼續閱讀