Java 如何做分页
在做网站或者APP的时候,你肯定遇到过这样的情况:打开一个商品列表,总不能把几十上百条数据全堆在一页吧?不仅加载慢,看着也乱。这时候“分页”就派上用场了,而Java作为常用的开发语言,实现分页的思路其实没那么复杂,跟着生活化的例子一步步来,很快就能搞懂。
先搞懂分页的核心逻辑
举个例子,你翻杂志的时候,每页固定放10篇文章,第1页看前10篇,第2页看接下来的10篇,第5页就看第41到50篇。Java里的分页,本质就是两件事:

- 算清楚“从第几条数据开始取”,比如第3页每页10条,就是从第21条开始;
- 只取数据库里对应的那部分数据,不用把所有数据拉出来再筛选——不然数据多了会卡死。
用最基础的方式实现(适合新手)
新手刚开始做分页,用最直白的方法就能搞定,不用复杂框架。假设你要做一个图书列表,数据库里有个book表,存了所有图书信息。
第一步,先让用户告诉我们两个关键信息:“要看第几页”和“每页放多少条数据”。比如用户说看第2页,每页5条,那这两个参数就是pageNum=2,pageSize=5。
第二步,计算“起始位置”,公式很简单:起始位置 = (页码 - 1) × 每页条数。代入刚才的例子,就是(2-1)×5=5,意思是从数据库的第6条数据开始取(注意数据库的计数是从0开始的)。
第三步,写数据库查询语句的时候,加上LIMIT和OFFSET(不同数据库可能写法不一样,MySQL就是这个)。比如刚才的需求,语句就是SELECT * FROM book LIMIT 5 OFFSET 5,翻译过来就是“取5条数据,从第5个位置开始”,刚好是第6到10条,对应第2页的内容。
这个方法的好处是不用依赖任何工具,写几句代码就能跑。但如果数据量很大,比如数据库有100万条数据,每次算起始位置都要扫过前面的所有数据,效率会低一点,不过做小型项目完全够用。
用框架简化工作(适合实际开发)
真的做项目时,没人会自己写公式算起始位置,太麻烦。常用的Spring框架里,有专门的分页工具帮你搞定这些。
比如用MyBatis做数据库操作,你只需要定义一个Page对象,把pageNum和pageSize传进去,框架会自动帮你算起始位置,不用手动写公式。查询的时候,直接告诉框架“给我对应页的数据”就行,连数据库的LIMIT语句都不用自己拼。
举个例子,你要查用户的订单列表,代码大概是这样:先创建Page page = new Page<>(2, 5);,就是要第2页,每页5条;然后调用查询方法orderMapper.selectOrders(page);,框架会自动返回对应页的订单数据,连总共有多少条数据、总共有多少页这些信息,也会一起封装好,方便你给前端显示“共100条,第2页/20页”这样的提示。
这种方法的好处是省事,还能自动处理很多边界问题,比如用户输入的页码是负数,框架会自动改成第1页,不会出bug。
实际开发的小提醒
最后说两个容易踩的坑:一是别把分页逻辑全放在前端做——要是有人改了前端传的pageSize,把每页改成1000条,一下子就能把数据库压垮,分页必须在后端做;二是如果要做复杂的排序,比如按“发布时间”倒序,要把排序条件也和分页参数一起传给后端,不然可能会出现“第1页和第2页重复数据”的情况。
其实Java做分页的核心就是“按需取数据”,不管是自己写SQL还是用工具,本质都是从数据库里只拿需要的那部分,把复杂的计算藏在代码里,用户只需要点页码就能切换内容,这就是分页的意义。