zoukankan      html  css  js  c++  java
  • MyBatis分页插件使用

    导入相关依赖

    <!--mybatis 分页插件-->
    <dependency>
    	<groupId>com.github.pagehelper</groupId>
    	<artifactId>pagehelper</artifactId>
    	<version>${pagehelper.version}</version>
    </dependency>
    

    mybatis-config.xml 配置

    <!--注册分页插件-->
    <plugins>
    	<plugin interceptor="com.github.pagehelper.PageInterceptor">
    		<!--分页参数合理化-->
    		<property name="reasonable" value="true"/>
    	</plugin>
    </plugins>
    

    分页插件其他参数

    • dialect:默认情况下会使用 PageHelper方式进行分页,如果想要实现自己的分页逻辑,可以实现 Dialect(com.github.PageHelper.Dialect)接口,然后配置该属性为实现类的全限定名称。
    • helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
      特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
      你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。
    • offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。
    • rowBoundsWithCount:默认值为false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。
    • pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
    • reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
    • params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
    • supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。
    • autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver),用法和注意事项参考下面的场景五。
    • closeConn:默认值为 true。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为 false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。
    • aggregateFunctions(5.1.5+):默认为所有常见数据库的聚合函数,允许手动添加聚合函数(影响行数),所有以聚合函数开头的函数,在进行 count 转换时,会套一层。其他函数和列会被替换为 count(0),其中count列可以自己配置。

    重要提示
    当 offsetAsPageNum=false 的时候,由于 PageNum 问题,RowBounds查询的时候 reasonable 会强制为 false。使用 PageHelper.startPage 方法不受影响。

    使用

    PageHelper.startPage(page,pageSize); // 设置页码和页面大小(该方法一定位于查询方法之前调用)
    List<User> users = UserMapper.queryUsers(); //执行的查询方法
    PageInfo<?> pageList = new PageInfo<>(User); // 将查到的对象转为pageInfo
    

    PageSerializable

    • pageInfo 集成 PageSerializable,在 PageSerializable中记录有总记录数和结果集,这些属性均可以通过 set,get方法取到
      image
    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package com.github.pagehelper;
    
    import java.io.Serializable;
    import java.util.Collection;
    import java.util.List;
    
    public class PageInfo<T> implements Serializable {
        private static final long serialVersionUID = 1L;
        //当前页
        private int pageNum;   
        //每页的数量
        private int pageSize;
        //当前也的数量
        private int size;
        //当前页面第一个元素在数据库中的行号
        private int startRow;
        //当前页面最后一个元素在数据库中的行号
        private int endRow;
        //总记录数
        private long total;
        //总页数
        private int pages;
        //结果集
        private List<T> list;
        //前一页
        private int prePage;
        //下一页
        private int nextPage;
        private boolean isFirstPage;
        private boolean isLastPage;
        private boolean hasPreviousPage;
        private boolean hasNextPage;
        //导航页码数
        private int navigatePages;
        //所有导航页
        private int[] navigatepageNums;
        private int navigateFirstPage;
        private int navigateLastPage;
    
        public PageInfo() {
            this.isFirstPage = false;
            this.isLastPage = false;
            this.hasPreviousPage = false;
            this.hasNextPage = false;
        }
    
        public PageInfo(List<T> list) {
            this(list, 8);
        }
    
        public PageInfo(List<T> list, int navigatePages) {
            this.isFirstPage = false;
            this.isLastPage = false;
            this.hasPreviousPage = false;
            this.hasNextPage = false;
            if(list instanceof Page) {
                Page page = (Page)list;
                this.pageNum = page.getPageNum();
                this.pageSize = page.getPageSize();
                this.pages = page.getPages();
                this.list = page;
                this.size = page.size();
                this.total = page.getTotal();
                if(this.size == 0) {
                    this.startRow = 0;
                    this.endRow = 0;
                } else {
                    this.startRow = page.getStartRow() + 1;
                    this.endRow = this.startRow - 1 + this.size;
                }
            } else if(list instanceof Collection) {
                this.pageNum = 1;
                this.pageSize = list.size();
                this.pages = this.pageSize > 0?1:0;
                this.list = list;
                this.size = list.size();
                this.total = (long)list.size();
                this.startRow = 0;
                this.endRow = list.size() > 0?list.size() - 1:0;
            }
    
            if(list instanceof Collection) {
                this.navigatePages = navigatePages;
                this.calcNavigatepageNums();
                this.calcPage();
                this.judgePageBoudary();
            }
        }
    }
    

    package com.github.pagehelper;
    
    import java.util.Collection;
    import java.util.List;
    
    /**
     * 对Page<E>结果进行包装
     * <p/>
     * 新增分页的多项属性,主要参考:http://bbs.csdn.net/topics/360010907
     *
     * @author liuzh/abel533/isea533
     * @version 3.3.0
     * @since 3.2.2
     * 项目地址 : http://git.oschina.net/free/Mybatis_PageHelper
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    public class PageInfo<T> extends PageSerializable<T> {
        public static final int DEFAULT_NAVIGATE_PAGES = 8;
        //当前页
        private int pageNum;
        //每页的数量
        private int pageSize;
        //当前页的数量
        private int size;
    
        //由于startRow和endRow不常用,这里说个具体的用法
        //可以在页面中"显示startRow到endRow 共size条数据"
    
        //当前页面第一个元素在数据库中的行号
        private long startRow;
        //当前页面最后一个元素在数据库中的行号
        private long endRow;
        //总页数
        private int pages;
    
        //前一页
        private int prePage;
        //下一页
        private int nextPage;
    
        //是否为第一页
        private boolean isFirstPage = false;
        //是否为最后一页
        private boolean isLastPage = false;
        //是否有前一页
        private boolean hasPreviousPage = false;
        //是否有下一页
        private boolean hasNextPage = false;
        //导航页码数
        private int navigatePages;
        //所有导航页号
        private int[] navigatepageNums;
        //导航条上的第一页
        private int navigateFirstPage;
        //导航条上的最后一页
        private int navigateLastPage;
    
        public PageInfo() {
        }
    
        /**
         * 包装Page对象
         *
         * @param list
         */
        public PageInfo(List<T> list) {
            this(list, DEFAULT_NAVIGATE_PAGES);
        }
    
        /**
         * 包装Page对象
         *
         * @param list          page结果
         * @param navigatePages 页码数量
         */
        public PageInfo(List<T> list, int navigatePages) {
            super(list);
            if (list instanceof Page) {
                Page page = (Page) list;
                this.pageNum = page.getPageNum();
                this.pageSize = page.getPageSize();
    
                this.pages = page.getPages();
                this.size = page.size();
                //由于结果是>startRow的,所以实际的需要+1
                if (this.size == 0) {
                    this.startRow = 0;
                    this.endRow = 0;
                } else {
                    this.startRow = page.getStartRow() + 1;
                    //计算实际的endRow(最后一页的时候特殊)
                    this.endRow = this.startRow - 1 + this.size;
                }
            } else if (list instanceof Collection) {
                this.pageNum = 1;
                this.pageSize = list.size();
    
                this.pages = this.pageSize > 0 ? 1 : 0;
                this.size = list.size();
                this.startRow = 0;
                this.endRow = list.size() > 0 ? list.size() - 1 : 0;
            }
            if (list instanceof Collection) {
                calcByNavigatePages(navigatePages);
            }
        }
    
        public static <T> PageInfo<T> of(List<T> list) {
            return new PageInfo<T>(list);
        }
    
        public static <T> PageInfo<T> of(List<T> list, int navigatePages) {
            return new PageInfo<T>(list, navigatePages);
        }
    
        public void calcByNavigatePages(int navigatePages) {
            setNavigatePages(navigatePages);
            //计算导航页
            calcNavigatepageNums();
            //计算前后页,第一页,最后一页
            calcPage();
            //判断页面边界
            judgePageBoudary();
        }
    
        /**
         * 计算导航页
         */
        private void calcNavigatepageNums() {
            //当总页数小于或等于导航页码数时
            if (pages <= navigatePages) {
                navigatepageNums = new int[pages];
                for (int i = 0; i < pages; i++) {
                    navigatepageNums[i] = i + 1;
                }
            } else { //当总页数大于导航页码数时
                navigatepageNums = new int[navigatePages];
                int startNum = pageNum - navigatePages / 2;
                int endNum = pageNum + navigatePages / 2;
    
                if (startNum < 1) {
                    startNum = 1;
                    //(最前navigatePages页
                    for (int i = 0; i < navigatePages; i++) {
                        navigatepageNums[i] = startNum++;
                    }
                } else if (endNum > pages) {
                    endNum = pages;
                    //最后navigatePages页
                    for (int i = navigatePages - 1; i >= 0; i--) {
                        navigatepageNums[i] = endNum--;
                    }
                } else {
                    //所有中间页
                    for (int i = 0; i < navigatePages; i++) {
                        navigatepageNums[i] = startNum++;
                    }
                }
            }
        }
    
        /**
         * 计算前后页,第一页,最后一页
         */
        private void calcPage() {
            if (navigatepageNums != null && navigatepageNums.length > 0) {
                navigateFirstPage = navigatepageNums[0];
                navigateLastPage = navigatepageNums[navigatepageNums.length - 1];
                if (pageNum > 1) {
                    prePage = pageNum - 1;
                }
                if (pageNum < pages) {
                    nextPage = pageNum + 1;
                }
            }
        }
    
        /**
         * 判定页面边界
         */
        private void judgePageBoudary() {
            isFirstPage = pageNum == 1;
            isLastPage = pageNum == pages || pages == 0;
            hasPreviousPage = pageNum > 1;
            hasNextPage = pageNum < pages;
        }
    
    }
    
  • 相关阅读:
    iOS 9.0中UIAlertController的用法
    AFN网络状态的时时监控以及网络的判断、
    IOS中货币高精度要求使用NSDecialNumber、
    各种宏定义
    iOS开发中那些高效常用的宏
    iOS应用日志:开始编写日志组件与异常日志
    UITextField的placeholder文字的位置,颜色等的自定义设置
    iOS
    关于duplicate symbol _main in的解决办法
    ios即时通讯客户端开发之-mac上搭建openfire服务器
  • 原文地址:https://www.cnblogs.com/zk2020/p/15564028.html
Copyright © 2011-2022 走看看