您觉得本文档还缺少什么内容?可以自己补充~
后端实现
后端采用Mybatis Plus 提供的插件实现,其中IService中已经封装好了单表分页查询,多表分页需要自己写sql实现。
配置分页插件
配置文件
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);
}
}
- 单表分页,只要继承了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());
}
多表分页或自定义分页, 需要在自己的Mapper中写sql语句
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);
}
- 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;
}