Access数据库 实现分页查询
目录
说明
项目环境: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不连续,分页效果则不能完成
**引用包是最大的困难(一步一步来)**