专栏首页墨白的Java基地带你学习最简单的分页插件PageHelper

带你学习最简单的分页插件PageHelper

正文

引言:

PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库, 例如mysql、 oracle、mariaDB、 DB2、 SQLite、Hsqldb等。今天墨白就给大家聊聊PageHelper这款分页插件,下面是PageHelper开源地址,感兴趣的小伙伴可以去看一下

  • PageHelper在 github 的项目地址:
https://github.com/pagehelper/Mybatis-PageHelper
  1. 先介绍一下这款插件PageHelper
  • 官网地址:
https://pagehelper.github.io/
  • 访问官网后的页面,官网里面有详细的Demo,今天我们来照着官网自己动手敲个Demo;
  • 如何使用PageHelper?

1.在自己的项目添加依赖,maven项目在父工程添加最新版本,最新版本是5.1.8

1<dependency>
2    <groupId>com.github.pagehelper</groupId>
3    <artifactId>pagehelper</artifactId>
4    <version>5.1.8</version>
5</dependency>

2.在数据访问层Spring 配置文件中配置拦截器插件,代码如下

 1<bean class="org.mybatis.spring.SqlSessionFactoryBean">
 2        <property name="dataSource" ref="dataSource"/>
 3        <!--配置PageHelper拦截器插件-->
 4        <property name="plugins">
 5            <array>
 6                <bean class="com.github.pagehelper.PageInterceptor">
 7                    <property name="properties">
 8                        <value>
 9                            helperDialect=mysql
10                            reasonable=true
11                        </value>
12                    </property>
13                </bean>
14            </array>
15        </property>
16    </bean>

3.PageHelper分页插件参数介绍

  • 这里我只介绍两个常用的,详细的可以去看官网API文档

helperDialect:

分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值

1oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby

特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。

reasonable:

分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。

4.在代码中使用的两种方式:

  • 第一种
1// 此语句后的第一个select查询自动会被分页
2PageHelper.startPage(1, 10); 
3// 这里的查询会自动分页
4List<Country> list = countryMapper.selectIf(1);
  • 第二种
 1//获取第1页,10条内容,默认查询总数count
 2PageHelper.startPage(1, 10);
 3List<Country> list = countryMapper.selectAll();
 4//用PageInfo对结果进行包装
 5PageInfo page = new PageInfo(list);
 6//测试PageInfo全部属性
 7//PageInfo源码中可以看到包含了非常全面的分页属性
 8assertEquals(1, page.getPageNum());
 9assertEquals(10, page.getPageSize());
10assertEquals(1, page.getStartRow());
11assertEquals(10, page.getEndRow());
12assertEquals(183, page.getTotal());
13assertEquals(19, page.getPages());
14assertEquals(1, page.getFirstPage());
15assertEquals(8, page.getLastPage());
16assertEquals(true, page.isFirstPage());
17assertEquals(false, page.isLastPage());
18assertEquals(false, page.isHasPreviousPage());
19assertEquals(true, page.isHasNextPage());
  • 使用PageHelper

配置好了上面的坐标和Spring配置文件以后,我们直接开始使用PageHelper,,每个人的表数据可能都不一样,大家根据需求自己来玩,代码如下

  • Mapper接口
1/**
2 * CompanyMapper接口
3*/
4public interface CompanyMapper {
5   //查询全部
6   List<Company> findAll();
7}
  • Mapper映射
1 <!--查询全部-->
2    <select id="findAll" resultMap="BaseResultMap">
3      select * from ss_company where companyId=#{companyId}
4</select>
  • Service接口
1public interface CompanyService {
2   // 分页查询
3   PageInfo<User> findByPage(int pageNum, int PageSize);
4   //查询所有
5   List<Company> findAll();
6}
  • impl实现
 1 // 注入Mapper
 2 @Autowired
 3 private CompanyMapper companyMapper;
 4
 5@Override
 6public PageInfo<Company> findByPage(int pageNum, int pageSize) {
 7    // 开始分页, PageHelper组件会自动对其后的第一条查询查询分页
 8    PageHelper.startPage(pageNum,pageSize);
 9    // 调用dao查询
10    List<Company> list = companyMapper.findAll();
11    // 创建PageInfo对象封装分页结果,传入查询集合。会自动计算分页参数
12    PageInfo<Company> pageInfo = new PageInfo<>(list);
13    return pageInfo;
14}
  • 单元测试
 1@RunWith(SpringJUnit4ClassRunner.class)
 2@ContextConfiguration("classpath*:spring/applicationContext-*.xml")
 3public class UserServiceImplTest {
 4    // 注入service
 5    @Autowired
 6    private CompanyService companyMapper;
 7
 8    @Test
 9    public void findByPage(){
10        PageInfo<User> pageInfo = companyMapper.findByPage(1, 2);
11        System.out.println(pageInfo);
12    }
13}
  • 测试结果:

控制器:每个人的Controller都不一样,我这里给个模板你们,不明白的可以在后台留言,或者是在群里提问,

仅作参考:

 1   @Autowired
 2   private CompanyService companyService;
 3
 4   @RequestMapping("/***")
 5   public ModelAndView findByPage(
 6         @RequestParam(defaultValue = "1") int pageNum,
 7         @RequestParam(defaultValue = "5") int pageSize) {
 8
 9      ModelAndView mv = new ModelAndView();
10      mv.addObject("pageInfo",pageInfo);
11      mv.setViewName("详情列表");
12      return mv;
13   }
14}

本文分享自微信公众号 - 框架师(mohu121),作者:MoBai白

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

原始发表时间:2019-11-08

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面8-15K可能会遇到的面试题

    23号也就是周一约了3家面试,上午面了一家,下午面了一家,推掉了第三家的面试,下面说说面试内容,第一家共有6道笔试题,第二家无笔试题,面试官问了数据库索引相关内...

    框架师
  • WebMagic爬取指定内容和一些特性介绍(附演示代码)

    可能有很多小伙伴不了解Xpath语法是什么,我就给大家稍微介绍下,想要了解更多可以百度或者后台联系我,XPath 是一门在 XML 文档中查找信息的语言。XPa...

    框架师
  • 最详细的IDEA中使用Debug教程

    Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化。通常我们也可以启用De...

    框架师
  • Java 最常见的 208 道面试题:第十七模块答案

    165. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?

    Java团长
  • 百练OJ 1017 2801

    一、1017填箱子      这个题题目读起来有些晦涩,如果按题目给的条件很难找到突破口,需要事先计算一下每种CP(产品)在没装满的情况下还需要的其他CP数。(...

    CloudDeveloper
  • 回归树(一)

    线性回归模型需要拟合全部的样本点(局部加权线性回归除外)。当数据拥有众多特征并且特征之间的关系十分复杂时,构建全局模型的想法就不切实际。一种可行的方法是将数据集...

    用户6021899
  • 世界上最顶尖的技术在哪些国家?长知识了!

    目前蚀刻设备精度最高的是日立。比如东丽,帝人的炭纤维,超高精密仪器,数控机床,光栅刻画机(这个最牛的也是日立,刻画精度达到10000g/mm ),光刻机(ASM...

    用户1621951
  • 扎心了!中国尚未掌控的核心技术清单

    前段时间美国全面制裁封杀中兴一事闹得沸沸扬扬,因为,一旦制裁实施,中兴将会陷入无零件可买、也无技术可支援的绝境之中,在这样的情况下中兴能够撑多久?这绝对是一个非...

    钱塘数据
  • No.005 Longest Palindromic Substring

    5. Longest Palindromic Substring Total Accepted: 120226 Total Submissions: 50952...

    mukekeheart
  • MyEclipse TestNG插件安装与配置

    myeclipse-10.0-offline-installer-windows.exe

    授客

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动