mybatis+pageHelper分页失败

叶俊郎
2023-12-01

失败原因

  1. service中多个查询sql
  2. 对查询出的list数据,进行后续处理

分页

1.前端页面分页,调用后台请求时,传递分页参数
//一般在查询参数中定义分页变量

queryParams: {
  pageNum: 1,
  pageSize: 10},

//页面添加分页组件,传入分页变量

<pagination
  v-show="total>0":total="total":page.sync="queryParams.pageNum":limit.sync="queryParams.pageSize"@pagination="getList"
/>

//调用后台方法,传入参数 获取结果

listUser(this.queryParams).then(response =>{
    this.userList =response.rows;
    this.total =response.total;
  }
);
  1. 后台开启分页
@PostMapping("/list")
@ResponseBody
publicTableDataInfo list(User user)
{
    startPage();  //此方法配合前端完成自动分页
    List<User> list =userService.selectUserList(user);
    returngetDataTable(list);
}

startPage开启分页解析,进入startPage 代码

protected voidstartPage()
    {
        PageDomain pageDomain =TableSupport.buildPageRequest();
        Integer pageNum =pageDomain.getPageNum();
        Integer pageSize =pageDomain.getPageSize();
        if (StringUtils.isNotNull(pageNum) &&StringUtils.isNotNull(pageSize))
        {
            String orderBy =SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
            PageHelper.startPage(pageNum, pageSize, orderBy);
        }
    }

最终是调用的MyBatis的PageHelper来进行分页,只需要给其传递分页所需的两个参数和排序字段即可。
那么这两个分页参数时来自pageDomain这个实体类。
进入到生成这个实体类的方法

TableSupport.buildPageRequest
public staticPageDomain buildPageRequest()     {        
				returngetPageDomain();     
}

返回的是getPageDomain这个方法的返回值,进入到该方法

public staticPageDomain getPageDomain()
    {
        PageDomain pageDomain = newPageDomain();
        pageDomain.setPageNum(ServletUtils.getParameterToInt(PAGE_NUM));
        pageDomain.setPageSize(ServletUtils.getParameterToInt(PAGE_SIZE));
        pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
        pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
        returnpageDomain;
    }

可以看到此实体类的分页的参数是从工具类ServletUtils中获取的参数,时从request中获取的分页参数
其中ServletUtils是客户端工具类
获取分页参数时调用的getParameterToInt定义如下

 /**
     * 获取Integer参数
     */
    public staticInteger getParameterToInt(String name)
    {
        returnConvert.toInt(getRequest().getParameter(name));
    }

调用了getRequest方法,此方法定义如下

  /**
     * 获取request
     */
    public staticHttpServletRequest getRequest()
    {
        returngetRequestAttributes().getRequest();
    }

此方法是获取request请求参数
而request请求对象是来自会话session,所以在

getRequestAttributes中
   public staticServletRequestAttributes getRequestAttributes()
    {
        RequestAttributes attributes =RequestContextHolder.getRequestAttributes();
        return(ServletRequestAttributes) attributes;
    }
  1. mybatis中查询到的list
    查询到的集合时Page类型的。若直接返回时,分页正常。若对集合进行类型转化或其他处理,将丢失Page对象的total,导致查询到的分页总数正确。

PageHelper只会对startpage开启后的第一个sql进行分页,并且分页后不能进行其他处理。否则分页失败。
解决:
1.查询到Page集合后,获取total总数
2.在对集合进行其他处理
3.整合集合和total

 类似资料: