MyBatis-plus一些总结感受

2022-12-03 13:05:20 浏览数 (1)

因为做的是门户类型的项目.这两天测试给提了个问题,在分页的时候,直接从地址栏修改了一个超出最大页码的页数,返回的结果竟然是空白页面,平时前后端分离的时候,没有碰到过,现在有两种解决方式:

  1. 后端处理
  2. 前端调用接口的时候根据maxPage进行判断

当然第二种处理方式比较简单,但是依稀记得以前用的分页pageHelper插件超出最大值时会自动判断,故做一下研究 通过查询mybatis-plus的官网,MybatisPlusInterceptor 其中的自动分页是比较符合的

代码语言:javascript复制
自动分页: PaginationInnerInterceptor
代码语言:javascript复制
多租户: TenantLineInnerInterceptor
代码语言:javascript复制
动态表名: DynamicTableNameInnerInterceptor
代码语言:javascript复制
乐观锁: OptimisticLockerInnerInterceptor
代码语言:javascript复制
sql 性能规范: IllegalSQLInnerInterceptor
代码语言:javascript复制
防止全表更新与删除: BlockAttackInnerInterceptor

通过重写PaginationInnerInterceptor的方法,可以实现的有:

代码语言:javascript复制
overflow 溢出总页数后是否进行处理(我们需要的东西),
代码语言:javascript复制
maxLimit 	单页分页条数限制(默认无限制),
代码语言:javascript复制
dbType 数据库类型(根据类型获取应使用的分页方言) ,
代码语言:javascript复制
dialect 方言实现类

下面的代码是超出最大页返回第一页

代码语言:javascript复制
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        //  插件
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        // 设置最大分页数
        paginationInnerInterceptor.setMaxLimit(100L);
        // 是否对超过最大分页时做溢出处理
        paginationInnerInterceptor.setOverflow(true);
        // 设置数据库类型
        paginationInnerInterceptor.setDbType(DbType.MARIADB);
        //paginationInnerInterceptor.setProperties();
       // paginationInnerInterceptor.setDialect();
        //paginationInnerInterceptor.setOptimizeJoin();
        // 添加分页插件
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }

而想返回最后一页的话,要重写handlerOverflow方法

  1. 新建NewPaginationInnerInterceptor 类,重写handlerOverflow方法:
代码语言:javascript复制
 import com.baomidou.mybatisplus.annotation.DbType;
    import com.baomidou.mybatisplus.core.metadata.IPage;
    import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    /**
     * @author Tony brings water
     * @date 2021/8/18 14:10
     * 分页删除某页唯一记录后,自动跳转至前一页(默认实现是跳转至首页)
     */
    @Data
    @NoArgsConstructor
    public class NewPaginationInnerInterceptor extends PaginationInnerInterceptor {
    private DbType dbType;
    public NewPaginationInnerInterceptor(DbType dbType) {
    this.dbType = dbType;
    }
    @Override
    protected void handlerOverflow(IPage<?> page) {
    //查询前一页
    page.setCurrent(page.getCurrent() - 1);
    }
    }
  1. 修改MyBatis Plus配置,使用NewPaginationInnerInterceptor:
代码语言:javascript复制
    @Configuration
    public class MybatisConfig {
     @Bean
     public MybatisPlusInterceptor mybatisPlusInterceptor() {
     MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
     //设置分页插件属性:请求页超出范围时,返回前一页
     NewPaginationInnerInterceptor paginationInnerInterceptor = new NewPaginationInnerInterceptor
     paginationInnerInterceptor.setOverflow(true);
     interceptor.addInnerInterceptor(paginationInnerInterceptor);
     return interceptor;
     }
    }

但是在写的时候,突然发现idea没有提示,自己写上去也是报错的...后来发现mybatis-plus插件版本要求3.4.0以上,而项目中的是3.2的版本 项目开始的时候3.4.0还未发布, 查询了一下3.4之前的版本设置,跟现有版本的实现逻辑不一样,只能够设置超出跳转第一页... 幸好前端也可以解决,留下的疑问,只好后面如果碰到再解决吧

0 人点赞