【Java】MyBatis-PageHelper的使用以及过程

∵ 很容易忘记PageHelper的使用,以及使用方法很奇怪。∴下定决心记住以及弄清楚其背后的原理

先上代码,很简单的分页查询

public ServerResponse<PageInfo> getProductList(int pageNumber, int pageSize){
        /**
         * 1.pageHelper.startPage
         * 2.sql查询逻辑
         * 3.处理查询到的结果(进行结果筛选->vo对象)
         * 4.pageHelper收尾(aop)
         */

        //debug时传入pageNumber为1;pageSize为10
        PageHelper.startPage(pageNumber, pageSize);

        List<Product> productList = productmMapper.selectList();

        List<ProductListVo> productListVoList = Lists.newArrayList();
        for(Product product : productList){
            ProductListVo productListVo = assembleProductListVo(product);
            productListVoList.add(productListVo);
        }

        //先用默认的结果
        PageInfo pageResult = new PageInfo(productList);
        //传给前端的用筛选后结果
        pageResult.setList(productListVoList);

        return ServerResponse.createBySuccess(pageResult);

    }

 

①Page.startPage(int pageNum, int pageSize)

    public static <E> Page<E> startPage(int pageNum, int pageSize) {
        
        //默认传入的count为true
        return startPage(pageNum, pageSize, true);
    }

    
    public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count) {

        //默认传入的reasonable为null
        return startPage(pageNum, pageSize, count, (Boolean)null);
    }

    public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable) {
        
        //默认传入的pageSizeZero为null
        return startPage(pageNum, pageSize, count, reasonable, (Boolean)null);
    }

    

当前的参数数据【Java】MyBatis-PageHelper的使用以及过程

可以看到,基本都是在增加一些参数的默认值

public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
        Page<E> page = new Page(pageNum, pageSize, count);
        page.setReasonable(reasonable);
        page.setPageSizeZero(pageSizeZero);
        Page<E> oldPage = SqlUtil.getLocalPage();
        if (oldPage != null && oldPage.isOrderByOnly()) {
            page.setOrderBy(oldPage.getOrderBy());
        }

        SqlUtil.setLocalPage(page);
        return page;
    }

【Java】MyBatis-PageHelper的使用以及过程

 真正开始存储参数的值到Page类中

【Java】MyBatis-PageHelper的使用以及过程

计算从第几行开始、第几行结束存储到Page的属性中

【Java】MyBatis-PageHelper的使用以及过程

【Java】MyBatis-PageHelper的使用以及过程

又回到startPage(),再次设置了一次reasonable;还设置了PageSizeZero

【Java】MyBatis-PageHelper的使用以及过程

 后面几步是尝试从线程的共享变量中(不同线程之间无法共享,自己和自己共享)尝试设置以前Page的OrderBy的值

private static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal();

public static <T> Page<T> getLocalPage() {
        return (Page)LOCAL_PAGE.get();
    }

 通过当前线程来获取对应的ThreadLocalMap(也就是每个线程自己所对应的变量表、副本之类的东西)

public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }

    ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }

 

【Java】MyBatis-PageHelper的使用以及过程

 

后续待更

上一篇:VS2017打包注册IE插件及修改IE安全选项设置【转】


下一篇:java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page page