pageHelper使用以及可能会踩到的坑

pageHelper使用以及可能会踩到的坑

源于最近的一个需求,需要重构一个列表查询方式;

  1. 对于最简单的列表查询方式就是这种:
public PageInfo<TestDo> getPageList(...) {

PageHelper.startPage(pageCondition.getPage(), pageCondition.getSize());
List<TestDo> testDos = testDao.selectByXXX(条件1, 条件2, 条件3...);
PageInfo<TestDo> doPageInfo = new PageInfo<>(testDos);
......
return doPageInfo;
}
  1. 乍一看觉得很简单,其实也能够解决很多简单的需求,但在开发过程中大多程序员都会去包装自己想要的数据,比如可以做成这种
public PageInfo<TestVo> getPageList(...) {

PageHelper.startPage(pageCondition.getPage(), pageCondition.getSize());
List<TestDo> testDos = testDao.selectByXXX(条件1, 条件2, 条件3...);
PageInfo<TestDo> doPageInfo = new PageInfo<>(testDos);

List<TestVo> vos = new ArrayList<>();
for(TestDo testDo : testDos) {
   TestVO testVo = new TestVo();
   testVo.setXXX(testDo.getXXX);
   ...
   vos.add(testVo);
}
PageInfo<TestVo> voPageInfo = new PageInfo<>(vos);
try {
    BeanUtils.copyProperties(doPageInfo, voPageInfo, "list");
    } catch (Exception e) {
      log.error("this exception is" + e.getMessage());
    }
return voPageInfo;

这里是用了vo去包装数据之后再返回,是不是很方便

  1. 那如果有更复杂的查询条件呢,一般简单的列表查询都只是需要一条sql查询就能解决,而pageHelper也是只作用于最近的一次查询,但在实际业务中,查询条件千变万化,这时候一条sql很明显是不满足的,比如:
PageHelper.startPage(pageCondition.getPage(), pageCondition.getSize());
List<TestDo> testDos = testDao.selectByXXX(条件1, 条件2, 条件3);
条件45。。。。。。?

到这里,我们有些查询条件是sql执行不了的,这时候就需要在已查询到的数据中去处理,上一块代码查询到的结果为testDos,下面我们就要利用这个testDos去做筛选

List<TestDo> newTestList = new ArrayList<>();
PageHelper.startPage(pageCondition.getPage(), pageCondition.getSize());
List<TestDo> testDos = testDao.selectByXXX(条件1, 条件2, 条件3);
PageInfo<TestDo> doPageInfo = new PageInfo<>(testDos);
if (条件4) {
//业务处理
newTestList.add(XXX);
}
if (条件5) {
//业务处理
newTestList.add(XXX);
}

List<TestVo> vos = new ArrayList<>();
for(TestDo testDo : newTestList) {
   TestVO testVo = new TestVo();
   testVo.setXXX(testDo.getXXX);
   ...
   vos.add(testVo);
}
PageInfo<TestVo> voPageInfo = new PageInfo<>(vos);
try {
    BeanUtils.copyProperties(doPageInfo, voPageInfo, "list");
    } catch (Exception e) {
      log.error("this exception is" + e.getMessage());
    }
return voPageInfo;
}

这种和第2部分其实是一样的,就是我们处理的数据多了一层(条件4,5),到这里其实已经能够满足大部分的需求了。

下面我开始说这里有可能会踩的坑:


踩坑:

  1. PageHelper.startPage(pageCondition.getPage(), pageCondition.getSize()); 这一句只作用于最近的一次查询,所以尽量不要因为sql语句比较复杂而分开写多条sql
  2. 在我第三部分的代码中,注意:PageInfo doPageInfo = new PageInfo<>(testDos);这句代码,我们是把原始查询到的数据进行了new PageInfo,而不是:PageInfo<> doPageInfo = new PageInfo<>(newTestList); ,如果对于包装后的数据 进行此操作,会导致分页的total数量上的错误,从而无法正常分页;具体原因请仔细思考第一条加粗字体,最好是能看一下源码

欢迎大家来补充,有什么问题尽管提,我是一个只有两年经验的Java语言初级工程师。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值