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

本文详细记录了Java中MyBatis-PageHelper的使用方法,特别是`Page.startPage(int pageNum, int pageSize)`的调用过程,探讨了其参数设置、分页计算逻辑以及如何处理线程局部变量存储的OrderBy信息。" 90655349,7819652,教务管理系统V2实现:登陆与教材订购,"['后台开发', 'Java', 'Spring框架', 'Web应用', '数据库交互']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

∵ 很容易忘记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);
    }

    

当前的参数数据

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

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;
    }

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

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

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

 后面几步是尝试从线程的共享变量中(不同线程之间无法共享,自己和自己共享)尝试设置以前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;
    }

 

 

后续待更

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值