欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java项目开发中实现分页的三种方式总结,

来源: javaer 分享于  点击 8838 次 点评:94

Java项目开发中实现分页的三种方式总结,


目录
  • 前言
  • 使用
    • 1、SpringDataJPA分页
    • 2、MyBatis分页
    • 3、Hutools工具类分页
  • 总结

    前言

    Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用方式也很简单,可本人在工作中除此以外还用到第三种更方便灵活的分页方式,在这里一同分享给大家。

    使用

    主要分为SpringDataJPA分页、MyBatis分页、Hutools工具类分页几个部分

    1、SpringDataJPA分页

    1)、引入依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    2)、Service中编写分页服务

    SpringDataJPA分页就是定义Pageable对象来处理分页,其中PageRequest来定义分页参数,Page对象来接手查询结果进行分页包装,包装后的结果pageResult可以得到总记录数、总页数、分页列表等数据结果。

    /**
     * 根据doctorId查询全部关注列表【分页】
     *
     * @param doctorId 医生id
     * @return 结果集
     */
    public Map<String, Object> findAllListByDoctorId(Long doctorId, Integer pageIndex, Integer pageSize) {
        Pageable pageable = PageRequest.of(pageIndex - 1, pageSize); // 分页
        Page<Follow> pageResult = followRepository.findByDoctorIdOrderByCreatedAtDesc(doctorId, pageable);
        List<FollowDTO> dtoList = followMapper.toDto(pageResult.getContent());
        if (!CollectionUtils.isEmpty(dtoList)) {
            // 处理业务逻辑....
        }
        // 封装分页结果
        Map<String, Object> map = new HashMap<>();
        map.put("pageIndex", pageIndex.toString()); // 当前页
        map.put("pageSize", pageSize.toString()); // 每页条数
        map.put("total", Long.toString(pageResult.getTotalElements())); // 总记录数
        map.put("pages", Integer.toString(pageResult.getTotalPages())); // 总页数
        map.put("list", dtoList); // 数据列表
        return map;
    }
    

    3)、Repository中处理分页

    这里就是继承JpaRepository对象,然后传入service中定义好的pageable对象,并且返回Page包装的结果即可。

    import com.patient.domain.Follow;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.jpa.repository.JpaRepository;
     
    @Repository
    public interface FollowRepository extends JpaRepository<Follow, Long> {
     
        Page<Follow> findByDoctorIdOrderByCreatedAtDesc(Long doctorId, Pageable pageable);
    }

    2、MyBatis分页

    1)、引入PageHelper依赖

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
    </dependency>

    2)、使用PageHelper实现分页

    /**
     * 查询推广人员列表,分页。
     * @return 封装的分页结果对象
     */
    public PageResult findPromotePersonList(String hospitalCode,PromotePersonReq promotePersonReq) {
        Integer pageIndex = promotePersonReq.getPageIndex();
        Integer pageSize = promotePersonReq.getPageSize();
        PageHelper.startPage(pageIndex, pageSize); // 每页的大小为pageSize,查询第page页的结果
        List<PromotePerson> list = promotePersonMapper.selectAll();
        PageInfo<PromotePerson> pageInfo = new PageInfo<>(list);
        PageHelper.clearPage();
        // 返回分页结果
        PageResult pageResult = new PageResult();
        pageResult.setPageIndex(pageIndex);
        pageResult.setPageSize(pageSize);
        pageResult.setPages(pageInfo.getPages());
        pageResult.setTotal((int) pageInfo.getTotal());
        pageResult.setList(list);
        return pageResult;
    }

    3、Hutools工具类分页

    1)、引入依赖

    这里是可以单独引入hutools部分工具类的,具体参考官网文档,我平时写项目一定会使用这个工具,所以直接引入了所有。

    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.1.2</version>
    </dependency>
    

    2)、分页实现

    一般就用到两个工具类,一是PageUtil.totalPage(总记录数, 每页记录数)来计算总页数,二是CollUtil.page(索引, 每页记录数, 数据列表)来返回指定分页结果,注意这里的索引是从1开始的,和SpringDataJPA分页索引从0开始有区别。

    /**
     * 我的订单-待支付[分页]
     *
     * @param openid 用户唯一标识
     * @return 结果集
     */
    public Map<String, Object> findMyOrderNotPay(String openid, Integer pageIndex, Integer pageSize) {
        Map<String, Object> map = new HashMap<>();
        // 查询
        List<ConsultOrder> orderList = consultOrderRepository.findMyOrderNotPay(openid);
        if (CollectionUtils.isEmpty(orderList)) {
                map.put("pageIndex", pageIndex.toString()); // 当前页
                map.put("pageSize", pageSize.toString()); // 每页条数
                map.put("total", "0"); // 总记录数
                map.put("pages", "0"); // 总页数
                map.put("list", new ArrayList<>()); // 数据列表
                return map;
        }
        List<OrderVO> pageList = new ArrayList<>();
        int totalSize = 0;
        int totalPage = 0;
        // 计算总页数
        totalSize = orderList.size();
            totalPage = PageUtil.totalPage(totalSize, pageSize);
        // 分页,索引小于等于总页数,才返回列表.
        if (pageIndex <= totalPage) {
                // 分页
                pageList = CollUtil.page(pageIndex, pageSize, orderVOList);
        }
        // 返回结果
        map.put("pageIndex", Integer.toString(pageIndex)); // 当前页
        map.put("pageSize", Integer.toString(pageSize)); // 每页条数
        map.put("total", Integer.toString(totalSize)); // 总记录数
        map.put("pages", Integer.toString(totalPage)); // 总页数
        map.put("list", pageList); // 数据列表
        return map;
    }

    总结

    1)、注意 :为了方便演示代码中直接用了Map对象来包装返回分页结果,在实际项目中,切记一定要自己定义实体对象作为返回结果,因为Map对象返回的结果如果是动态且数据量较大的列表,是存在造成内存泄露风险的,举个例子,比如返回10条问诊的分页记录时,其中聊天内容这个属性包含大量聊天数据,因为你无法确定对话的两个人到底聊了多少,可它确实作为一个属性包含在分页记录中;

    2)、SpringDataJPA分页,就是使用自带的Pageable对象来处理,需要注意的是分页索引从0开始,传错了会造成分页结果错乱或重复的现象;

    3)、Mybatis分页,就是借助PageHelper工具来实现,PageHelper.startPage和PageHelper.clearPage中间是需要分页的业务查询代码,可以通过PageInfo对象包装,获取其中需要的分页参数返回给前端展示;

    4)、Hutools分页,就是引入hutools工具类,使用其中的PageUtil和CollUtil工具类来实现,这种方式我个人比较喜欢,因为在较复杂的查询业务中,前两种实现起来很费劲还容易写错,不仅可能牵扯到多个类及方法,写完后过段时间也不容易阅读。而Hutools分页就类似于很早以前的分页方式,我把它理解为绿色简易版JSP分页,只需在服务层使用一个工具类分页即可,既灵活又便于阅读,简直是分页的神器。

    到此这篇关于Java项目开发中实现分页的三种方式的文章就介绍到这了,更多相关Java实现分页的三种方式内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

    您可能感兴趣的文章:
    • Java分页查询--分页显示(实例讲解)
    • Java实现简单的分页功能
    • Java实现分页代码
    • java实现分页显示效果
    • Java分页工具类及其使用(示例分享)
    • java分页工具类的使用方法
    • Java实现分页的前台页面和后台代码
    相关栏目:

    用户点评