MyBatis-Plus拦截器动态拼接sql
时间: 2025-04-16 11:09:28 浏览: 40
### 使用 MyBatis-Plus 拦截器实现 SQL 语句的动态拼接
#### 自定义拦截器类
为了实现 SQL 的动态拼接,可以通过创建自定义拦截器来修改 SQL 语句。该拦截器继承 `Interceptor` 接口并重写相应的方法。
```java
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.Select;
import java.util.Properties;
public class DynamicTableNameInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
MetaObject metaStatementHandler = PluginUtils.metaObjectForObject(invocation.getArgs()[0]);
String originalSql = (String) metaStatementHandler.getValue("delegate.boundSql.sql");
Statement statement = CCJSqlParserUtil.parse(originalSql);
if (statement instanceof Select){
// 修改表名为动态获取到的新表名
((Select) statement).getFromItem().setAlias(new Table(getDynamicTableName()));
// 更新原始 SQL 字符串
metaStatementHandler.setValue("delegate.boundSql.sql", statement.toString());
}
return invocation.proceed();
}
private String getDynamicTableName() {
// 这里可以根据业务逻辑返回不同的表名
return "dynamic_table_name";
}
@Override
public void setProperties(Properties properties) {}
}
```
此代码片段展示了如何通过解析和重构 JSQL 解析树来更改查询中的表名称[^1]。
#### 注册拦截器
为了让上述自定义拦截器生效,在 Spring Boot 应用程序中注册它:
```yaml
mybatis-plus:
configuration:
interceptors:
- com.example.DynamicTableNameInterceptor
```
或者在 Java 配置文件中添加如下配置:
```java
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {
@Bean
public DynamicTableNameInterceptor dynamicTableNameInterceptor(){
return new DynamicTableNameInterceptor();
}
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(DynamicTableNameInterceptor interceptor){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(interceptor);
return mybatisPlusInterceptor;
}
}
```
这样就可以让应用程序根据实际运行情况灵活调整所访问的数据表[^2]。
阅读全文
相关推荐


















