【前后端分离博客】学习笔记02 --- 分页插件实现分页功能

开启分页插件

/**
 * 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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值