欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pageHelper插件的使用(分页,实例)

程序员文章站 2022-07-05 23:23:37
...
mybatis的分页方法有很多,作者最常用的是limit和pageHelper。

pageHelper的官网

mapper.xml
limit分页

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="test">
	<!-- 
		mysql:limit
	 	postgresql:offset 
	 	oracle:三层rowNum嵌套(记不住,问navicat)
	 	
	 	要分页必备两个要素:
	 		总条数
	 		每页多少条
	 -->
	<select id="page_1"  resultType="com.jinghangzz.mybatis.data.pojo.ADemoDynasty">
		select * from a_demo_dynasty  
		limit 3,2
	</select>
	
	<!-- 
	 	RowBounds
	 -->
	<select id="page_2"  resultType="com.jinghangzz.mybatis.data.pojo.ADemoDynasty">
		select * from a_demo_dynasty  
	</select>
</mapper>

使用pageHelper进行分页
—>引入jar包
|—>|—>jsqlparser-3.1.jar
|—>|—>pagehelper-5.1.9.jar

想要使用pageHelper,必须在mybatis的核心配置文件中进行配置

mybatis.cfg.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.PageInterceptor">
			<!-- 参数
				reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,
				pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),
				会查询最后一页。默认false 时,直接根据参数进行查询。
			 -->
			<property name="reasonable" value="true"/>
		</plugin>
	</plugins>

	<!-- 配置了一堆环境;jdbc的环境
		default:默认的环境,配置environment的id
	 -->
	<environments default="my">
		<environment id="my">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?serverTimezone=UTC"/>
				<property name="username" value="root"/>
				<property name="password" value="123456"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/jinghangzz/mybatis/data/pojo/ADynastyMapper.xml"/>
	</mappers>
</configuration>

测试代码

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.jinghangzz.mybatis.data.pojo.ADemoDynasty;
import com.jinghangzz.mybatis.data.test.BaseTest;

/**
 * 分页
 * 	有三种
 * @author TeaBig
 */
public class PageTest extends BaseTest
{
	/**
	 * 分页的第一种
	 */
	@Test
	public void page_1()
	{
		/* 获取链接
		 * SqlSession===Connection;
		 *  */
		SqlSession session = sqlSessionFactory.openSession() ; 
		this.logger.info("session:{}",session);
		/*=========以上是加载驱动,获取链接==============*/
		/*=========操作数据库==============*/
		/*
		 * 查询多条:selectList
		 * 查询单条:selectOne
		 * 
		 * 参数1:mapper文件中,namespace(如果sql语句的id在全局中是唯一的,那可以省略namespace)+sql语句的id
		 * */
		List<ADemoDynasty> dynastyList = session.selectList("test.page_1");
		/* 如何循环 */
		final Map<String, Object> resultMap = new HashMap<String, Object>();
		dynastyList.forEach( t -> 
		{
			Integer count = 0 ; 
			if(resultMap.get("count") != null )
			{
				count = Integer.valueOf(resultMap.get("count") + "") ; 
			}
			System.out.println(count + "==>" + t);
			count ++ ; 
			resultMap.put("count",count);
		});
		/* 关闭链接 */
		session.close();
	}
	
	/**
	 * 分页的第二种
	 */
	@Test
	public void page_2()
	{
		/* 获取链接
		 * SqlSession===Connection;
		 *  */
		SqlSession session = sqlSessionFactory.openSession() ; 
		this.logger.info("session:{}",session);
		/*=========以上是加载驱动,获取链接==============*/
		/*=========操作数据库==============*/
		/**
		 *  limit ?,?
		 *  参数1:第一个?;表示从第几条开始
		 *  参数2:第二个?;表示往后查询多少条
		 *  
		 *  分页相当的low;
		 *  	一次性将sql语句全部查询出来,
		 *  	在内存中进行分页;
		 *  	如果数据库里面有100000000w条记录,难道也要一次性放到内存中?(这绝对不现实)
		 */
		RowBounds rowBounds = new RowBounds(2, 3);
		/**
		 * 参数1:sql语句的Id
		 * 参数2:sql语句的参数(paramterType)
		 * 参数3:RowBounds
		 */
		List<ADemoDynasty> dynastyList = session.selectList("test.page_2",null,rowBounds);
		/* 如何循环 */
		final Map<String, Object> resultMap = new HashMap<String, Object>();
		dynastyList.forEach( t -> 
		{
			Integer count = 0 ; 
			if(resultMap.get("count") != null )
			{
				count = Integer.valueOf(resultMap.get("count") + "") ; 
			}
			System.out.println(count + "==>" + t);
			count ++ ; 
			resultMap.put("count",count);
		});
		/* 关闭链接 */
		session.close();
	}
	
	/**
	 * 分页的第三种
	 * 	PageHelper
	 */
	@Test
	public void page_3()
	{
		/* 获取链接
		 * SqlSession===Connection;
		 *  */
		SqlSession session = sqlSessionFactory.openSession() ; 
		this.logger.info("session:{}",session);
		/*=========以上是加载驱动,获取链接==============*/
		/*=========操作数据库==============*/
		/* 一定要在调用selectList或者SelectOne之前调用此方法 */
		/**
		 * 参数1:第几页
		 * 参数2:每页多少条
		 * 
		 * 它会先查询总条数,
		 * 然后再查询分页的数据
		 * 
		 * 分页的信息存储在page中
		 */
		Page page = PageHelper.startPage(10000, 3);
		
		/**
		 * 参数1:sql语句的Id
		 * 参数2:sql语句的参数(paramterType)
		 * 参数3:RowBounds
		 */
		List<ADemoDynasty> dynastyList = session.selectList("test.page_2",null);
		
		/* 一定要在调用selectOne或者selectList之后调用page查看分页信息 */
		this.logger.info("分页信息:总条数:{},总页数:{},每页条数:{},当前页:{}",
					page.getTotal(),page.getPages(),page.getPageSize(),page.getPageNum());
		
		/* 如何循环 */
		final Map<String, Object> resultMap = new HashMap<String, Object>();
		dynastyList.forEach( t -> 
		{
			Integer count = 0 ; 
			if(resultMap.get("count") != null )
			{
				count = Integer.valueOf(resultMap.get("count") + "") ; 
			}
			System.out.println(count + "==>" + t);
			count ++ ; 
			resultMap.put("count",count);
		});
		/* 关闭链接 */
		session.close();
	}
} 
实际操作中,pageHelper相比其他方法而言,使用起来更加方便简单
****pageHelper必须在核心配置文件中配置,必须在调用sql语句之前调用PageHelper.startPage(),在调用sql语句之后查询分页信息