专栏首页开发架构二三事pagehelper和通用mapper与springboot整合

pagehelper和通用mapper与springboot整合

网上有很多pagehelper、通用mapper这些与springboot整合的例子,这里结合自己使用的一些习惯进行整理。

1. pageHelper的使用

关于pageHelper的使用,其官方文档中介绍的比较清楚,地址为:https://pagehelper.github.io/docs/howtouse/

这里我只介绍一些比较容易忽略的点:

  • 分页信息是放在threadLocal中维护的:
 protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();    /**     * 设置 Page 参数     *     * @param page     */    protected static void setLocalPage(Page page) {        LOCAL_PAGE.set(page);    }
  • 需要使用pagehelper按照myibatis的拦截器规则实现的PageInterceptor:配置文件形式:

在拦截器中通过操作io处理线程的threadLocal变量来获取分页参数的,这里关于threadLocal的坑,在之前讲注入用户信息时有介绍过,在这就不再聊了,需要了解的自行翻阅历史文章查看。

  • 通常用的使用方式:
//支持 ServletRequest,Map,POJO 对象,需要配合 params 参数PageHelper.startPage(request);//紧跟着的第一个select方法会被分页// 可以使用((Page) list强转成Page类型List<Country> list = countryMapper.selectIf(1);//后面的不会被分页,除非再次调用PageHelper.startPage//这里返回的是Collection类型List<Country> list2 = countryMapper.selectIf(null);

Page类的介绍:

public class Page<E> extends ArrayList<E> implements Closeable 

在这里需要注意的一点是:Page是List的子类,在分页时,实际返回的结果list类型是Page,如果想取出分页信息,需要强制转换为Page或者使用PageInfo(内部也是转成Page来处理的)

  • PageInfo的使用,想通过分页返回的list获取分页信息的另一个方法是使用PageInfo:
//获取第1页,10条内容,默认查询总数countPageHelper.startPage(1, 10);List<Country> list = countryMapper.selectAll();//用PageInfo对结果进行包装PageInfo page = new PageInfo(list);//测试PageInfo全部属性//PageInfo包含了非常全面的分页属性

看下PageInfo的代码就一目了然了:

 /**     * 包装Page对象     *     * @param list          page结果     * @param navigatePages 页码数量     */    public PageInfo(List<T> list, int navigatePages) {        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();            //由于结果是>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.list = list;            this.size = list.size();            this.total = list.size();            this.startRow = 0;            this.endRow = list.size() > 0 ? list.size() - 1 : 0;        }        if (list instanceof Collection) {            this.navigatePages = navigatePages;            //计算导航页            calcNavigatepageNums();            //计算前后页,第一页,最后一页            calcPage();            //判断页面边界            judgePageBoudary();        }    }

可以看到,在将list传入PageInfo时,会根据list的原始类型进行转变,从而获取分页信息。

2. pagehelper与springboot的整合

配置文件时代,pageHelper主要是在myibatis的配置文件中存在的。在springboot中,与pagehelper的整合方式如下:

引入maven:

 <dependency>    <groupId>com.github.pagehelper</groupId>    <artifactId>pagehelper</artifactId>    <version>5.1.2</version></dependency><dependency>    <groupId>com.github.pagehelper</groupId>    <artifactId>pagehelper-spring-boot-autoconfigure</artifactId>    <version>1.2.3</version></dependency><dependency>    <groupId>com.github.pagehelper</groupId>    <artifactId>pagehelper-spring-boot-starter</artifactId>    <version>1.2.3</version></dependency>

application.yml配置:

pagehelper:    helperDialect: mysql    reasonable: true    supportMethodsArguments: true    params: count=countSql

使用方式:

PageHelper.startPage(1, 10);List<UserEntity> users=userMapper.getAll();PageInfo<UserEntity> pageInfo = new PageInfo<UserEntity>(users);

分析:

关于原因,看看下面这个类就清晰了:

3. 通用mapper

通用mapper与springboot的整合:

依赖:

<dependency>    <groupId>tk.mybatis</groupId>    <artifactId>mapper</artifactId>    <version>3.4.3</version></dependency><dependency>    <groupId>tk.mybatis</groupId>    <artifactId>mapper-spring-boot-starter</artifactId>    <version>1.2.3</version></dependency>

启动类上加上注解:

@MapperScan(value = "com.*.dao.mapper",markerInterface = BaseMapper.class)

然后就可以正常使用通用mapper了。

通用mapper的文档和代码生成工具

见官方文档:https://github.com/abel533/Mapper/wiki/1.integration

本文分享自微信公众号 - 开发架构二三事(gh_d6f166e26398),作者:两个小灰象

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • dubbo源码之单一长连接与客户端多线程并发请求是如何协调的

    com.alibaba.dubbo.remoting.exchange.ExchangeClient的结构:

    开发架构二三事
  • javascript之Promise对象知识点整理

    Promise规范https://promisesaplus.com/中对Promise的状态的定义:

    开发架构二三事
  • swagger 2.0对oauth2 token权限问题的解决

    4. 访问http://localhost:8080/api/swagger-ui.html

    开发架构二三事
  • 微信小程序实现运动步数排行(可删除)

    王小婷
  • 520试了大佬的表白神器,被女友无情拉黑,最后靠这个必杀技,真香!

    点份炸鸡和奶茶,虽然外卖要天亮以后才能送,我氪金也还是过不去那一关。罢了,乐于助人、乐善好施、雪中送炭的场主,怎么会计较这些?分享一波硬技能,素材来源于网络,取...

    养码场
  • 大数据开发需要学习哪些技术?

    Java开发介绍、熟悉Eclipse开发工具、Java语言基础、Java流程控制、Java字符串、Java数组与类和对象、数字处理类与核心技术、I/O与反射、多...

    加米谷大数据
  • 大数据开发需要学习哪些技术?

    Java开发介绍、熟悉Eclipse开发工具、Java语言基础、Java流程控制、Java字符串、Java数组与类和对象、数字处理类与核心技术、I/O与反射、多...

    加米谷大数据
  • 程序员转世?被初中生写的类库、框架惊到了!年近40的我表示压力山大……

    首先声明,不是标题党。接下来为大家介绍的主角的确是初中生,他们写的类库,框架所涉及到的知识点并,不,少!

    用户1564362
  • layui 框架弹出一个界面弹框

    王小婷
  • 通过“服务镜像”实现多集群Kubernetes

    在我们之前的文章多集群Kubernetes的架构设计,我们概述了构建一个简单但有弹性的Kubernetes多集群方法的三个要求:支持分层网络、保持集群状态的独立...

    CNCF

扫码关注云+社区

领取腾讯云代金券