MyBatis的pageHelper分页插件的使用(十五)

白发戴花君莫笑,岁月从不败美人。 愿,像你我一如既往地好看。

上一章简单介绍了MyBatis的延迟加载(十四),如果没有看过,请观看上一章

一. MyBatis 的分页查询

在以往的查询中,都没有牵扯到关于分页查询的知识,主要留在最后讲述一下 pageHelper 分页插件的使用。

在MySQL 中,分页时用 limit start,offset 即可以进行相应的查询。

还是用以前的User 表进行举例,只是多了几条数据。

有图片。

其中,User.java 对象是MyBatis的逆向工程自动生成的,还有一个UserExample.java 对象。
至于逆向工程,可以参考本系列下的: MyBatis逆向工程的使用(十二)

二. 以前的分页查询,拼接sql 语句。

UserMapper.java 接口:

//根据limit 语句拼接,进行相应的分页
	List<User> selectBySQL(@Param(value="start")int start, @Param(value="offset") int offset);

UserMapper.xml sql语句:

<!-- 分页查询 -->
   <select id="selectBySQL" resultMap="BaseResultMap" parameterType="com.yjl.pojo.UserExample" >
    select
    <include refid="Base_Column_List" />
    from user
    limit #{start},#{offset}
  </select>

测试方法:

@Test
	public void test1(){
		SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
		UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
		int page=2;
		int rowNum=5;
		int start=(page-1)*maxRow;
		List<User> allUser=userMapper.selectBySQL(start,rowNum);
		allUser.forEach(n ->System.out.println(n));
	}

有图片。

可以看到,是用的limit 直接进行的分页查询。

但是这种分页是放置在sql 语句里面的, 很可能每一个查询的sql 语句都要在最后添加 一下这个语句,并且还非得传入两个参数,可重复利用性低,尤其是条件查询时。 故最好,不采用这种方式进行分页。

三. 在XxxExample.java 中添加 分页的两个字段 start 和offset

在UserExample.java 中添加start 和offset的字段,用于分页查询,并且实现setter和getter方法。

 //添加两个字段,用于分页。
    private int start;  //开始的位置
    
    private int offset; //每页显示的最大数目

那么,在多条件查询语句,即

List<User> selectByExample(UserExample example);

接口时,改变相应的sql 实现,添加其中的分页显示。

 <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.yjl.pojo.UserExample" >
    select
    <if test="distinct" >
      distinct
    </if>
    <include refid="Base_Column_List" />
    from user
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null" >
      order by ${orderByClause}
    </if>
    <!-- 利用choose,添加分页的处理 -->
    <choose>
    	<when test="start!=0 and offset!=0">
    		limit ${start},${offset}
    	</when>
    	<when test="start==0 and offset!=0">
    		limit 0,${offset}
    	</when>
    	<otherwise>
    		<!-- 不执行任何操作。 -->
    	</otherwise>
    </choose>
  </select>

测试方法:

@Test
	public void test2(){
		SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
		UserMapper userMapper=sqlSession.getMapper(UserMapper.class);	
		UserExample example=new UserExample();
		example.setOrderByClause("id asc");
		//设置分页。
		int page=2;
		int rowNum=5;
		int start=(page-1)*rowNum;
		example.setStart(start); //设置开始点
		example.setOffset(rowNum); //设置每页显示的个数
		List<User> allUser=userMapper.selectByExample(example);
		allUser.forEach(n ->System.out.println(n));
	}

全部打开时,显示:

有图片。

将 example.setStart(start); 注释掉:

有图片。

将 example.setOffset(rowNum); 也注释掉:

有图片。

这样,就完成了有查询条件的分页。

但是,这样也有问题,如果没有查询条件,或者是没有用UserExample 类的是没有办法进行分页的。
改进 用 MyBatis 自带的 RowBounds 类。

四. MyBatis自带的 RowBounds 进行分页

四.一 RowBounds 类

package org.apache.ibatis.session;
       
       public class RowBounds
       {
         public static final int NO_ROW_OFFSET = 0;
       
         public static final int NO_ROW_LIMIT = Integer.MAX_VALUE;
       
         public static final RowBounds DEFAULT = new RowBounds();
         private final int offset;
         private final int limit;
         
         public RowBounds()
         {
        	offset = 0;
        	 limit = Integer.MAX_VALUE;
         }
         
         public RowBounds(int offset, int limit) {
       			 this.offset = offset;
        		this.limit = limit;
         }
         
         public int getOffset() {
       		 return offset;
         }
         
         public int getLimit() {
        	return limit;
         }
       }

RowBounds 有两个属性, offset 和limit 。其中,offset默认为0,limit 默认为Integer 的最大值。

没有setter和getter 方法, 只能在构造时使用。 (MyBatis用的是offset和limit, 老蝴蝶前面用的是 start 和offset)

四.二 使用RowBounds 进行分页

UserMapper.java 接口:

//根据RowBounds 进行相应的分页
    List<User> selectForRow(UserExample example,RowBounds row);

UserMapper.xml 语句:

语句与前面的一样,不具有侵入性。 不用改变相应的sql语句。 只需要在要分页的方法接口上添加 RowBounds 对象参数即可。

 <!-- rowBounds 进行分页查询 -->
    <select id="selectForRow" resultMap="BaseResultMap" parameterType="com.yjl.pojo.UserExample" >
    select
    <if test="distinct" >
      distinct
    </if>
    <include refid="Base_Column_List" />
    from user
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null" >
      order by ${orderByClause}
    </if>
  </select>

测试方法:

@Test
	public void test2(){
		SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
		UserMapper userMapper=sqlSession.getMapper(UserMapper.class);	
		UserExample example=new UserExample();
		example.setOrderByClause("id asc");
		//页数, 最大显示数。
		int page=2;
		int rowNum=5;
		int start=(page-1)*rowNum;
		RowBounds row=new RowBounds(start,rowNum); //会查询出全部的结果,然后再进行挑选分页。
		List<User> allUser=userMapper.selectForRow(example,row);
		allUser.forEach(n ->System.out.println(n));
	}

运行

有图片。

会发现有一个很大的问题, 内部的查询sql 语句是全部查询,是先查询出来完,然后再利用RowBounds 进行挑选性的分页。 数据量小时还可以,数据量多时,就不能使用了。

故,最好的方式还是利用pageHelper 的分页插件。

五. pageHelper 分页插件

pageHelper 插件,托管于 github, 地址是:https://github.com/pagehelper/Mybatis-PageHelper

有一个中文的帮助文档:
在这里插入图片描述
地址:

https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

这里只讲解最基本的用法,与Maven 和Spring 整合使用的,不讲。

五.一 下载jar包

下载这两个jar包, 把它们添加到classpath 路径下。

有图片。

两个都要放置,否则会出错。

一般人常常放置 pageHelper 的jar包,并没有放置 jsqlparser-2.1.jar 的包,是错误的,会报下面的错误。
有图片。

五.二 在SqlMapConfig.xml 中配置插件

<!-- 放置在别名之后,环境之前 -->
	<plugins>
		<!-- 分页插件,引入拦截器 -->
		<plugin interceptor="com.github.pagehelper.PageInterceptor">
			<!-- 指定数据库为mysql,虽然会自动监测。 -->
			<property name="helperDialect" value="mysql"/>
		</plugin>
	</plugins>

五.三 pageHelper 分页与RowBounds 连用

运行test3() 方法,监测selectForRow()的接口,这个时候,添加了pageHelper插件后的控制台为:

在这里插入图片描述

会直接查询 limit. 但一般不这么做。

五.四 pageHelper的 startPage()方法或者offsetPage() 方法

其中,startPage() 方法和offsetPage() 的用法是不一样的。

测试方法:

@Test
	public void test4(){
		SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
		UserMapper userMapper=sqlSession.getMapper(UserMapper.class);	
		UserExample example=new UserExample();
		example.setOrderByClause("id asc");
		//页数, 最大显示数。
		int page=2;
		int rowNum=5;
		int start=(page-1)*rowNum;
		//PageHelper.startPage(page,rowNum);  //开始的页数和数目
		PageHelper.offsetPage(start,rowNum); //开始处和数目
		List<User> allUser=userMapper.selectByExample(example);
		allUser.forEach(n ->System.out.println(n));
	}

控制台打印输出。

在这里插入图片描述

pageHelper插件还有更多的用法,具体的可参考文档,文档很详细,这里就不一一讲解了。

谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个蝴蝶飞

你的鼓励,是老蝴蝶更努力写作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值