Mybatis学习总结(七).Mybatis插件之分页插件

本文深入探讨了Mybatis的Plugin实现原理,详细介绍了如何构建通用分页组件,并具体展示了使用PageHelper进行分页操作的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mybatis的plugin实现原理


下图黑色部分为之前方式,红色部分为使用插件后

实现通用分页组件

如果想要将现有的select语句改为支持分页功能的查询语句该怎么做呢?最简单的一种做法就是将所有的select语句都加上limit来实现分页,这种做法有什么问题呢?


1、要改动的地方非常多,而且每个sql改动逻辑基本上一致;
2、DAO层的查询逻辑要改动,要在原来查询之后执行查询 SELECT count(1) from ….. 查询数据总条数。


有没有一种简便方法实现呢?

Mybatis提供了plugin机制,允许我们在Mybatis的原有处理流程上加入自己逻辑,所有我们就可以使用这种逻辑加上我们的分页逻辑,也就是实现拦截器。

Mybatis支持的拦截的接口有4个,Executor、ParameterHandler、ResultSetHandler、StatementHandler


使用PageHelper实现分页


PageHelper实现了通用的分页查询,其支持的数据有,mysql、Oracle、DB2、PostgreSQL等主流的数据库。
该插件托管于github: https://github.com/pagehelper/Mybatis-PageHelper


参考《 Mybatis分页插件 - PageHelper.docx 》

①.导入依赖
<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>

②.在全局配置文件中配置插件

<plugins>
    <!-- com.github.pagehelper为PageHelper类所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageHelper">
    	<!-- 方言 -->
        <property name="dialect" value="mysql"/>
        <!-- 该参数默认为false -->
        <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
        <property name="rowBoundsWithCount" value="true"/>
    </plugin>
</plugins>


③.编写接口
public List<User> queryUserListLikeName(@Param("name") String name);

④.编写映射文件
<select id="queryUserListLikeName" parameterType="String" resultType="User">
	SELECT <include refid="my.common.userColumns"/> FROM tb_user WHERE name LIKE '%${name}%'
</select>

⑤.测试分页
@Test
public void testQueryUserListLikeName() {
    //设置分页条件,Parameters:pageNum 页码pageSize 每页显示数量count 是否进行count查询
    PageHelper.startPage(1, 3, true);
    List<User> users = this.userMapper.queryUserListLikeName(null);
    
    for (User user : users) {
        System.out.println(user);
    }
}

结果:



可以使用PageInfo 查看分页信息
@Test
public void testQueryUserListLikeName() {
    //设置分页条件,Parameters:pageNum 页码pageSize 每页显示数量count 是否进行count查询
    PageHelper.startPage(1, 3, true);
    List<User> users = this.userMapper.queryUserListLikeName(null);
    
    PageInfo<User> pageInfo = new PageInfo<User>(users);
    
    //打印分页信息
    System.out.println("数据总数:" + pageInfo.getTotal());
    System.out.println("数据总页数:" + pageInfo.getPages());
    System.out.println("最后一页:" + pageInfo.getLastPage());
    
    for (User user : pageInfo.getList()) {
        System.out.println(user);
    }
}

PageInfo的方法



Mybatis批量增删改

批量删除


批量增加


批量修改


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值