pageHelper使用以及可能会踩到的坑
源于最近的一个需求,需要重构一个列表查询方式;
- 对于最简单的列表查询方式就是这种:
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;
}
- 乍一看觉得很简单,其实也能够解决很多简单的需求,但在开发过程中大多程序员都会去包装自己想要的数据,比如可以做成这种
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去包装数据之后再返回,是不是很方便
- 那如果有更复杂的查询条件呢,一般简单的列表查询都只是需要一条sql查询就能解决,而pageHelper也是只作用于最近的一次查询,但在实际业务中,查询条件千变万化,这时候一条sql很明显是不满足的,比如:
PageHelper.startPage(pageCondition.getPage(), pageCondition.getSize());
List<TestDo> testDos = testDao.selectByXXX(条件1, 条件2, 条件3);
条件4,5。。。。。。?
到这里,我们有些查询条件是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),到这里其实已经能够满足大部分的需求了。
下面我开始说这里有可能会踩的坑:
踩坑:
- PageHelper.startPage(pageCondition.getPage(), pageCondition.getSize()); 这一句只作用于最近的一次查询,所以尽量不要因为sql语句比较复杂而分开写多条sql
- 在我第三部分的代码中,注意:PageInfo doPageInfo = new PageInfo<>(testDos);这句代码,我们是把原始查询到的数据进行了new PageInfo,而不是:
PageInfo<> doPageInfo = new PageInfo<>(newTestList);,如果对于包装后的数据 进行此操作,会导致分页的total数量上的错误,从而无法正常分页;具体原因请仔细思考第一条加粗字体,最好是能看一下源码
欢迎大家来补充,有什么问题尽管提,我是一个只有两年经验的Java语言初级工程师。