ruoyi-vue-plus之分页功能
文档地址:点击这里
项目地址:点击这里
Mybatis-Plus分页插件:点击这里
使用流程
配置方法
本文章重点讲解分页功能,下面是本项目的mybatis-plus的配置类,已忽略掉数据权限处理和乐观锁插件。
// 启用事务管理的注解,该注解用于配置类上
@EnableTransactionManagement(proxyTargetClass = true)
// 当前的自动配置类应该在 MybatisPlusAutoConfiguration.class 之前被加载和生效
@AutoConfiguration(before = MybatisPlusAutoConfiguration.class)
// 注解用于指定要扫描的 Mapper 接口所在的包路径,并将这些接口注册为 Spring 的 Bean
@MapperScan("${mybatis-plus.mapperPackage}")
// value指定了要加载的属性文件的位置 factory指定了属性文件加载的工厂类
// 这个工厂类负责将属性文件解析为 Spring 的 PropertySource 对象,使得应用程序能够读取其中的属性值。
@PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class)
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(paginationInnerInterceptor());
return interceptor;
}
/**
* 分页插件,自动识别数据库类型
*/
public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInnerInterceptor.setMaxLimit(-1L);
// 分页合理化,溢出总页数后进行处理
paginationInnerInterceptor.setOverflow(true);
return paginationInnerInterceptor;
}
}
由于该项目有多数据源,故没有配上具体的DbType
控制层
例如,获取用户列表
控制层代码
/**
* 获取用户列表
*/
@SaCheckPermission("system:user:list")
@GetMapping("/list")
public TableDataInfo<SysUserVo> list(SysUserBo user, PageQuery pageQuery) {
return userService.selectPageUserList(user, pageQuery);
}
返回对象是TableDataInfo<SysUserVo>
,参数是SysUserBo和PageQuery。
注意,SysUserBo对象前面没有@RequestBody,原因是参数通过url路径传递(Query String Parameters).如果是参数是通过请求体传递(Request Payload),则需要添加@RequestBody.
TableDataInfo<T>
TableDataInfo<T>
是表格分页数据对象,用于返回前端。通过build()方法构造出返回对象。
public static <T> TableDataInfo<T> build(IPage<T> page) {
TableDataInfo<T> rspData = new TableDataInfo<>();
rspData.setCode(HttpStatus.HTTP_OK);
rspData.setMsg("查询成功");
rspData.setRows(page.getRecords());
rspData.setTotal(page.getTotal());
return rspData;
}
重载方法:build(List<T> list)
和 build()
也能构造出返回对象
PageQuery
PageQuery是分页查询实体类,核心是build()方法
public <T> Page<T> build() {
// DEFAULT_PAGE_NUM默认为1
Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM);
// DEFAULT_PAGE_SIZE默认为Integer.MAX_VALUE
Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE);
if (pageNum <= 0) {
pageNum = DEFAULT_PAGE_NUM;
}
Page<T> page = new Page<>(pageNum, pageSize);
// 构建排序
List<OrderItem> orderItems = buildOrderItem();
if (CollUtil.isNotEmpty(orderItems)) {
page.addOrder(orderItems);
}
return page;
}
返回类型是Page<T>
,是接口 Ipage<T>
的实现类,用来实现分页,拼接分页语句
服务层
数据层
mapper
// 数据权限注解
@DataPermission({
@DataColumn(key = "deptName", value = "d.dept_id"),
@DataColumn(key = "userName", value = "u.user_id")
})
Page<SysUserVo> selectPageUserList(@Param("page") Page<SysUser> page, @Param(Constants.WRAPPER) Wrapper<SysUser> queryWrapper);
mapper.xml
<select id="selectPageUserList" resultMap="SysUserResult">
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
d.dept_name, d.leader, u1.user_name as leaderName
from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
left join sys_user u1 on u1.user_id = d.leader
${ew.getCustomSqlSegment}
</select>
从mapper.xml文件中看出,最后拼接了${ew.getCustomSqlSegment}
,也就是参数queryWrapper。而page是mybatis-puls自动帮我们拼接的。当调用list接口时,sql的执行语句如下,拼接了分页条件
ruoyi-vue-plus之分页功能
http://example.com/2024/04/21/ruoyi-vue-plus之分页功能/