JAVA EE之实现分页查询功能
涉及:mysql,bootstrap等
1:分页原理
mysql数据库中分页查询的子句是limit
格式:limit a,b;
a 表示第一条记录的索引。从0开始
b 表示取几条记录。
每页5条记录。
第1页: limit 0,5
第2页: limit 5,5
第3页: limit 10,5
第n页: limit (n-1)*5 , 5
公式 : limit (页码-1)*每页记录数量,每页记录数量
2: 创建一个PageVO类,用来封装分页查询的数据
分页查询数据:
1 page 页码 用户指定
2 recordOfPage 每页记录数量 用户指定
3 pageCount 总页数 计算得到
4 recordCount 总记录数量 select count(*)
5 list 当前页的集合 select * from items limit
import java.util.List;
public class PageVO<T> {
// 1 page 页码 用户指定
private int page;
// 2 recordOfPage 每页记录数量 用户指定
private int recordOfPage;
// 3 pageCount 总页数 计算得到
private int pageCount;
// 4 recordCount 总记录数量 select count(*)
private int recordCount;
// 5 list 当前页的集合 select * from items limit
private List<T> list;
// 6 生成get set
3:编写分页查询使用的工具类
public class SQLUtil {
/**
* 动态生成分页查询的Limit子句
* @param page 当前页码
* @param recordOfPage 每页记录数量
* @re
* turn limit子句(select id,username,password,email from users limit 0,5)
*/
public static String getLimit(int page, int recordOfPage) {
return " limit " + ((page - 1) * recordOfPage) + "," + recordOfPage;
}
4:编写DAO
我们要编写二个方法:
1 :countUsers 总记录数量 select count(*) from users
2: searchUsers 当前页的集合 select * from users limit
1:计算所有的用户数 (数据库的链接和关闭已经封装)
/**
* 计算所有用户数量
* @return 用户总数
* @throws Exception
*/
public int countUsers() {
Connection conn =null;
String sql = "select count(*) total from users";
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn=ConnectUtil.getConnection();
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
while (rs.next()) {
return rs.getInt("total");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
ConnectUtil.release(rs, stmt, conn);
}
return 0;
}
2:当前页的集合
/**
* 分页查询用户
* @param page 当前页
* @param recordPage 一次查询多少用户
* @return 返回一页查询的用户数量
*/
public List<User> searchUsers(int page,int recordPage){
Connection conn =null;
List<User> users=new ArrayList<User>();
String sql = "select id,username,password,email from users "+SQLUtil.getLimit(page,recordPage);
// select id,username,password,email from users limit 0,5
PreparedStatement stmt=null;
ResultSet rs=null;
try {
conn=ConnectUtil.getConnection();
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
while (rs.next()) {
User user=new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
users.add(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
ConnectUtil.release(rs, stmt, conn);
}
return users;
}
5:编写service
package com.fish.service;
import com.fish.dao.UserDao;
import com.fish.entity.User;
import com.fish.vo.PageVO;
import java.util.List;
public class UserService {
private UserDao userDao;
public UserService(){
userDao=new UserDao();
}
/**
* 后台分页查询用户
* @param page 当前页
* @param recordPage
* @return
*/
public PageVO<User> searchUsers(int page, int recordPage){
// 用于封装分页的信息
PageVO<User> pageVO=new PageVO<User>();
//得到用户总数
int userCount=userDao.countUsers();
//计算总页数
int pageCount=((userCount-1)/recordPage)+1;
//当前页面控制
if(page<1)page=1;
if (page>pageCount)page=pageCount;
//获取当前页的集合
List<User> users=userDao.searchUsers(page,recordPage);
//封装分页实体类(存,一个页面的用户,用户数,页数,等)
pageVO.setPage(page);//当前页
pageVO.setPageCount(pageCount);//总页数
pageVO.setRecordCount(recordPage);//总记录数
pageVO.setRecordOfPage(recordPage);//每页显示多少条
pageVO.setList(users);//当前页的用户
System.out.printf(pageVO.toString()+"------------------pageVo");
return pageVO;
}
}
6:编写Controller
@WebServlet("/manage/getUsers.do")
public class UsersServlet extends HttpServlet {
private UserService userService;
@Override
public void init() throws ServletException {
super.init();
userService=new UserService();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 获取请求参数-分页
int recordOfPage = 10;//每页10条记录
int page = 1;//默认第一页
if(req.getParameter("page")!=null){
page = Integer.parseInt(req.getParameter("page"));
}
//2 调用业务逻辑
PageVO<User> pageVO = userService.searchUsers(page,recordOfPage);//(里面封装的是用户分页信息)
List<User> userList = pageVO.getList();
//3 数据传递和页面导航
if (userList!=null){
req.setAttribute("userList", userList);//每页的用户
req.setAttribute("pageVO", pageVO);//分页的信息
req.getRequestDispatcher("/WEB-INF/views/usersShow.jsp").forward(req, resp);
}else {
req.getRequestDispatcher("/WEB-INF/views/error/404.jsp").forward(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
7: JSP(样式基于bootstrap)
<%--分页--%>
<div class="row">
<div class="col-lg-6 col-lg-offset-3" >
<ul class="pagination">
<c:choose>
<c:when test="${requestScope.pageVO.page eq 1}">
<li class="disabled">
<a title="上一页" href="javascript:void(0);">
<span aria-hidden="true">«</span>
</a>
</li>
</c:when>
<c:otherwise>
<li>
<a title="上一页" href="javascript:doPage(${requestScope.pageVO.page - 1});">
<span aria-hidden="true">«</span>
</a>
</li>
</c:otherwise>
</c:choose>
<c:forEach begin="1" end="${requestScope.pageVO.pageCount }" var="index">
<c:choose>
<c:when test="${index eq requestScope.pageVO.page }">
<li class="active"><a href="javascript:doPage(${index });">${index}</a></li>
</c:when>
<c:otherwise>
<li><a href="javascript:doPage(${index });">${index}</a></li>
</c:otherwise>
</c:choose>
</c:forEach>
<c:choose>
<c:when test="${requestScope.pageVO.page eq requestScope.pageVO.pageCount }">
<li class="disabled">
<a title="下一页" href="javascript:void(0);">
<span aria-hidden="true">»</span>
</a>
</li>
</c:when>
<c:otherwise>
<li>
<a title="下一页" href="javascript:doPage(${requestScope.pageVO.page + 1});">
<span aria-hidden="true">»</span>
</a>
</li>
</c:otherwise>
</c:choose>
</ul>
</div>
</div>
<form action="/manage/getUsers.do" id="pageForm" method="post">
<input type="hidden" id="page" name="page" value="1">
</form>
<%--分页end--%>
<script type="text/javascript">
function doPage(n){
document.getElementById("page").value=n;
document.getElementById("pageForm").submit();
}
</script>