zoukankan      html  css  js  c++  java
  • Java MyBatis3(3)分页插件PageHelper

    引言

      对于使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真不想花双倍的时间写count和select。

      PageHelper分页实现原理说明

    //设置分页信息保存到threadlocal中
    PageHelper.startPage(1, 10);
    //紧跟着的第一个select方法会被分页,contryMapper会被PageInterceptor截拦,截拦器会从threadlocal中取出分页信息,把分页信息加到sql语句中,实现了分页查旬
    List<Country> list = countryMapper.selectIf(1);
    PageHelper.startPage(currentPage, pageSize);

      其实一开始看到这段代码时候,我觉得应该是内存分页。其实插件对mybatis执行流程进行了增强,添加了limit以及count查询,属于物理分页。

      count查询,其实是PageHelper帮助我们生成的一个MappedStatement内存对象,它可以免去我们在XXXMapper.xml内单独声明一个sqlcount查询,我们只需要写一个sql分页业务查询即可。

    PageHelper部分源码

     解析sql,并增加分页参数占位符,或者生成count查询的sql,都依靠Parser来完成。

    public class MysqlParser extends AbstractParser {
        @Override
        public String getPageSql(String sql) {
            StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);
            sqlBuilder.append(sql);
            sqlBuilder.append(" limit ?,? ");
            return sqlBuilder.toString();
        }
    
        @Override
        public Map<String, Object> setPageParameter(MappedStatement ms, Object parameterObject, BoundSql boundSql, Page<?> page) {
            Map<String, Object> paramMap = super.setPageParameter(ms, parameterObject, boundSql, page);
            paramMap.put(PAGEPARAMETER_FIRST, page.getStartRow());
            paramMap.put(PAGEPARAMETER_SECOND, page.getPageSize());
            return paramMap;
        }
    }
    public abstract class AbstractParser implements Parser, Constant {
        public String getCountSql(final String sql) {
            return sqlParser.getSmartCountSql(sql);
        }
    }

    PageHelper实战代码

    <!--pageHelper分页插件 -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>1.1.1</version>
            </dependency>
    分页查询
    /**
         * 分页查询
         * @return
         */
        @RequestMapping("/GetStudentListByPage")
        public List<Student> GetStudentListByPage(@RequestParam(required = false, defaultValue = "1") int pageIndex,
                                                  @RequestParam(required = false, defaultValue = "10") int pageSize){
            Page page = PageHelper.startPage(pageIndex, pageSize);
            List<Student> students = studentMapper.list();
            for(Student student : students) {
                System.out.println(student.getName());
            }
            System.out.println("当前页码:"+page.getPageNum());
            System.out.println("当前页数:"+page.getPageSize());
            System.out.println("总页数:"+page.getPages());
            System.out.println("总条数:"+page.getTotal());
            System.out.println(page.toString());
            return students;
        }

    测试

    http://localhost:8080/GetStudentListByPage?pageIndex=1&pageSize=2

    参考资料 

    https://my.oschina.net/zudajun/blog/745232
    Mybatis分页插件PageHelper简单使用

    https://www.cnblogs.com/lxl57610/p/7766146.html

    https://www.jianshu.com/nb/5226994

  • 相关阅读:
    Spring-Context之四:Spring容器及bean的定义
    Spring-Context之三:使用XML和Groovy DSL配置Bean
    Spring-Context之二:使用Spring提供的测试框架进行测试
    Spring-Context之一:一个简单的例子
    ActiveMQ第五弹:增加ReDelivery功能
    百度云+ KeePass 网络同步你的密码
    git生成秘钥之后同步到服务器
    谷歌chrome浏览器和火狐firefox浏览器自带http抓包工具和请求模拟插件
    ltnmp
    CentOS 下安装xdebug
  • 原文地址:https://www.cnblogs.com/cnki/p/8849929.html
Copyright © 2011-2022 走看看