写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
通过前面两篇学习,了解了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就是条件构造器,官方文档有很详细的使用说明,这里就不介绍了。
注意:不要忘了配置分页插件,否则虽然能查出数据,但是分页是有问题的,查询结果中total会为0
接下来,我们改造一下官方提供的示例吧,
首先新建一个查询对象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 >= #{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);
}
执行结果:
至此,官方的查询示例改造就完成了!