Spring分页功能

本文介绍了如何在Java后端使用Mapper接口实现分页查询,并在业务层进行处理,最后在Thymeleaf模板中动态展示分页。通过创建Page类封装分页信息,包括当前页码、显示上限、数据总数和查询路径。在Controller中,利用Page对象传递分页数据,并在HTML页面中生成动态分页链接。
摘要由CSDN通过智能技术生成

一、创建一个Page类,封装分页相关的信息

/**
 * 封装分页的相关信息:
 * 当前页码、显示上限、数据总数、查询路径
 * 获取当前页起始行、获取总页数、获取起始页码、获取结束页码
 */
public class Page {

    // 当前页码
    private int current = 1;
    // 显示上限
    private int limit = 10;
    // 数据总数(用于计算总页数)
    private int rows;
    // 查询路径(用于复用分页链接)
    private String path;


    public int getCurrent() {
        return current;
    }

    public void setCurrent(int current) {
        if(current >= 1){
            this.current = current;
        }
    }

    public int getLimit() {
        return limit;
    }

    public void setLimit(int limit) {
        if(limit >= 1 && limit <=100){
            this.limit = limit;
        }
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        if(rows >= 0){
            this.rows = rows;
        }
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    /**
     * 获取当前页的起始行
     * @return
     */
    public int getOffset(){
        return (current - 1) * limit;
    }

    /**
     * 获取总页数
     * @return
     */
    public int getTotal(){
        if(rows % limit == 0){
            return rows/limit;
        }else {
            return rows/limit + 1;
        }
    }

    /**
     * 获取起始页码
     * @return
     */
    public int getFrom(){
        int from = current - 2;
        return from < 1 ? 1 : from;
    }

    /**
     * 获取结束页码
     * @return
     */
    public int getTo(){
        int to = current + 2;
        return to > getTotal() ? getTotal() : to;
    }
}

二、逐层实现分页功能

2.1 在数据层(Mapper)写分页查询的方法,并实现

@Mapper
public interface DiscussPostMapper {

    List<DiscussPost> selectDiscussPosts(int userId,int offset,int limit);

}

2.2 在业务层(Service)实现分页的操作

@Service
public class DiscussPostService {

    @Autowired
    private DiscussPostMapper discussPostMapper;

    public List<DiscussPost> findDiscussPosts(int userId,int offset,int limit){
        return discussPostMapper.selectDiscussPosts(userId,offset,limit);
    }
}

2.3 在视图层(Controller)中把Page对象作为参数传入方法中

@RequestMapping(path = "/index",method = RequestMethod.GET)
    public String getIndexPage(Model model, Page page){
        // 方法调用前,SpringMVC会自动实例化Model和Page,并将Page注入Model
        // 所以,在thymeleaf中可以直接访问Page对象中的数据
        page.setRows(discussPostService.findDiscussPostRows(0));
        page.setPath("/index");

        List<DiscussPost> list = discussPostService.findDiscussPosts(0, page.getOffset(), page.getLimit());
        List<Map<String,Object>> discussPosts = new LinkedList<>();
        if(list != null){
            for (DiscussPost post : list) {
                User user = userService.findUserById(post.getUserId());
                Map<String,Object> map = new HashMap<>();
                map.put("post",post);
                map.put("user",user);
                discussPosts.add(map);
            }
        }
        model.addAttribute("discussPosts",discussPosts);
        return "/index";
    }

三、在html页面实现动态分页功能

<html lang="en" xmlns:th="http://www.thymeleaf.org">

<!-- 分页 -->
<nav class="mt-5" th:if="${page.rows>0}">
    <ul class="pagination justify-content-center">
	    <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.from,page.to)}">
		    <a class="page-link" th:href="@{${page.path}(current=${i})}" th:text="${i}">1</a>
	    </li>
	    <li th:class="|page-item ${page.current==page.total?'disabled':''}|">
		    <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>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring中进行分页查询可以使用Spring Data JPA或者MyBatis-Plus等框架提供的分页功能。 使用Spring Data JPA进行分页查询的步骤如下: 1. 在你的实体类对应的Repository接口中继承`org.springframework.data.repository.PagingAndSortingRepository`接口或者`org.springframework.data.jpa.repository.JpaRepository`接口。 2. 在你的Service类中注入该Repository。 3. 在Service类中使用`Pageable`对象来指定分页参数,例如页码、每页数据条数等。 4. 调用Repository的分页查询方法,传入`Pageable`对象作为参数,获取到分页结果。 下面是一个使用Spring Data JPA进行分页查询的示例代码: ```java @Service public class UserService { @Autowired private UserRepository userRepository; public Page<User> getUsersByPage(int page, int size) { Pageable pageable = PageRequest.of(page, size); return userRepository.findAll(pageable); } } ``` 在上面的示例中,我们在UserService中注入了UserRepository,并定义了一个方法`getUsersByPage`来实现分页查询。通过调用`userRepository.findAll(pageable)`方法来执行分页查询,并将结果封装在`Page`对象中返回。 除了Spring Data JPA,如果你使用MyBatis-Plus框架,它也提供了方便的分页查询功能。你可以使用`com.baomidou.mybatisplus.extension.plugins.pagination.Page`对象来设置分页参数,并通过调用MyBatis-Plus的分页查询方法来获取分页结果。 希望以上信息对你有帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李巴巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值