最全分页查询

java项目实战分页查询

1.使用MybaitisPlus分页查询(主要针对单张表)

使用MybatisPlus分页查询组件针对的是数据库中的单张表查询,如果要操作多张表,可以建立一个多张表的视图,这样既可以使用QueryWrapper条件查询也可以进行分页。
引入mybaitisPlus分页插件maven(忽略)

接口:
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
public interface CropGrowService extends IServiceDto<CropGrowDto> {

    public Page<CropGrowVO> getCropGrowInfo(String startTime, String endTime, String farmCode, String cropType, Integer pageIndex, Integer pageSize);
}
实现类
```java
@Override
    public Page<CropGrowVO> getCropGrowInfo(String startTime, String endTime, String farmCode, String cropType, Integer pageIndex, Integer pageSize){
        Page<CropGrow> page = new Page(pageIndex,pageSize);
        LambdaQueryWrapper<CropGrow> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(CropGrow::getFieldCode,farmCode).eq(CropGrow::getCropType,cropType).between(CropGrow::getOccurDate,startTime,endTime).orderByDesc(CropGrow::getOccurDate);
        Page<CropGrow> pageResult = this.page(page, wrapper);
        List<CropGrowVO> cropGrowVOS = BeanConvertUtils.sourceToTarget(pageResult.getRecords(), CropGrowVO.class);
        Page resultPage = new Page();
        resultPage.setTotal(pageResult.getTotal());
        resultPage.setRecords(cropGrowVOS);
        return resultPage;
    }

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工具类分页(针对多张表查询的集合,推荐,配合java8stream流进行条件分页,功能十分强大)

1)、引入依赖

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

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

public ResponseMessage<Map<String, Object>> getDeviceInfoInfo(Integer pageNo, Integer pageSize,
                                                                  String categoryName, String statusValue, String deviceName) {
        List<DeviceInfo> deviceInfo = deviceService.getBaseMapper().getDeviceInfo();

        if (!Objects.isNull(categoryName)){
            deviceInfo = deviceInfo.stream().filter(deviceInfo1 -> deviceInfo1.getCategoryName().equals(categoryName)).collect(Collectors.toList());
        }
        if (!Objects.isNull(statusValue)){
            deviceInfo = deviceInfo.stream().filter(deviceInfo1 -> deviceInfo1.getStatusValue().equals(statusValue)).collect(Collectors.toList());
        }
        if (!Objects.isNull(deviceName)){
            deviceInfo = deviceInfo.stream().filter(deviceInfo1 -> deviceInfo1.getDeviceName().contains(deviceName)).collect(Collectors.toList());
        }
        List<DeviceVo> deviceVos = new ArrayList<>();
        if (!CollectionUtils.isEmpty(deviceInfo)){
            deviceVos = BeanConvertUtils.sourceToTarget(deviceInfo, DeviceVo.class);
        }
        int totalSize = 0;
        int totalPage = 0;
        if (Objects.isNull(pageNo)){
            pageNo = 1;
        }
        List<DeviceVo> pageList = new ArrayList<>();
        totalSize = deviceVos.size();
        if (Objects.isNull(pageSize)){
            pageSize = totalSize;
        }
        Map<String, Object> map = new HashMap<>();
        if (CollectionUtils.isEmpty(deviceVos)||deviceVos.size()==0){
            map.put("pageIndex", pageNo.toString()); // 当前页
            map.put("pageSize", pageSize.toString()); // 每页条数
            map.put("total", "0"); // 总记录数
            map.put("pages", "0"); // 总页数
            map.put("data", new ArrayList<>()); // 数据列表
            return ResponseMessage.ok(map);
        }
        if (totalPage==pageSize){
            totalPage = 1;
        }else {
            totalPage = PageUtil.totalPage(totalSize,pageSize);
        }
        if (pageNo<totalPage){
        // 分页
            pageList = CollUtil.page(pageNo,pageSize,deviceVos);
        }else {
            pageList = deviceVos;
        }
        map.put("pageIndex", Integer.toString(pageNo)); // 当前页
        map.put("pageSize", Integer.toString(pageSize)); // 每页条数
        map.put("total", Integer.toString(totalSize)); // 总记录数
        map.put("pages", Integer.toString(totalPage)); // 总页数
        map.put("data", pageList); // 数据列表
        return ResponseMessage.ok(map);
    }

这里是当不输入当前页和每页条数时,也即为空,则会显示当前页为1的所有记录条数,当输入的当前页和每页条数不为空,则按照不为空进行分页。

4.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);
}

总结:
1)、SpringDataJPA分页,就是使用自带的Pageable对象来处理,需要注意的是分页索引从0开始,传错了会造成分页结果错乱或重复的现象;
2)、Mybatis分页,就是借助PageHelper工具来实现,PageHelper.startPage和PageHelper.clearPage中间是需要分页的业务查询代码,可以通过PageInfo对象包装,获取其中需要的分页参数返回给前端展示;
3)、Mybatisplus分页,通过引入pagination.Page组件包,使用Page进行分类也可以实现简单简洁的分类效果,在单张表时比较强大(结合queryWrapper分页条件查询),但是对于多张表的查询结果不太适配,无法对多张表的集合进行适配。
4)、Hutools分页,就是引入hutools工具类,使用其中的PageUtil和CollUtil工具类来实现,这种方式我个人比较喜欢,因为在较复杂的查询业务中,前两种实现起来很费劲还容易写错,不仅可能牵扯到多个类及方法,写完后过段时间也不容易阅读。而Hutools分页就类似于很早以前的分页方式,我把它理解为绿色简易版JSP分页,只需在服务层使用一个工具类分页即可,既灵活又便于阅读,简直是分页的神器。
参考共享连接:https://zhuanlan.zhihu.com/p/464112488

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值