今天看了看pagehelper的相关东西,发现它的原理是通过配置了一个mybaits拦截器,拦截到
PageHelper.startPage(page, rows);
之后第一个查询语句,然后将其拼接成不同的sql再进行查询
@Override
public String getPageSql(String sql, Page page, CacheKey pageKey) {
StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);
sqlBuilder.append(sql);
if (page.getStartRow() == 0) {
sqlBuilder.append(" LIMIT ");
sqlBuilder.append(page.getPageSize());
} else {
sqlBuilder.append(" LIMIT ");
sqlBuilder.append(page.getStartRow());
sqlBuilder.append(",");
sqlBuilder.append(page.getPageSize());
pageKey.update(page.getStartRow());
}
pageKey.update(page.getPageSize());
return sqlBuilder.toString();
}
并且,克隆并包装了原本要返回的对象,使用了分页助手后返回的对象类型已经为ArrayList类型,但是在前后台json数据交互时,由于Page对象继承自ArrayList,json不会保留其分页信息,所以在使用时往往转为PageInfo(没有继承ArrayList),将你的PageInfo<Object>返回给前台就可以了。
至此,我们可以看到PageHelper的优缺点。
优点:封装分页sql,使我们不需要每个地方都去写分页的查询语句;同时,使我们select的sql语句向下兼容,换了数据库也不需要更改sql代码;
缺点:自带的Page对象转json时会丢失分页数据;而转为PageInfo对象时分页信息过多(这一点作者已在github上说明,建议自己实现PageInfo)