Access数据库 实现分页查询

Access数据库 实现分页查询

  • 目录
    • 说明
    • 项目的结构
    • SQL语句
    • Servlet:page.java
    • 显示页面query.jsp
    • 访问页面hello.jsp
    • 总结

目录

说明

项目环境:Eclipse+Tomcat服务器+Access数据库+servlet+jdbc驱动

项目的结构

图片: Access数据库 实现分页查询_第1张图片

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>
	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> 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. 使用遍历,配合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不连续,分页效果则不能完成
**引用包是最大的困难(一步一步来)**

你可能感兴趣的:(access数据库分页查询)