开启分页插件
/**
* MybatisPlus配置
*
* @author DarkClouds
* @date 2023/05/09
*/
@Configuration
@MapperScan("com.wuyun.mapper")
public class MyBatisPlusConfig {
//开启分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
自动填充
/**
* MyBatis Plus自动填充
*
* @author DarkClouds
* @date 2023/05/09
*/
@Log4j2
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("新增:自动填充createTime:" + LocalDateTime.now(ZoneId.of(SHANGHAI.getZone())));
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now(ZoneId.of(SHANGHAI.getZone())));
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("更新:自动填充updateTime:" + LocalDateTime.now(ZoneId.of(SHANGHAI.getZone())));
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now(ZoneId.of(SHANGHAI.getZone())));
}
}
配置分页拦截器
说明:该拦截器拦截所有请求,判断当前请求是否有分页需求,如果获取到了页码,则直接调用分页工具类PageUtils写入分页信息,在操作数据库的时候直接调用PageUtils获取页码、条数,进行分页查询
/**
* 分页拦截器
*
* @author DarkClouds
* @date 2023/05/10
*/
public class PageableInterceptor implements HandlerInterceptor {
/**
* 在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理
*
* @param request 请求
* @param response 响应
* @param handler 处理程序
* @return boolean
*/
@Override
public boolean preHandle(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) {
//获取当前请求的页码
String currentPage = request.getParameter(CURRENT);
///获取当前请求的分页条数
String pageSize = Optional.ofNullable(request.getParameter(SIZE)).orElse(DEFAULT_SIZE);
//如果获取到了页码,则开启分页线程
if (StringUtils.hasText(currentPage)) {
//开启线程
PageUtils.setCurrentPage(new Page<>(Long.parseLong(currentPage), Long.parseLong(pageSize)));
}
return true;
}
/**
* 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面)
*
* @param request 请求
* @param response 响应
* @param handler 处理程序
* @param ex 前女友
*/
@Override
public void afterCompletion(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler, Exception ex) {
//调用完成销毁此线程
PageUtils.remove();
}
}
分页工具类
/**
* 分页工具类
* 类用来提供线程内部的局部变量,不同的线程之间不会相互干扰
* @author DarkClouds
* @date 2023/05/10
*/
public class PageUtils {
private static final ThreadLocal<Page<?>> PAGE_HOLDER = new ThreadLocal<>();
public static void setCurrentPage(Page<?> page) {
PAGE_HOLDER.set(page);
}
public static Page<?> getPage() {
Page<?> page = PAGE_HOLDER.get();
if (Objects.isNull(page)) {
setCurrentPage(new Page<>());
}
return PAGE_HOLDER.get();
}
public static Long getCurrent() {
return getPage().getCurrent();
}
public static Long getSize() {
return getPage().getSize();
}
public static Long getLimit() {
return (getCurrent() - 1) * getSize();
}
//销毁
public static void remove() {
PAGE_HOLDER.remove();
}
}
该项目前端编写了统一分页数据接口接收,所以单独写了分页返回类,返回分页结果,没有使用MybatisPlus的分页返回结果
这里为什么要单独编写一个分页返回类,不使用 new Page() 返回
而且单独编写返回类,写SQL的时候还要手动写上LIMIT获取页码
有没有大佬解答一下
/**
* 分页返回类
*
* @author DarkClouds
* @date 2023/05/11
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "分页返回类")
public class PageResult<T> {
/**
* 分页结果
*/
@ApiModelProperty(value = "分页结果")
private List<T> recordList;
/**
* 总数
*/
@ApiModelProperty(value = "总数", dataType = "long")
private Long count;
}