开源Mybatis-PageHelper分页插件实战指南

Mybatis-PageHelper分页插件,这个插件功能强大且易于使用,支持多种数据库的物理分页,并且在自定义配置方面也非常灵活。今天,我将通过实战的方式,详细介绍如何在项目中使用Mybatis-PageHelper。

一、引入Mybatis-PageHelper

首先,我们需要在项目中引入Mybatis-PageHelper。有两种方式可以实现:直接引入jar包或者使用Maven方式引入。在这里,我推荐使用Maven方式,因为它可以自动管理依赖,并且更新起来也非常方便。

pom.xml中添加以下依赖:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>最新版本号</version>
</dependency>
二、配置拦截器

接下来,我们需要在MyBatis配置xml文件或者Spring配置文件中配置拦截器插件。

在MyBatis配置xml文件中配置

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <property name="helperDialect" value="mysql"/>
        <!-- 其他参数配置 -->
    </plugin>
</plugins>

在Spring配置文件中配置

如果你使用的是Spring框架,那么可以在Spring配置文件中进行如下配置:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="plugins">
        <array>
            <bean class="com.github.pagehelper.PageInterceptor">
                <property name="helperDialect" value="mysql"/>
                <!-- 其他参数配置 -->
            </bean>
        </array>
    </property>
</bean>
三、插件参数详解

Mybatis-PageHelper提供了多个可选参数,以下是一些常见参数的详细介绍:

  1. helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。通过配置helperDialect属性来指定分页插件使用哪种数据库方言。例如,mysqloracle等。

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

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

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

  5. reasonable:分页合理化参数,当该参数设置为true时,pageNum<=0时会查询第一页;pageNum>pages(超过总数时),会查询最后一页。

  6. params:该参数来配置参数映射,用于从对象中根据属性名取值。

  7. supportMethodsArguments:支持通过Mapper接口参数来传递分页参数,分页插件会从查询方法的参数值中,自动根据params配置的字段中取值,查找到合适的值时就会自动分页。

  8. autoRuntimeDialect:允许在运行时根据多数据源自动识别对应方言的分页。

  9. closeConn:当使用运行时动态数据源或没有设置helperDialect属性自动获取数据库类型时,会自动获取一个数据库连接,通过该属性来设置是否关闭获取的这个连接。

四、调用方式实战

接下来,我将通过实战的方式介绍Mybatis-PageHelper的几种调用方式。

第一种:RowBounds方式的调用

List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));

这种方式比较直接,但是推荐使用Mapper接口方式,因为更加简洁和易读。

第二种:Mapper接口方式的调用(推荐)

PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);

这种方式通过PageHelper.startPage(pageNum, pageSize)来设置分页参数,然后直接调用Mapper接口的方法即可。

第三种:Mapper接口方式的另一种调用(也推荐)

PageHelper.offsetPage(1, 10);
List<User> list = userMapper.selectIf(1);

PageHelper.offsetPage(offset, limit)方法与startPage类似,只是参数不同。

第四种:参数方法调用

如果Mapper接口方法中有分页参数,可以通过配置supportMethodsArguments=true来自动分页。

public interface CountryMapper {
    List<User> selectByPageNumSize(@Param("user") User user, @Param("pageNum") int pageNum, @Param("pageSize") int pageSize);
}

// 在代码中直接调用:
List<User> list = userMapper.selectByPageNumSize(user, 1, 10);

第五种:参数对象调用

如果分页参数存在于一个对象中,只要该对象中的分页参数有值,也会被自动分页。

public class User {
    // 其他fields
    private Integer pageNum;
    private Integer pageSize;
}

public interface CountryMapper {
    List<User> selectByPageNumSize(User user);
}

// 当user中的pageNum!= null && pageSize!= null时,会自动分页
List<User> list = userMapper.selectByPageNumSize(user);

第六种:ISelect接口方式

对于复杂的查询,可以使用ISelect接口来实现。

// jdk6,7用法,创建接口
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectGroupBy();
    }
});

// jdk8 lambda用法
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy());

// 也可以直接返回PageInfo
PageInfo<User> pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectGroupBy();
    }
});

// 对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());

count查询

有时候我们只需要查询总记录数,可以使用PageHelper.count方法。

// 匿名内部类用法
long total = PageHelper.count(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectLike(user);
    }
});

// lambda用法
total = PageHelper.count(()->userMapper.selectLike(user));
五、实战结果展示

假设我们有一个用户表,并且使用第二种调用方式进行分页查询,查询第一页,每页10条记录。以下是可能的查询结果和日志输出:

查询结果

List<User> list = userMapper.selectIf(1); // 假设这个方法是根据某个条件查询用户
for (User user : list) {
    System.out.println(user);
}

日志输出(假设使用MyBatis的日志功能)

DEBUG [main] - ==>  Preparing: SELECT * FROM user WHERE some_condition LIMIT ?,?
DEBUG [main] - ==> Parameters: 0(Integer), 10(Integer)
DEBUG [main] - <==      Total: 10
User{id=1, name='Alice', ...}
User{id=2, name='Bob', ...}
...

可以看到,Mybatis-PageHelper自动为我们生成了分页的SQL语句,并且正确地返回了分页结果。

六、总结

Mybatis-PageHelper是一个非常实用的分页插件,支持多种数据库和自定义配置。通过简单的配置和调用,就可以实现复杂的分页功能。在实际项目中,我强烈推荐使用这个插件来处理分页问题。希望这篇文章对你有所帮助,如果你有任何问题或者建议,欢迎留言交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值