mybatis 拦截器获取完整sql和参数

378 阅读1分钟

如果涉及拦截SQL做一些操作可以用以下方式

@Component  
@Slf4j  
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})  
public class SqlInterceptor implements Interceptor {  
      
    @Override  
    public Object intercept(Invocation invocation) throws Throwable {  
        MappedStatement statement = (MappedStatement) invocation.getArgs()[0];  
        BoundSql sql = statement.getBoundSql(invocation.getArgs()[1]);  
          
        Field field = statement.getClass().getDeclaredField("configuration");  
        field.setAccessible(true);  
        Configuration configuration = (Configuration) ReflectionUtils.getField(field, statement);  
        // 这种姿势,与mybatis源码中参数解析姿势一致  
        MetaObject mo = configuration.newMetaObject(sql.getParameterObject());  
        List<Object> args = new ArrayList<>();  
        for (ParameterMapping key : sql.getParameterMappings()) {  
            args.add(mo.getValue(key.getProperty()));  
        }  
        try {  
            return invocation.proceed();  
        } finally {  
            log.error("------------> sql: " + sql.getSql() + "\n------------> args: " + args);  
        }  
    }  
      
    @Override  
    public Object plugin(Object target) {  
        return Plugin.wrap(target, this);  
    }  
  
    @Override  
    public void setProperties(Properties properties) {  
        // 可以在这里设置一些属性  
    }  
}