springboot整合mybatisplus实现分页查询(三)---分页插件: PaginationInnerInterceptor的使用

写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

通过前面两篇学习,了解了MP基本的CURD操作,但是到目前为止我们还没有分页功能,MP也为我们提供了分页插件PaginationInnerInterceptor,按照官方文档也有很详细的使用说明,使用分页功能,我们首先需要配置一下分页插件,在我们之前的MybatisPlusConfig中添加分页配置,直接从官访问当复制过来就可以:

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> configuration.setUseDeprecatedExecutor(false);
    }

接下来我们就可以使用MP的分页功能了,文档也有使用示例:

如上就是官方文档提供给我们的示例,但是,查询条件只有一个,想想我们平时的项目中,通常都是会有多个查询条件的,而我们通常都会将这想查询条件封装到一个对象中,我们会使用这个查询对象为参数,这么说起来,这个示例似乎有一些简陋了。

在使用分页前,先来看一下MP内置的分页接口IPage的默认实现Page类的部分方法:

如上:内置分页的默认实现类Page其实就可以直接使用了,咱们分页常用的像是getTotal总条数,getRecords查询结果这些都有,还有像是hasNext啊什么的是否有下一页,方法还挺全的。

在使用自定义的 mapper#method 使用分页前,先看下BaseMapper中为我们提供的分页查询方法selectPage方法,

<E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);

在CurdTest测试类中新增一个测试方法:

    @Test
    public void ePage(){
       Page<User> page = new Page<User>(1,3);
        LambdaQueryWrapper<User> wrapper = new QueryWrapper<User>().lambda()
                .ge(User::getAge,10).likeRight(User::getUserName,"zhang");
        Page<User> userPage = userMapper.selectPage(page, wrapper);
        System.out.println(userPage.getRecords());
        System.out.println(userPage.getTotal() + "---" + userPage.getPages());
    }

执行结果:

使用这个selectPage方法分页也挺方便的,只不过需要我们使用条件构造器自己构造查询条件,这个**Wrapper就是条件构造器,官方文档有很详细的使用说明,这里就不介绍了。

接下来,我们改造一下官方提供的示例吧,

首先新建一个查询对象UserQueryModel封装查询条件:

@Data
public class UserQueryModel {

    private Integer userId;
    private String userName;
    private Integer age;

}

分页信息我们直接使用MP的默认实现Page对象,我们使用MP内置IService接口时,没有使用MP的默认实现ServiceImpl一,而是自己新建了一个继承ServiceImpl的类,这里也一样,你也可以自己定义一个封装分页信息的类来接收分页参数。

UserMapper接口类中新增一个分页查询方法:

Page<User> selectUserList(Page<User> page,UserQueryModel userQueryModel);

UserMapper.xml中新增查询方法:

<resultMap id="userResultMap" type="com.example.springbootmp.domain.User">
        <id property="userId" column="user_id" />
        <result property="userName" column="user_name" />
        <result property="age" column="age" />
    </resultMap>

    <select id="selectUserList" parameterType="com.example.springbootmp.dto.user.UserQueryModel"
            resultMap="userResultMap">
        select * from t_user
        <where>
            <if test="userQueryModel.userId != null">user_id = #{userQueryModel.userId}</if>
            <if test="userQueryModel.age != null">and age &gt;= #{userQueryModel.age}</if>
            <if test="userQueryModel.userName != null">and user_name like concat('%',#{userQueryModel.userName},'%')</if>
            
        </where>
    </select>

在CurdTest测试类中新增一个测试方法:

    @Test
    public void fPage(){
        Page<User> page = new Page<User>(1,3);
        UserQueryModel queryModel = new UserQueryModel();
        queryModel.setAge(10);
        queryModel.setUserName("zhang");
        Page<User> userPage = userMapper.selectUserList(page, queryModel);
        System.out.println(userPage);
    }

执行结果:

至此,官方的查询示例改造就完成了!

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页