mybatisplus的分页插件以及自定义分页

目录

1、分页插件

a>添加配置类

 b>测试

2.xml自定义分页

a>UserMapper中定义接口方法

b>UserMapper.xml中编写SQL

c>测试


1、分页插件

MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能 。

a>添加配置类

package com.csdn.mybatisplus.onfig;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author summer
 * @date 2022-04-21  15:35
 */
@Configuration
@MapperScan("com.csdn.mybatisplus.mapper")
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor()
    {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor;
    }
}

 b>测试

  @Test
    public void testPage(){
        Integer a=null;
        Page<User> page = new Page<>(2,3);
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.gt(User::getAge,20);

        Page<User> userPage = userMapper.selectPage(page, queryWrapper);
//        当前的集合对象
        List<User> records = userPage.getRecords();
        records.forEach(System.out::println);

//        当前页码
        System.out.println(page.getCurrent());
//        当前的条数
        System.out.println(page.getSize());
//        总条数
        System.out.println(page.getTotal());
//        总页数
        System.out.println(page.getPages());
//        是否有上一页
        System.out.println(page.hasPrevious());
//        是否有下一页
        System.out.println(page.hasNext());

    }


sql语句
SELECT uid AS id,name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (age > ?) LIMIT ?,?

2.xml自定义分页

很多时候我们需要写我们自己的分页查询条件,mp提供的分页有时候是不适用于我们的。

a>UserMapper中定义接口方法

  /*** 根据年龄查询用户列表,分页显示 * @param page 分页对象,xml中可以从里面进行取值,传递参数 Page
     *  即自动分页,必须放在第一位
     *  * @param age 年龄 * @return
     *  */
    IPage<User> getUserByAge(@Param("page") Page<User> page,@Param("age") Integer age);

b>UserMapper.xml中编写SQL

  <select id="getUserByAge" resultType="com.csdn.mybatisplus.bean.User">
        select uid as id, name, age, email,is_deleted as isDeleted
        from t_user
        where age > #{age}
    </select>

c>测试

   @Test
    public void testPage2(){
        Page<User> page = new Page<>(2,5);
        IPage<User> userByAge = userMapper.getUserByAge(page, 50);
        Page<User> pages = (Page<User>) userByAge;
        List<User> records = pages.getRecords();
        records.forEach(System.out::println);
    }

要拦截MybatisPlus的分页插件,可以通过创建一个自定义的拦截器来实现。具要拦截MybatisPlus的分页插件,可以通过创建一个自定义的拦截器来实现。具体步骤如下: 1. 创建一个类并实现Interceptor接口。 2. 在实现的intercept方法中,获取到当前执行的MappedStatement对象,判断是否是分页查询操作。 3. 如果是分页查询操作,则获取到分页参数,并根据参数重新构造SQL语句。 4. 最后将新的SQL语句和参数设置回MappedStatement对象中,完成拦截操作。 下面是一个示例代码,用于拦截MybatisPlus的分页插件: ``` public class MyPageInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { // 获取当前执行的MappedStatement对象 MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; // 判断是否是分页查询操作 if ("com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage".equals(mappedStatement.getId())) { // 获取分页参数 Object parameter = invocation.getArgs()[1]; Page<?> page = getPage(parameter); // 根据分页参数重新构造SQL语句 String originalSql = mappedStatement.getBoundSql(parameter).getSql(); String newSql = "SELECT * FROM (" + originalSql + ") tmp LIMIT " + page.getOffset() + "," + page.getSize(); // 将新的SQL语句和参数设置回MappedStatement对象中 BoundSql newBoundSql = new BoundSql(mappedStatement.getConfiguration(), newSql, mappedStatement.getBoundSql(parameter).getParameterMappings(), page); MappedStatement newMappedStatement = copyFromMappedStatement(mappedStatement, new BoundSqlSqlSource(newBoundSql)); invocation.getArgs()[0] = newMappedStatement; } // 继续执行原来的操作 return invocation.proceed(); } private Page<?> getPage(Object parameter) { if (parameter instanceof Page<?>) { return (Page<?>) parameter; } else if (parameter instanceof Map<?, ?>) { for (Object value : ((Map<?, ?>) parameter).values()) { if (value instanceof Page<?>) { return (Page<?>) value; } } } return null; } private MappedStatement copyFromMappedStatement(MappedStatement ms, SqlSource newSqlSource) { MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource, ms.getSqlCommandType()); builder.resource(ms.getResource()); builder.fetchSize(ms.getFetchSize()); builder.statementType(ms.getStatementType()); builder.keyGenerator(ms.getKeyGenerator()); builder.keyProperty(StringUtils.join(ms.getKeyProperties(), ",")); builder.timeout(ms.getTimeout()); builder.parameterMap(ms.getParameterMap()); builder.resultMaps(ms.getResultMaps()); builder.resultSetType(ms.getResultSetType()); builder.cache(ms.getCache()); builder.flushCacheRequired(ms.isFlushCacheRequired()); builder.useCache(ms.isUseCache()); return builder.build(); } } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喜欢编程的夏先生

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值