java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatisPlus InnerInterceptor

MyBatis Plus中InnerInterceptor的实现

作者:十二同学啊

本文主要介绍了MyBatis Plus中InnerInterceptor的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 Spring Boot 项目中使用 MyBatis Plus 时,你可能会遇到 InnerInterceptor 这个概念。 InnerInterceptor 是 MyBatis Plus 提供的一种轻量级 SQL 拦截器,它与传统的 MyBatis 拦截器(Interceptor)有所不同,具有更简单、更高效的特点,并且更专注于 SQL 执行层面的拦截。本文将详细介绍 InnerInterceptor 的原理、用法和最佳实践,并提供代码示例。

一、为什么需要 InnerInterceptor?

二、InnerInterceptor 与 Interceptor 的区别

三、InnerInterceptor 的核心方法

四、实践:使用 InnerInterceptor 修改 SQL 语句

4.1 创建 InnerInterceptor 实现类:

import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.parser.CCJSqlParserManager;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;

import java.io.StringReader;
import java.sql.SQLException;

@Component
@Slf4j
public class MyInnerInterceptor implements InnerInterceptor {

    @Override
    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
        String sql = boundSql.getSql();
        try {
            PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
            //sql处理
            String filterSql = addFilterCondition(sql);
            log.info("修改过后的sql:{}", filterSql);
            //修改sql
            mpBs.sql(filterSql);
        } catch (Exception e) {
            log.warn("动态修改sql:{}异常", sql, e);
            throw new SQLException("添加数据权限异常");
        }
    }

    public String addFilterCondition(String originalSql) throws JSQLParserException {
        CCJSqlParserManager parserManager = new CCJSqlParserManager();
        Select select = (Select) parserManager.parse(new StringReader(originalSql));
        PlainSelect plain = (PlainSelect) select.getSelectBody();
        Expression where_expression = plain.getWhere();
        // 这里可以根据需要增加过滤条件
        if (where_expression == null) {
            plain.setWhere(CCJSqlParserUtil.parseCondExpression("age = 35"));
        }
        return plain.toString();
    }
}

4.2 配置 MybatisPlusInterceptor

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.extend.chk.interceptor.MyInnerInterceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.List;

@Configuration
public class MyBatisPlusConfig {

    @Autowired
    private List<SqlSessionFactory> sqlSessionFactoryList;

    @Autowired
    private MyInnerInterceptor myInnerInterceptor;

    /**
     * 添加Mybatis拦截器
     * 主要是为了保证数据权限拦截器在分页插件拦截器之前执行sql的修改,如果不在这里手动添加的话,PageInterceptor会先执行
     * 先添加的拦截器后执行
     */
    @PostConstruct
    public void addMybatisInterceptor() {
        for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList) {
            org.apache.ibatis.session.Configuration configuration = sqlSessionFactory.getConfiguration();
            //将数据权限拦截器添加到MybatisPlusInterceptor拦截器链
            MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
            mybatisPlusInterceptor.addInnerInterceptor(myInnerInterceptor);
            //先添加PageHelper分页插件拦截器,再添加MybatisPlusInterceptor拦截器
            //configuration.addInterceptor(new PageInterceptor());
            configuration.addInterceptor(mybatisPlusInterceptor);
        }
    }
}

4.3 使用 InnerInterceptor

现在,你执行任何 SQL 语句,都会被 InnerInterceptor 拦截,你可以看到 SQL 语句已经被修改。

修改过后的sql:SELECT count(0) FROM t_user_info WHERE age = 35
修改过后的sql:SELECT id, name, password, age, status, last_login_time, token, create_by, create_time, update_by, update_time, remark FROM t_user_info WHERE age = 35 LIMIT ?

五、内置拦截器

除了自定义拦截器外,MyBatis-Plus 还提供了多个内置拦截器,可以直接使用或作为参考来创建自己的拦截器。以下是几个常用的内置拦截器:

六、常见应用场景

七、最佳实践

到此这篇关于MyBatis Plus中InnerInterceptor的实现的文章就介绍到这了,更多相关MyBatisPlus InnerInterceptor内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文