pageHelper(Mybatis分页插件)使用总结

pageHelper 总结

一、 引入分页插件
1、导入jar
由于使用了sql 解析工具,你还需要下载 jsqlparser.jar:
2、使用maven

com.github.pagehelper pagehelper 最新版本

二、 配置拦截器插件
新版拦截器是 com.github.pagehelper.PageInterceptor。 com.github.pagehelper.PageHelper 现在是一个特殊的 dialect 实现类,
是分页插件的默认实现类,提供了和以前相同的用法。

1. 在 MyBatis 配置 xml 中配置拦截器插件
	
<!--
	plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
	properties?, settings?,
	typeAliases?, typeHandlers?,
	objectFactory?,objectWrapperFactory?,
	plugins?,
	environments?, databaseIdProvider?, mappers?
-->


<plugins>
    <!-- com.github.pagehelper为PageHelper类所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- -->
        <property name="helperDialect" value="mysql"/>
        <property name="reasonable" value="true"/>
    </plugin>
</plugins>


2. 在 Spring 配置文件中配置拦截器插件

<!-- 生成SqlSessionFactory -->
<bean id="sessionFactory"
      class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation"
              value="classpath:mybatis-config.xml"/>
	<!-- 配置 pagehelper 分页器插件 -->
    <property name="plugins">
        <array>
            <bean class="com.github.pagehelper.PageInterceptor">
                <property name="properties">
                    <props>
                        <!-- 设置使用的数据库 -->
                        <prop key="helperDialect">mysql</prop>
                        <prop key="reasonable">true</prop>
                    </props>
                </property>
            </bean>
        </array>
    </property>
</bean>

三、代码编写

1、Service层编写

/**
* 根据条件查询用户列表
* @param user 封装好的user类
* @param pageNo 第几页
* @param pageSize 每页显示的长度
* return
*
*/
public PageInfo<User> listUser(User user,int pageNo,int pageSize){
	// Mapper接口调用方式
	PageHelper.startPage(pageNo,pageSize);
	List<User> userList = UserMapper.getUserByInfo(user);
	PageInfo<User> pageInfo = new PageInfo<User>();
	return pageInfo;
}


2、xml
<!-- 通过用户唯一信息获取用户信息 -->
<select id="findUserByInfo" parameterType="User" resultMap="UserResult">
	select * from user
	<where>
		<if test="userName != null and userName != ''">
			userName = #{userName}
		</if>
		<if test="phone != null and phone != ''">
			phone = #{phone}
		</if>
		<if test="email != null and email != ''">
			email = #{email}
		</if>
	</where>
</select>

正常查询不需要添加任何分页相关代码,分页拦截器会对sql进行处理

四、分页插件参数介绍
dialect:默认情况下会使用 PageHelper 方式进行分页,如果想要实现自己的分页逻辑,可以实现 Dialect(com.github.pagehelper.Dialect)
接口,然后配置该属性为实现类的全限定名称。


helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。
	配置时,可以使用下面的缩写值:oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
	特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
	你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。

	offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,会将 RowBounds 中的 
	offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。

	rowBoundsWithCount:默认值为false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true时,使用 RowBounds 分页
	会进行 count 查询。

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

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

	params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,
	pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;
	reasonable=reasonable;pageSizeZero=pageSizeZero。

	supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 
	params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下
	的 ArgumentsMapTest 和 ArgumentsObjTest。

	autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,
	只能使用sqlserver),用法和注意事项参考下面的场景五。

	closeConn:默认值为 true。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 
	通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为 false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据
	源来决定。

	重要提示:当 offsetAsPageNum=false 的时候,由于 PageNum 问题,RowBounds查询的时候 reasonable 会强制为 false。
	使用 PageHelper.startPage 方法不受影响。

五、分页插件的调用方式
//第一种,RowBounds方式的调用
List list = sqlSession.selectList(“x.y.selectIf”, null, new RowBounds(0, 10));

//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectIf(1);

//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<Country> list = countryMapper.selectIf(1);

//第四种,参数方法调用
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
	List<Country> selectByPageNumSize(
			@Param("user") User user,
			@Param("pageNum") int pageNum,
			@Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<Country> list = countryMapper.selectByPageNumSize(user, 1, 10);

//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
	//其他fields
	//下面两个参数名和 params 配置的名字一致
	private Integer pageNum;
	private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
	List<Country> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<Country> list = countryMapper.selectByPageNumSize(user);

//第六种,ISelect 接口方式
//jdk6,7用法,创建接口
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
	@Override
	public void doSelect() {
		countryMapper.selectGroupBy();
	}
});
//jdk8 lambda用法
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(()-> countryMapper.selectGroupBy());

//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
	@Override
	public void doSelect() {
		countryMapper.selectGroupBy();
	}
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> countryMapper.selectGroupBy());

//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {
	@Override
	public void doSelect() {
		countryMapper.selectLike(country);
	}
});
//lambda
total = PageHelper.count(()->countryMapper.selectLike(country));

六、pageInfo中的一些属性

	//当前页
    private int pageNum;
    //每页的数量
    private int pageSize;
    //当前页的数量
    private int size;

    //由于startRow和endRow不常用,这里说个具体的用法
    //可以在页面中"显示startRow到endRow 共size条数据"

    //当前页面第一个元素在数据库中的行号
    private int startRow;
    //当前页面最后一个元素在数据库中的行号
    private int endRow;
    //总记录数
    private long total;
    //总页数
    private int pages;
    //结果集
    private List<T> list;

    //前一页
    private int prePage;
    //下一页
    private int nextPage;

    //是否为第一页
    private boolean isFirstPage = false;
    //是否为最后一页
    private boolean isLastPage = false;
    //是否有前一页
    private boolean hasPreviousPage = false;
    //是否有下一页
    private boolean hasNextPage = false;
    //导航页码数
    private int navigatePages;
    //所有导航页号
    private int[] navigatepageNums;
    //导航条上的第一页
    private int navigateFirstPage;
    //导航条上的最后一页
    private int navigateLastPage;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值