您觉得本文档还缺少什么内容?可以自己补充~

后端实现

后端采用Mybatis Plus 提供的插件实现,其中IService中已经封装好了单表分页查询,多表分页需要自己写sql实现。

  1. 配置分页插件

  2. 配置文件

bc:
  database:
    maxLimit: -1  #分页大小限制
    dbType: MYSQL  # 数据库类型
    overflow: true  # 溢出总页数后是否进行处理
    optimizeJoin: true  #  生成 countSql 优化掉 join 现在只支持 left join
  • 配置代码
public abstract class BaseMybatisConfiguration {
    @Bean
    @Order(5)
    @ConditionalOnMissingBean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件
        PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor();
        // 单页分页条数限制
        paginationInterceptor.setMaxLimit(databaseProperties.getMaxLimit());
        // 数据库类型
        paginationInterceptor.setDbType(databaseProperties.getDbType());
        // 溢出总页数后是否进行处理
        paginationInterceptor.setOverflow(databaseProperties.getOverflow());
        // 生成 countSql 优化掉 join 现在只支持 left join
        paginationInterceptor.setOptimizeJoin(databaseProperties.getOptimizeJoin());

        interceptor.addInnerInterceptor(paginationInterceptor);
    }
}
  1. 单表分页,只要继承了IService,均可直接使用:
/**
     * 翻页查询
     *
     * @param page         翻页对象
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper) {
        return getBaseMapper().selectPage(page, queryWrapper);
    }

    /**
     * 无条件翻页查询
     *
     * @param page 翻页对象
     * @see Wrappers#emptyWrapper()
     */
    default <E extends IPage<T>> E page(E page) {
        return page(page, Wrappers.emptyWrapper());
    }
    /**
     * 翻页查询
     *
     * @param page         翻页对象
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    default <E extends IPage<Map<String, Object>>> E pageMaps(E page, Wrapper<T> queryWrapper) {
        return getBaseMapper().selectMapsPage(page, queryWrapper);
    }

    /**
     * 无条件翻页查询
     *
     * @param page 翻页对象
     * @see Wrappers#emptyWrapper()
     */
    default <E extends IPage<Map<String, Object>>> E pageMaps(E page) {
        return pageMaps(page, Wrappers.emptyWrapper());
    }
  1. 多表分页或自定义分页, 需要在自己的Mapper中写sql语句

  2. UserMapper.java 方法内容

public interface UserMapper {
    //可以继承或者不继承BaseMapper
    /**
     * <p>
     * 查询 : 根据state状态查询用户列表,分页显示
     * </p>
     *
     * @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象)
     * @param state 状态
     * @return 分页对象
     */
    IPage<User> selectPageVo(Page<?> page, Integer state);
}
  • UserMapper.xml 等同于编写一个普通 list 查询,mybatis-plus 自动替你分页
<select id="selectPageVo" resultType="com.baomidou.cloud.entity.UserVo">
    SELECT id,name FROM user WHERE state=#{state}
</select>
  • UserServiceImpl.java 调用分页方法
public IPage<User> selectUserPage(Page<User> page, Integer state) {
    // 不进行 count sql 优化,解决 MP 无法自动优化 SQL 问题,这时候你需要自己查询 count 部分
    // page.setOptimizeCountSql(false);
    // 当 total 为小于 0 或者设置 setSearchCount(false) 分页插件不会进行 count 查询
    // 要点!! 分页返回的对象与传入的对象是同一个
    return userMapper.selectPageVo(page, state);
}
  1. QueryController 控制层封装了page 方法,接收PageParams格式的json参数,调用了query方法后, 返回IPage .
@PostMapping(value = "/page")
default R<IPage<Entity>> page(@RequestBody @Validated PageParams<PageQuery> params) {
    return success(query(params));
}

default IPage<Entity> query(PageParams<PageQuery> params) {
    // 处理查询参数,如:覆盖前端传递的 current、size、sort 等参数 以及 model 中的参数 【提供给之类重写】【无默认实现】
    handlerQueryParams(params);

    // 构建分页参数(current、size)和排序字段等
    IPage<Entity> page = params.buildPage(getEntityClass());
    Entity model = BeanUtil.toBean(params.getModel(), getEntityClass());

    // 根据前端传递的参数,构建查询条件【提供给之类重写】【有默认实现】
    QueryWrap<Entity> wrapper = handlerWrapper(model, params);

    // 执行单表分页查询
    getBaseService().page(page, wrapper);

    // 处理查询后的分页结果, 如:调用EchoService回显字典、关联表数据等 【提供给之类重写】【无默认实现】
    handlerResult(page);
    return page;
}

results matching ""

    No results matching ""