MySQL数据库+jsp+servlet实现分页查询

时间:2022-09-20 20:58:14

    前一段做的那个jsp+servlet的小项目用到了分页查询,今天总结到博客上面,以后忘记了自己可以看,也分享给大家.

    这个项目使用的数据库是MySQL,在MySQL数据库中使用

select user_id,username from user limit (pageNo-1)*pageSize,pageSize

就可以达到分段查询的目的,pageNo是页码数,pageSize是每页的容量,如果pageNo=1,pageSize=5的话,那就是取前五条数据,那第二页就是取出5-10条数据,依次类推.

    在这个项目的util包中加入了一个pageUtil的工具类,这个类主要是封装每页显示的数据,比如pageNo(当前页码),pageSize(每页要显示的数据条数),totalCount,(总记录的条数),data(当前页的数据集合),totalPage(总页数),这个类中的代码如下:

package com.team5.util;

import java.util.List;

import com.team5.hurui.bean.Dope;

/**
* 分页工具类(封装每页需要显示的数据)
*
* @author
*
*/

public class PageUtil {
// 当前页页码(1,2,3....)
private int pageNo;

// 每页显示条数
private int pageSize;

// 总记录(条数)
private int totalCount;

// 当前页数据集合
private List data;

// 总页数
private int totalPage;

/**
* 构造方法,传递每页条数和总记录数
*
* @param 每页显示条数
* @param 总记录数
*/

public PageUtil(int pageSize, int totalCount) {
this.pageSize = pageSize;
this.totalCount = totalCount;
if (this.totalCount % this.pageSize == 0) {
// 计算总页数
this.totalPage = this.totalCount / this.pageSize;
} else {
this.totalPage = this.totalCount / this.pageSize + 1;
}
}

public List getData() {
return data;
}

public void setData(List data) {
this.data = data;
}

public int getPageNo() {
return pageNo;
}

public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}

public int getPageSize() {
return pageSize;
}

public int getTotalCount() {
return totalCount;
}

public int getTotalPage() {
return totalPage;
}

}

之后在dao类的实现类中使用prepareStatement的executeQuery()方法查询出每条数据的属性值,并将其赋给bean类中写好的实体类的属性中,然后将实体类的对象放在一个list中,再将这个list给pageUtil类的data集合.
dao的实现类中有关分页的代码:


//根据页码和每页的容量来得到数据
@Override
public PageUtil getPage(int pageNo, int pageSize) {
Connection conn = DBManager.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
List<User> list = new ArrayList<User>();
PageUtil page = null;
try {
//获取总数据条数
int totalCount = 0;
ps = conn.prepareStatement("select count(user_id) from user");
rs = ps.executeQuery();
while(rs.next()){
totalCount = rs.getInt(1);
}
ps = conn.prepareStatement("select user_id,username from user limit " + (pageNo-1)*pageSize+","+pageSize);
rs = ps.executeQuery();
while(rs.next()){
User user = new User();
user.setUser_id(rs.getInt(1));
user.setUsername(rs.getString(2));
list.add(user);
}
page = new PageUtil(pageSize, totalCount);
page.setData(list);
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBManager.closeAll(rs, ps, conn);
}

return page;
}

然后在servlet中使用request.getParameter(“pageNo”)来获取到当前的页码数,接下来的代码:

//设置每页显示十条数据
PageUtil page = usi.getPage(pageNo, 10);
page.setPageNo(pageNo);
request.setAttribute("page", page);
request.getRequestDispatcher("admin/showUserList.jsp").forward(request, response);

设置每页显示的数据条数,然后page对象传递给jsp,在jsp中使用foreach循环:

<c:forEach var="list" items="${page.data}">
<tr>
<td align="center" class="altbg2"><input name="item" type="checkbox" id="item" value="${list.user_id}" ></td>
<td align="center" class="altbg2">
${list.username}
</td>
<td class="altbg2" align="center">
${list.user_id}
</td>
<td class="altbg2" align="center">
</td>
</tr>

</c:forEach>


<tr><td class="altbg2" colspan="7" rowspan="2" align="right">
总共【${page.totalPage}】页 &nbsp;&nbsp;${page.pageNo}/${page.totalPage}&nbsp;&nbsp; <a href="zcUserServlet?method=showPage&pageNo=1">首页</a> <c:choose>
<c:when test="${requestScope.page.pageNo > 1}">
<a href="zcUserServlet?method=showPage&pageNo=${page.pageNo-1}">上一页</a>
</c:when>
<c:otherwise>
上一页
</c:otherwise>
</c:choose>

<c:choose>
<c:when test="${page.pageNo < page.totalPage}">
<a href="zcUserServlet?method=showPage&pageNo=${page.pageNo+1}">下一页</a>
</c:when>
<c:otherwise>
下一页
</c:otherwise>
</c:choose>
<a href="zcUserServlet?method=showPage&pageNo=${page.totalPage}">尾页</a> </td>
</tr>

这样把page对象传递过来之后就可以调用pageUtil类中的属性了.这样分页基本就做完了,当然,如果想做的更好看点,还可以使用pagination之类的插件.