Mybatis分页插件PageHelper

匿名 (未验证) 提交于 2019-12-03 00:30:01

1、导入依赖

<dependency>       <groupId>com.github.pagehelper</groupId>       <artifactId>pagehelper</artifactId>       <version>3.4.2</version>   </dependency>   <dependency>       <groupId>com.github.jsqlparser</groupId>       <artifactId>jsqlparser</artifactId>       <version>0.9.1</version>   </dependency> 

2、mybatis配置文件(SqlMapConfig.xml)

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"         "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>     <!-- 配置分页插件 -->     <plugins>         <plugin interceptor="com.github.pagehelper.PageHelper">             <!-- 设置数据库类型 -->             <property name="dialect" value="mysql"/>                 </plugin>     </plugins> </configuration>

3、测试

//根据页和每页大小获取商品 @Override public EUDataGridResult getItemList(int page, int rows) {     //查询商品列表     GdItemExample example=new GdItemExample();     //分页处理     PageHelper.startPage(page, rows);     List<GdItem> list = itemMapper.selectByExample(example);     //创建一个返回值对象     EUDataGridResult result=new EUDataGridResult();     result.setRows(list);     result.setTotal(list.size());     return result; }
<!--      plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:     properties?, settings?,      typeAliases?, typeHandlers?,      objectFactory?,objectWrapperFactory?,      plugins?,      environments?, databaseIdProvider?, mappers? --> <plugins>     <!-- com.github.pagehelper为PageHelper类所在包名 -->     <plugin interceptor="com.github.pagehelper.PageHelper">         <property name="dialect" value="mysql"/>         <!-- 该参数默认为false -->         <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->         <!-- 和startPage中的pageNum效果一样-->         <property name="offsetAsPageNum" value="true"/>         <!-- 该参数默认为false -->         <!-- 设置为true时,使用RowBounds分页会进行count查询 -->         <property name="rowBoundsWithCount" value="true"/>         <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->         <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->         <property name="pageSizeZero" value="true"/>         <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->         <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->         <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->         <property name="reasonable" value="true"/>     </plugin> </plugins>

这里的com.github.pagehelper.PageHelper使用完整的类路径。

其他五个参数说明:

1、增加dialect属性,使用时必须指定该属性,可选值为oracle,mysql,mariadb,sqlite,hsqldb,postgresql,没有默认值,必须指定该属性。

2、增加offsetAsPageNum属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,使用RowBounds分页时,会将offset参数当成pageNum使用,可以用页码和页面大小两个参数进行分页。

3、增加rowBoundsWithCount属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,使用RowBounds分页会进行count查询。

4、增加pageSizeZero属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是Page类型)。

5、增加reasonable属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。具体作用请看上面配置文件中的注释内容。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">   <property name="dataSource" ref="dataSource"/>   <property name="mapperLocations">     <array>       <value>classpath:mapper/*.xml</value>     </array>   </property>   <property name="typeAliasesPackage" value="com.isea533.ssm.model"/>   <property name="plugins">     <array>       <bean class="com.github.pagehelper.PageHelper">         <property name="properties">           <value>             dialect=hsqldb             reasonable=true           </value>         </property>       </bean>     </array>   </property> </bean>
List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(1, 10));

使用这种调用方式时,你可以使用RowBounds参数进行分页,这种方式侵入性最小,我们可以看到,通过RowBounds方式调用只是使用了这个参数,并没有增加其他任何内容。

分页插件检测到使用了RowBounds参数时,就会对该查询进行物理分页。

注:不只有命名空间方式可以用RowBounds,使用接口的时候也可以增加RowBounds参数,例如:

//这种情况下也会进行物理分页查询 List<Country> selectAll(RowBounds rowBounds);  

在你需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页

例一:

SqlSession sqlSession = MybatisHelper.getSqlSession(); CountryMapper countryMapper = sqlSession.getMapper(CountryMapper.class); try {     //获取第1页,10条内容,默认查询总数count     PageHelper.startPage(1, 10);      //紧跟着的第一个select方法会被分页     List<Country> list = countryMapper.selectIf(1);     assertEquals(2, list.get(0).getId());     assertEquals(10, list.size());     //分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>,     //或者使用PageInfo类(下面的例子有介绍)     assertEquals(182, ((Page) list).getTotal()); } finally {     sqlSession.close(); }

例二:

SqlSession sqlSession = MybatisHelper.getSqlSession(); CountryMapper countryMapper = sqlSession.getMapper(CountryMapper.class); try {     //获取第1页,10条内容,默认查询总数count     PageHelper.startPage(1, 10);      //紧跟着的第一个select方法会被分页     List<Country> list = countryMapper.selectIf(1);      //后面的不会被分页,除非再次调用PageHelper.startPage     List<Country> list2 = countryMapper.selectIf(null);     //list1     assertEquals(2, list.get(0).getId());     assertEquals(10, list.size());     //分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>,     //或者使用PageInfo类(下面的例子有介绍)     assertEquals(182, ((Page) list).getTotal());     //list2     assertEquals(1, list2.get(0).getId());     assertEquals(182, list2.size()); } finally {     sqlSession.close(); }

例三:使用PageInfo的用法

//获取第1页,10条内容,默认查询总数count PageHelper.startPage(1, 10); List<Country> list = countryMapper.selectAll(); //用PageInfo对结果进行包装 PageInfo page = new PageInfo(list); //测试PageInfo全部属性 //PageInfo包含了非常全面的分页属性 assertEquals(1, page.getPageNum()); assertEquals(10, page.getPageSize()); assertEquals(1, page.getStartRow()); assertEquals(10, page.getEndRow()); assertEquals(183, page.getTotal()); assertEquals(19, page.getPages()); assertEquals(1, page.getFirstPage()); assertEquals(8, page.getLastPage()); assertEquals(true, page.isFirstPage()); assertEquals(false, page.isLastPage()); assertEquals(false, page.isHasPreviousPage()); assertEquals(true, page.isHasNextPage());
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!