fix: 解决 XML 审计无法打印参数以及审计参数顺序问题,关闭 https://gitee.com/mybatis-flex/mybatis-flex/issues/I9TBG2https://gitee.com/mybatis-flex/mybatis-flex/issues/IAUFRN

This commit is contained in:
Suomm 2024-10-02 09:07:56 +08:00
parent d865f95af7
commit 9532289d7d

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2022-2025, Mybatis-Flex (fuhai999@gmail.com). * Copyright (c) 2022-2024, Mybatis-Flex (fuhai999@gmail.com).
* <p> * <p>
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -18,12 +18,12 @@ package com.mybatisflex.core.audit;
import com.mybatisflex.core.FlexConsts; import com.mybatisflex.core.FlexConsts;
import com.mybatisflex.core.FlexGlobalConfig; import com.mybatisflex.core.FlexGlobalConfig;
import com.mybatisflex.core.datasource.DataSourceKey; import com.mybatisflex.core.datasource.DataSourceKey;
import com.mybatisflex.core.util.CollectionUtil;
import com.mybatisflex.core.util.StringUtil; import com.mybatisflex.core.util.StringUtil;
import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.ParameterMapping; import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.mapping.ParameterMode; import org.apache.ibatis.mapping.ParameterMode;
import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.ParamNameResolver;
import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.type.TypeHandlerRegistry; import org.apache.ibatis.type.TypeHandlerRegistry;
@ -123,39 +123,46 @@ public class AuditManager {
} finally { } finally {
auditMessage.setElapsedTime(clock.getTick() - auditMessage.getQueryTime()); auditMessage.setElapsedTime(clock.getTick() - auditMessage.getQueryTime());
auditMessage.setQuery(boundSql.getSql()); auditMessage.setQuery(boundSql.getSql());
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
Object parameter = boundSql.getParameterObject(); Object parameter = boundSql.getParameterObject();
/** parameter 的组装请查看 getNamedParams 方法 // 实现 XML QueryWrapper 参数解析互不干涉
* @see ParamNameResolver#getNamedParams(Object[])
*/ if (CollectionUtil.isNotEmpty(parameterMappings)) {
if (parameter instanceof Map) { // 组装 XML 中的 #{user.age} 参数
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); for (ParameterMapping parameterMapping : parameterMappings) {
if (((Map<?, ?>) parameter).containsKey(FlexConsts.SQL_ARGS)) { if (parameterMapping.getMode() != ParameterMode.OUT) {
auditMessage.addParams(statement, ((Map<?, ?>) parameter).get(FlexConsts.SQL_ARGS)); Object value;
} else if (((Map<?, ?>) parameter).containsKey("collection")) { String propertyName = parameterMapping.getProperty();
Collection collection = (Collection) ((Map<?, ?>) parameter).get("collection"); if (boundSql.hasAdditionalParameter(propertyName)) {
auditMessage.addParams(statement, collection.toArray()); value = boundSql.getAdditionalParameter(propertyName);
} else if (((Map<?, ?>) parameter).containsKey("array")) { } else if (typeHandlerRegistry.hasTypeHandler(parameter.getClass())) {
auditMessage.addParams(statement, ((Map<?, ?>) parameter).get("array")); value = parameter;
} else { } else {
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); MetaObject metaObject = configuration.newMetaObject(parameter);
for (ParameterMapping parameterMapping : parameterMappings) { value = metaObject.getValue(propertyName);
if (parameterMapping.getMode() != ParameterMode.OUT) {
Object value;
String propertyName = parameterMapping.getProperty();
if (boundSql.hasAdditionalParameter(propertyName)) {
value = boundSql.getAdditionalParameter(propertyName);
} else if (typeHandlerRegistry.hasTypeHandler(parameter.getClass())) {
value = parameter;
} else {
MetaObject metaObject = configuration.newMetaObject(parameter);
value = metaObject.getValue(propertyName);
}
auditMessage.addParams(statement, value);
} }
auditMessage.addParams(statement, value);
}
}
} else {
// 组装 QueryWrapper 里面的 age = ? 参数
// parameter 的组装请查看 ParamNameResolver#getNamedParams(Object[]) 方法
if (parameter instanceof Map) {
Map<?, ?> map = (Map<?, ?>) parameter;
if (map.containsKey(FlexConsts.SQL_ARGS)) {
auditMessage.addParams(statement, map.get(FlexConsts.SQL_ARGS));
} else if (map.containsKey("collection")) {
Collection collection = (Collection) map.get("collection");
auditMessage.addParams(statement, collection.toArray());
} else if (map.containsKey("array")) {
auditMessage.addParams(statement, map.get("array"));
} }
} }
} }
messageCollector.collect(auditMessage); messageCollector.collect(auditMessage);
} }
} }