package com.ruoyi.common.mybatis; import com.ruoyi.common.utils.SqlConverter; import com.ruoyi.common.utils.SpringContextUtils; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.plugin.*; import org.springframework.stereotype.Component; import java.sql.Connection; import java.util.Properties; /** * SQL转换拦截器 */ @Component @Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}) }) public class SqlConverterInterceptor implements Interceptor { private SqlConverter sqlConverter; @Override public Object intercept(Invocation invocation) throws Throwable { if (sqlConverter == null) { if (SpringContextUtils.getContext() == null) { // Spring容器还没初始化,直接跳过转换 return invocation.proceed(); } sqlConverter = SpringContextUtils.getBean(SqlConverter.class); } StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); String sql = statementHandler.getBoundSql().getSql(); // 转换SQL String convertedSql = sqlConverter.convertSql(sql); // 使用反射设置转换后的SQL java.lang.reflect.Field field = statementHandler.getBoundSql().getClass().getDeclaredField("sql"); field.setAccessible(true); field.set(statementHandler.getBoundSql(), convertedSql); return invocation.proceed(); } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { // 不需要设置属性 } }