解决Mybatis自定义拦截器跟分页插件冲突

本文详细介绍了在Mybatis中,分页拦截器与自定义拦截器不兼容的问题及解决办法。问题在于分页拦截器在自定义拦截器之前执行,导致自定义的SQL修改无效。解决思路包括明确拦截对象类型,理解执行顺序,并通过调整拦截器配置顺序来确保自定义拦截器能在分页之前生效。文中提供了具体的配置代码示例,以及启动类中排除PageHelper自动配置的处理,以避免冲突。
摘要由CSDN通过智能技术生成

问题描述:自定义拦截器无法兼容分页拦截器,分页的拦截器会在自定义拦截器之前执行
原因:查阅官方拦截器使用文档,发现分页插件的拦截器拦截的是execute类型的过程,是框架最先处理的拦截类型,因此再使用statement类型的拦截不会生效,因为总是在分页的拦截之后,会导致分页count(0)出现sql错误。
解决:将拦截类型都改为execute,并且配置拦截器的时候将自定义拦截器放到分页拦截器后,由于拦截器使用责任链模式还有代理模式,导致最后设置的拦截器会最先执行
解决思路
1、清楚分页插件拦截的是何种对象,再清楚自己设置的拦截器需要对sql进行什么样的处理。例如修改sql,那么就是要再分页之前先拦截到
2、清楚各类拦截对象的执行顺序

操作步骤
1、修改sql的拦截器需要拦截Executor,因为涉及到分页插件,为啥可以看下官网的资料,链接在底下。拦截器的intercept方法就用官网的写法

@Intercepts({
        @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
        @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),
        })

2、手动配置拦截器顺序

@Configuration
public class MybatisPageHelp {
    @Autowired
    private List<SqlSessionFactory> sqlSessionFactoryList;
    /**
     * 接受分页插件额外的属性
     *
     * @return
     */
    @Bean
    @ConfigurationProperties(prefix = "pagehelper")
    public Properties pageHelperProperties() {
        return new Properties();
    }

    @PostConstruct
    public void addPageInterceptor() {
        SqlIntercept sqlIntercept = new SqlIntercept ();
        PageInterceptor pageInterceptor = new PageInterceptor();
        Properties properties = new Properties();
        //先把一般方式配置的属性放进去
        properties.putAll(pageHelperProperties());
        //在把特殊配置放进去,由于close-conn 利用上面方式时,属性名就是 close-conn 而不是 closeConn,所以需要额外的一步
        pageInterceptor.setProperties(properties);
        for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList) {
            sqlSessionFactory.getConfiguration().addInterceptor(pageInterceptor);
            sqlSessionFactory.getConfiguration().addInterceptor(sqlIntercept );
        }
    }
}

3、上述配置完会出现系统出现多个插件的报错,在启动类的@SpringBootApplication注解加以下

@SpringBootApplication(exclude = PageHelperAutoConfiguration.class)

拦截器使用文档官网地址

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值