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之分页功能/
发布于
2024年4月21日
更新于
2024年5月12日
许可协议