返回

从入门到精通:MybatisPlus Interceptor教程

后端

掌握 MybatisPlus Interceptor:轻松驾驭 SQL 拦截与拼接

作为一名程序员,你在数据库操作中一定接触过 MybatisPlus。今天,我们将深入探索它的一个强大特性:MybatisPlus Interceptor。

什么是 MybatisPlus Interceptor?

MybatisPlus Interceptor 是 MybatisPlus 提供的一款 SQL 拦截器,它允许你轻松地拦截和修改 SQL 语句。通过使用 Interceptor,你可以实现各种自定义功能,例如添加租户隔离、审计日志记录、SQL 优化等。

如何配置 MybatisPlus Interceptor

1. 配置 MybatisPlus 的 yml

mybatis-plus:
  configuration:
    interceptor:
      - com.example.demo.MybatisPlusInterceptor

2. 编写 MybatisPlus Interceptor

创建一个类来实现 MybatisPlus Interceptor 接口:

import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import org.apache.ibatis.cache.Cache;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;

import java.text.DateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Properties;

@Intercepts({
        @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
        @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
@Component
public class MybatisPlusInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 获取当前执行的SQL语句
        BoundSql boundSql = (BoundSql) invocation.getArgs()[1];
        String sql = boundSql.getSql();

        // 如果是查询语句,则进行SQL拦截
        if (sql.startsWith("SELECT")) {
            // 获取当前执行的MappedStatement
            MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
            // 获取当前执行的表信息
            TableInfo tableInfo = TableInfoHelper.getTableInfo(mappedStatement.getId());
            // 获取当前执行的租户ID
            String tenantId = "1";

            // 如果当前表存在租户ID字段,则在SQL语句中添加租户ID过滤条件
            if (tableInfo.hasField("tenant_id")) {
                sql = sql + " WHERE tenant_id = '" + tenantId + "'";
            }

            // 将修改后的SQL语句重新设置到BoundSql对象中
            boundSql.setSql(sql);
        }

        // 执行原有逻辑
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
        // 不做任何处理
    }
}

3. 配置 MybatisPlus 的 config

在 Spring 配置文件中配置 MybatisPlus Interceptor:

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        return new MybatisPlusInterceptor();
    }
}

示例:添加租户隔离

让我们以添加租户隔离为例,演示如何使用 MybatisPlus Interceptor。在上面的代码中,我们在 intercept() 方法中添加了以下逻辑:

// 如果是查询语句,则进行SQL拦截
if (sql.startsWith("SELECT")) {
    // ...

    // 如果当前表存在租户ID字段,则在SQL语句中添加租户ID过滤条件
    if (tableInfo.hasField("tenant_id")) {
        sql = sql + " WHERE tenant_id = '" + tenantId + "'";
    }
}

这将拦截所有 SELECT 语句,并自动在查询中添加一个租户 ID 过滤条件,从而实现租户隔离。

常见问题解答

1. MybatisPlus Interceptor 有哪些应用场景?

  • 租户隔离
  • 审计日志记录
  • SQL 优化
  • 数据脱敏
  • 分布式事务

2. MybatisPlus Interceptor 是如何工作的?

它通过拦截 SQL 语句并对其进行修改来实现的。你可以通过实现 intercept() 方法来定制拦截逻辑。

3. 如何配置 MybatisPlus Interceptor 的属性?

你可以通过在 setProperties() 方法中设置属性来配置 MybatisPlus Interceptor。

4. MybatisPlus Interceptor 与 Mybatis 的拦截器有什么区别?

MybatisPlus Interceptor 是专为 MybatisPlus 框架设计的,而 Mybatis 拦截器是通用的拦截器。

5. MybatisPlus Interceptor 有性能开销吗?

与其他拦截器相比,MybatisPlus Interceptor 具有较低的性能开销。

总结

MybatisPlus Interceptor 是一款功能强大的工具,可帮助你轻松地拦截和修改 SQL 语句。通过利用其强大的功能,你可以实现各种自定义需求,从而提升应用程序的性能和安全性。