分页查询的入门打开方式JavaWebhtml
分页查询这东西,分页说穿了就是查询"别一次把家底全抖出来"。数据库里躺着十万条数据,门打你一股脑全塞给浏览器,开方页面卡成幻灯片不说,分页用户翻到第三屏早就划走了。查询我见过最离谱的门打案例,某后台管理系统一次查了八万条订单,开方前端直接白屏,分页运维小哥蹲机房重启了三次才缓过来。查询
JavaWeb里做分页,门打核心就三件事:SQL的开方LIMIT、总记录数、分页页码计算。查询别想复杂了,门打先看最土的写法。
SELECT * FROM user LIMIT 0,10; LIMIT后面第一个数字是起始位置,第二个是每页条数。第一页从0开始,第二页就是10,10,第三页20,10——规律自己就蹦出来了。把页码跟条数乘一下,起始位置就有了:(page-1) * size。这个公式我闭着眼都能写,因为每个项目都长一样。
但光拉数据不够。你总得告诉用户"共37条,4页"吧?所以还得查一次总数:
SELECT COUNT(*) FROM user; 这两条SQL一前一后跑完,分页的数据底座就齐了。有人嫌COUNT慢,想用SQL_CALC_FOUND_ROWS优化,我劝你新手别碰。老老实实两条查询,等数据量真到百万级再谈优化,那会儿你早该换技术方案了。
后端把数据塞进一个PageBean,大概长这样:
public class PageBean<T> { private int pageNum; // 当前页 private int pageSize; // 每页条数 private long total; // 总条数 private List<T> list; // 当前页数据 // getter/setter 省略 } Servlet里拿到参数,调用Service,Service调Mapper,Mapper写XML——链条虽长,但每一步都干净利落。代码写多了你会烦,但烦归烦,这套流程十年没变过,稳如老狗。
到了前端HTML,才是分页真正"露脸"的地方。我见过不少人栽在这——后端数据给得明明白白,前端按钮死活点不动。其实就两件事:渲染页码,绑定点击事件。
<div id="pagination"></div> <script> function renderPage(total, pageNum, pageSize) { let totalPages = Math.ceil(total / pageSize); let html = ''; for (let i = 1; i <= totalPages; i++) { if (i === pageNum) { html += '<span class="current">' + i + '</span>'; } else { html += '<a href="#" onclick="go(' + i + ')">' + i + '</a>'; } } document.getElementById('pagination').innerHTML = html; } function go(page) { window.location.href = '/user/list?page=' + page + '&size=10'; } </script> 你看,跳转靠URL参数,简单粗暴。刷新页面直接带page参数,后端解析一下就能返回对应数据。这种传统同步方式虽然每次跳转都刷新整个页面,体验不够丝滑,但架不住它逻辑清晰——浏览器地址栏就是分页状态,收藏、分享、刷新全不丢。
真要做异步,无非把window.location换成fetch请求,后端返回JSON,前端再渲染表格和分页条。但新手别急着上Ajax,先把同步流程跑通,你才能理解"请求-响应"的本质。我见过太多人一上来就搞axios+vue,结果连pageNum从哪传的都说不清。
分页查询还有个坑:页码越界。用户手动改URL,page=9999,你怎么办?后端得做个兜底,要么返回空页,要么强制归位到最后一页。我的习惯是查总数时顺手把总页数算出来,page超出范围就直接重定向到最后一页,省得用户盯着白屏发呆。
另外说个细节,LIMIT的起始位置别用(page-1)*size硬算——万一page传了个负数,你查出来的数据就是错的。后端解析参数时记得做校验,小于1的统统按1处理。这行代码两秒钟写完,能省你半夜起来处理生产事故的力气。
最后分享个土办法,排查分页问题最快的方式是打印SQL。把MyBatis的日志级别调到DEBUG,看它实际执行的LIMIT语句是什么。八成问题都出在参数传递上——要么page没传过来,要么size被前端写死成了0。别问我怎么知道的,说多了都是泪。
分页入门就这样,没那么多花活。你把它想成去食堂打饭:师傅一次盛一勺,你吃完再去添。勺子大小就是pageSize,你排在第几轮就是pageNum。食堂阿姨永远不会把整锅饭扣你盘子里,分页也是这个理。
