利用spring boot练习的小项目记录:分页操作

it2026-03-31  6

利用spring boot练习小项目,记录一下其中的一个小段,分页操作,遇到了个别小细节需要注意,也在此记录巩固一下。

mapper层:

@Mapper public interface DiscussPostMapper { // (根据用户)查找所有文章 List<DiscussPost> findDiscussPost(int userId,int offset, int limit); //总条数 int DiscussPostRows(@Param("userId") int userId); }

mapper.xml:

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.csf.dao.DiscussPostMapper"> <sql id="findFiles"> id,user_id,title,content,type,status,create_time,comment_count,score </sql> <select id="findDiscussPost" resultType="DiscussPost"> select <include refid="findFiles"></include> from discuss_post where status!=2 <if test="userId!=0"> and user_id=#{userId} </if> order by type desc,create_time desc limit #{offset},#{limit} </select> <select id="DiscussPostRows" parameterType="int" resultType="int"> select count(id) from discuss_post where status!=2 <if test="userId!=0"> and user_id=#{userId} </if> </select> </mapper>

yml:

server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/community?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai username: root password: root type: com.zaxxer.hikari.HikariDataSource hikari: maximum-pool-size: 15 minimum-idle: 5 idle-timeout: 30000 thymeleaf: prefix: classpath:/templates/ suffix: .html mode: HTML5 encoding: UTF-8 cache: false mybatis: mapper-locations: classpath:mapping/*.xml type-aliases-package: com.csf.entity configuration: use-generated-keys: true map-underscore-to-camel-case: true

pojo:

package com.csf.entity; public class Page { //当前页面 private int current=1; //每页显示的数据 private int limit=10; //页面跳转的路径 private String path; //总条数 private int rows; public int getCurrent() { return current; } public void setCurrent(int current) { if (current>0){ this.current = current; } } public int getLimit() { return limit; } public void setLimit(int limit) { if (limit>1 && limit <1000){ this.limit = limit; } } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public int getRows() { return rows; } public void setRows(int rows) { this.rows = rows; } //获取总页数 public int getTotal(){ if (rows % limit == 0){ return rows/limit; }else { return rows/limit+1; } } //当前页的起始行数 public int getiniRows(){ return current*limit-limit; } //获得起始页码 public int getInits(){ int initpage = current-2; return initpage<1?1:initpage; } //获得终止页码 public int getFinals(){ int finals = current+2; return finals>getTotal()?getTotal():finals; } }

业务层:

public interface DiscussPostService { // (根据用户)查找所有文章 List<DiscussPost> findDiscussPost(int userId, int offset, int limit); //总条数 int DiscussPostRows(int userId); } @Service public class DiscussPostServiceImpl implements DiscussPostService { @Autowired private DiscussPostMapper discussPostMapper; @Override public List<DiscussPost> findDiscussPost(int userId, int offset, int limit) { List<DiscussPost> discussPost = discussPostMapper.findDiscussPost(userId, offset, limit); return discussPost; } @Override public int DiscussPostRows(int userId) { int i = discussPostMapper.DiscussPostRows(userId); return i; } }

controller层:

@Controller @RequestMapping("/discuss") public class DiscussPostController { @Autowired private DiscussPostService discussPostService; @Autowired private UserService userService; @RequestMapping(value = "/findDis") public String findDiscussPost(Model model, Page page){ // 获取总行数 page.setRows(discussPostService.DiscussPostRows(0)); // 获取当前路径 page.setPath("/discuss/findDis"); List<DiscussPost> discussPostList = discussPostService.findDiscussPost(0, page.getiniRows(), page.getLimit()); List<Map<String,Object>> maplist = new ArrayList<>(); if (discussPostList != null){ for (DiscussPost disList:discussPostList) { User user = userService.findUserById(disList.getUserId()); Map<String,Object> map = new HashMap<>(); map.put("user",user); map.put("disList",disList); maplist.add(map); } } model.addAttribute("maplist",maplist); return "index"; } }

前端界面:

<!-- 分页 --> <nav class="mt-5"> <ul class="pagination justify-content-center" th:if="${page.rows>0}"> <li class="page-item"> <a class="page-link" th:href="@{${page.path}(current=1)}">首页</a> </li> <li th:class="|page-item ${page.current==1?'disabled':''}|"> <a class="page-link" th:href="@{${page.path}(current=${page.current-1})}">上一页</a> </li> <li th:class="|page-item ${page.current == i ?'active':''}|" th:each="i:${#numbers.sequence(page.inits,page.finals)}"> <a class="page-link" href="#" th:text="${i}">1</a> </li> <li class="page-item"> <a class="page-link" th:href="@{${page.path}(current=${page.current+1})}">下一页</a> </li> <li class="page-item"> <a class="page-link" th:href="@{${page.path}(current=${page.total})}">末页</a> </li> </ul> </nav>

实现界面: 有个点需要注意一下: 我在page实体类中自定义了一个getInits起始页码方法,get后面的I一定要注意要大写

//获得起始页码 public int getInits(){ int initpage = current-2; return initpage<1?1:initpage; }

要不然前端界面获取不到。

<li th:class="|page-item ${page.current == i ?'active':''}|" th:each="i:${#numbers.sequence(page.inits,page.finals)}"> <a class="page-link" href="#" th:text="${i}">1</a> </li>

细节一点!

后面可以用一下pageHelper插件进行分页操作!

最新回复(0)