1.分⻚技术
本文代码Git地址:https://gitee.com/lucky_h/java
1.分页是啥
分页是指一种将所有数据分段展示欸用户的计算,比如一本小说 共计220页,读者每次看到的页码就是分页。
2.意义
对于企业信息系统来说数据量不会限制在一个小范围内.当表中的数据量超过一定量(十万级)的时候,一次性的展示数据到页面中会造成以下问题,创建过多的对象,将会使内存耗尽,造成系统崩溃 过多的数据 不便于展示,会造成系统运行缓慢。
3.原理
-
实现分页,只需要每次从数据库中读取部分数据就可以了。可使用limit关键字
-
limit关键字语法一: select * from 表名 limit a,bl
此时 a 是 起始位置
b 是 查询的条数
-
limit关键字语法二: limit b;
此时 b 代表条数
-
3.2计算方法
-
分页的必要参数
- 页码 :你要查看的第几页
- count 每一页的条数
eg 每一页显示三条记录
SELECT * FROM 表名 LIMIT 0,3;假设 页码为p,条数为c 需要的起始位置为:x = (页码-1)x 条数 = (p-1) * c
-
eg 每页显示4条 显示2页 (页码-1)*条数 = 4
select * from 表 limit 4,4;
-
总页数 = 总条数 / 每页条数 + (总条数 % 每页条数 > 0 ? 1:0)
1.2代码实现
1.2.1 思路分析
-
分页实现的步骤:
1.Dao层 ------> UserDao
添加方法:查询用户的总记录数()
查询分页用户的数据 () 通过 mysql 中 limit ?,? 来实现分页查询功能 第一个?代表从第几个记录开始查询,第二个?代 表查询多少条记录
-
vivew层(jsp)
index.jsp 首页、上一页、下一页、尾页,增加相应的链接
3.controller 层(servlet):
servlet的dopost方法里面,调用方法之后将结果通过setAttribute 来返回数据
-
1.2.2 代码实现
1.Dao层
/**
* 分页
* @author 小杭呀
* @param page
* @param count
* @return
*/
public List<Sp> selectSpByPage(int page, int count) {
List<Sp> spList = new ArrayList<>();
try {
conn = DBconn.getConn();
String sql = "select * from sp limit ?,?";
pstm = conn.prepareStatement(sql);
//计算页码
int pages = (page-1)*count;
pstm.setInt(1, pages);
pstm.setInt(2, count);
rs = pstm.executeQuery();
while (rs.next()){
Sp sp = new Sp();
sp.setId(rs.getInt("id"));
sp.setName(rs.getString("name"));
sp.setPrice(rs.getString("price"));
sp.setNumber(rs.getInt("number"));
//将数据插进去
spList.add(sp);
}
} catch (Exception e) {
e.printStackTrace();
}
return spList;
}
/**
* 查询总页数
*
* @param count
* @return
* 公式:总条数/每夜条数 + (如果有余数+1 没有+0)
* 总页数 = 总条数 / 每页条数 + (总条数 % 每页条数 > 0 ? 1:0)
*/
public int selectSumPage(int count) {
int sumpage = 0;
int sumCount = 0;
try {
conn = DBconn.getConn();
// 查询总条数
String sql = "select count(*) from sp";
pstm = conn.prepareStatement(sql);
rs = pstm.executeQuery();
if(rs.next()) {
sumCount = rs.getInt(1);
}
//带入公式
sumpage = sumCount / count +(sumCount % count > 0?1:0);
} catch (SQLException e) {
e.printStackTrace();
}
return sumpage;
}
-
service 业务层
** * @author 魏小杭 */ public class SpService { //引入数据访问层dao private SpDao dao; public SpService() { dao = new SpDao(); } /** * 分页 * @param page * @param count * @return */ public List<Sp> selectSpByPage(int page, int count) { return dao.selectSpByPage(page, count) ; } /** * 获取总页数 * @param count * @return */ public int selectSumPage(int count) { return dao.selectSumPage(count); } }
3.servlet控制层
public class SpServlet extends HttpServlet { //初始化引用service对象 private SpService service; @Override public void init() throws ServletException { service = new SpService(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.获取页码 条数 String pageIndex = req.getParameter("page"); String countStr = req.getParameter("count"); //初始默认页码和条数 int page = 1; int count = 5; //判断是否存有效 try { //page 和count 必须得大于0 if (Integer.valueOf(pageIndex) > 0){ //如果参数有效 page = Integer.valueOf(pageIndex);//使用参数 } }catch (Exception e){ e.printStackTrace(); } //单独捕获异常,如果放到一块的话 第一个转换失败 第二个就不会执行了 try { if (Integer.valueOf(countStr) > 0){//如果参数有效 count = Integer.valueOf(countStr);//使用参数 } }catch (Exception e){ e.printStackTrace(); } List<Sp> spList = service.selectSpByPage(page,count); //总页数 int sumPage = service.selectSumPage(count); //将splist 和 总页数 当前页面 带给jsp req.setAttribute("spList",spList); req.setAttribute("sumPage",sumPage ); req.setAttribute("page",page ); //跳转页面 此时携带参数 必须使用请求转发 req.getRequestDispatcher("index.jsp").forward(req,resp); } }
-
vivew视图层(jsp) 需要引入jstl标签
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>> <html> <head> <title>分页查询</title> </head> <body> <table border="1px" align="center"> <tr> <th>货号</th> <th>名称</th> <th>价格</th> <th>库存</th> </tr> <%--遍历splist集合--%> <c:forEach items="${spList}" var="sp"> <tr> <td>${sp.id}</td> <td>${sp.name}</td> <td>${sp.price}</td> <td>${sp.number}</td> </tr> </c:forEach> </table> <div align="center"> <a href="show?page=1">首页</a> <%-- 判断还能不能点击下一页--%> <c:if test="${page>1}" > <a href="show?page=${page-1}">上一页</a> </c:if> <span>${page}/${sumPage}</span> <c:if test="${page<sumPage}" > <a href="show?page=${page+1}">下一页</a> </c:if> <a href="show?page=${sumPage}">末尾</a> </div> <%-- 如果用户直接访问了index是没有数据的,需要自动发送请求--%> <c:if test="${empty spList}"> <jsp:forward page="show"></jsp:forward> </c:if> </body> </html>
-
1.3 分页查询总结
- select * from 表名 limit a,b; a 是 起始位置 b 是 查询的条数
- 总页数 = 总条数 / 每页条数 + (总条数 % 每页条数 > 0 ? 1:0)
- *起始位置为:x = (页码-1)条数
- 在编写servlet 需要给定一个初始默认页码和条数,这样即使 后面判断代码不生效 也能赋值 避免空值出现