@Component
@Intercepts({
@Signature(
type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class
})
})
public class MySqlInterceptor implements Interceptor {
@Autowired
private RedisService redisService;
@Autowired
private CommonObjService commonObjService;
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());
MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
String id = mappedStatement.getId();
String sqlCommandType = mappedStatement.getSqlCommandType().toString();
BoundSql boundSql = statementHandler.getBoundSql();
String sql = boundSql.getSql().toLowerCase();
String mSql = sql;
//注解逻辑判断 添加注解了才拦截
Class<?> classType = Class.forName(mappedStatement.getId().substring(0, mappedStatement.getId().lastIndexOf(".")));
String mName = mappedStatement.getId().substring(mappedStatement.getId().lastIndexOf(".") + 1, mappedStatement.getId().length());
for (Method method : classType.getDeclaredMethods()) {
if (mName.equals(method.getName())) {
// InterceptAnnotation interceptorAnnotation = method.getAnnotation(InterceptAnnotation.class);
// if (interceptorAnnotation.flag()) {
if ("SELECT".equals(sqlCommandType) && sql.indexOf("*")>-1){
String newSqlColumns = "";
String prefix = "";
String sqlColumns = StringKit.subString(sql,"select","from");
if (sqlColumns.indexOf(".*")>-1){
prefix= StringKit.subString(sql,"select",".*").trim();
}
String tableName = StringUtils.trim(StringKit.subString(sql,"from","where"));
if (redisService.get(CommonMDA.REDIS_CONFIG_PREFIX+tableName) == null){
newSqlColumns = commonObjService.genColumns(tableName,prefix);
}else{
newSqlColumns = (String)redisService.get(CommonMDA.REDIS_CONFIG_PREFIX+tableName);
}
newSqlColumns = " "+newSqlColumns+" ";
if (sqlColumns.indexOf("distinct")>-1){
newSqlColumns = " distinct"+newSqlColumns;
}
mSql = sql.replace(sqlColumns,newSqlColumns);
}
// }
}
}
//通过反射修改sql语句
Field field = boundSql.getClass().getDeclaredField("sql");
field.setAccessible(true);
field.set(boundSql, mSql);
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
if (target instanceof StatementHandler) {
return Plugin.wrap(target, this);
} else {
return target;
}
}
@Override
public void setProperties(Properties properties) {
}
}
mybatis sql拦截器
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...