mybatis—pageHelper插件的使用以及使用过程中的问题

pageHelper插件的使用

  1. 导入pageHelper的jar包

    <dependency>
          <groupId>com.github.pagehelpergroupId>
          <artifactId>pagehelperartifactId>
          <version>4.1.4version>
    dependency>
    
  2. 在mybatis.xml文件中配置

    <typeAliases>
          <package name="com.tijian.entity"/>
    typeAliases>
    
    <plugins>
          <plugin interceptor="com.github.pagehelper.PageHelper">
              <property name="dialect" value="mysql"/>
          plugin>
    plugins>
    
  3. 写一个sql语句,返回的结果为list

    select * from worker order by wno
    
  4. service层

    public List<Worker> getAllWorkers() {
          List<Worker> allWorkers = managerDao.getAllWorkers();
          return allWorkers;
    }
    
  5. controller层

    @RequestMapping(value = "/manager")
        public ModelAndView manager(HttpServletRequest request,
                                    @RequestParam(required = true, defaultValue = "1") Integer pageIndex) {
             ModelAndView mav = new ModelAndView();
            //获取第pageIndex页,每页10条数据
            PageHelper.startPage(pageIndex, 10);
          	//紧跟着第一个select方法会被分页,后面的不会被分页,除非再次调用PageHelper.startPage
            List<Worker> allWorkers = managerService.getAllWorkers();
            //用pageInfo对结果进行包装
            PageInfo<Worker> pagehelper = new PageInfo<Worker>(allWorkers);
            mav.addObject("page", pagehelper);
            mav.addObject("workers", allWorkers);
            mav.setViewName("manager");
            return mav;
        }
    
  6. pageInfo类,pegeInfo是插件里面的类,包含了非常全面的分页属性

    在使用pageInfo这个类的时候,要将查询出来的list放到pageInfo中去

    List<Worker> allWorkers = managerService.getAllWorkers();
    PageInfo<Worker> pagehelper = new PageInfo<Worker>(allWorkers);
    
    //当前页
    private int pageNum;
    //每页的数量
    private int pageSize;
    //当前页的数量
    private int size;
    //排序
    private String orderBy;
    
    //由于startRow和endRow不常用,这里说个具体的用法
    //可以在页面中"显示startRow到endRow 共size条数据"
    
    //当前页面第一个元素在数据库中的行号
    private int startRow;
    //当前页面最后一个元素在数据库中的行号
    private int endRow;
    //总记录数
    private long total;
    //总页数
    private int pages;
    //结果集
    private List<T> list;
    
    //第一页
    private int firstPage;
    //前一页
    private int prePage;
    //下一页
    private int nextPage;
    //最后一页
    private int lastPage;
    
    //是否为第一页
    private boolean isFirstPage = false;
    //是否为最后一页
    private boolean isLastPage = false;
    //是否有前一页
    private boolean hasPreviousPage = false;
    //是否有下一页
    private boolean hasNextPage = false;
    //导航页码数
    private int navigatePages;
    //所有导航页号
    private int[] navigatepageNums;
    
  7. jsp页面

    
    	
  8. 首页
  9. 上一页
  10. ${p}
  11. 下一页
  12. 尾页
  13. 结果测试(没有加样式)

在这里插入图片描述

问题

  • 当进行多表查询时,pageTotal总条数被改成了pageSize

原因

网上查找的原因

  1. PageHelper.startPage(pageIndex, 10);
    //查询语句
    pageInfo...
    

    再startPage之后,只能进行一次查询的操作,如果sql里面进行了多次查询,就会导致pageInfo的Total是当前页的总条数。

  2. 我在service层中取出数据做了别的操作,导致在controller里面取出数据时就有问题了。

解决

  1. 在网上看到的一种思路是通过手动赋值pageTotal
List<State> stateList1 = managerService.getState();//在分页之前先查询一次,这次查询结果的总条数没有问题
PageHelper.startPage(pageIndex, 10);
List<State> stateList = managerService.getState();
PageInfo<State> page = new PageInfo<>(stateList);
page.setTotal(stateList1.size());//给pageInfo设置Total

但是这种方法不能解决我的问题

我的原因

我通过一个左连接的sql查出来的list,在service层对查出来的数据做了一些操作,返回的是另外一个list

sql:

select w.wno, w.wname, d.height, d.weight, d.heart, d.blood
        from worker w LEFT JOIN data d
        on w.wno=d.no
        order by wno

service:

public List<state>getState(){
    List<state> stateList = new ArrayList<>();
    List<state> resultS = managerDao.selectAll();
    if () {
        //判断操作
        stateList.add(...);
    }
    return stateList;
}

controller:

PageHelper.startPage(pageIndex, 10);
List<state> stateList = managerService.getState();
PageInfo<state> page = new PageInfo<>(stateList);

最后的解决方法是在service层返回通过sql查出来的List,而不是我在service层new的List

pageInfo应该是对sql语句查出来的List进行分页操作,不能对我new出来的List进行分页操作

你可能感兴趣的:(技术问题)