fixed: 审计日志中赋值异常的问题 close #I6Z1R8

This commit is contained in:
开源海哥 2023-04-26 16:45:48 +08:00
parent bf5e1c8bf2
commit 73bc5e0ec5
5 changed files with 52 additions and 18 deletions

View File

@ -17,10 +17,16 @@ package com.mybatisflex.core.audit;
import com.mybatisflex.core.FlexConsts; import com.mybatisflex.core.FlexConsts;
import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.mapping.ParameterMode;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.ParamNameResolver; import org.apache.ibatis.reflection.ParamNameResolver;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.type.TypeHandlerRegistry;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@ -80,7 +86,7 @@ public class AuditManager {
} }
} }
public static <T> T startAudit(AuditRunnable<T> supplier, BoundSql boundSql) throws SQLException { public static <T> T startAudit(AuditRunnable<T> supplier, BoundSql boundSql, Configuration configuration) throws SQLException {
AuditMessage auditMessage = MessageFactory.create(); AuditMessage auditMessage = MessageFactory.create();
if (auditMessage == null) { if (auditMessage == null) {
return supplier.execute(); return supplier.execute();
@ -99,11 +105,11 @@ public class AuditManager {
auditMessage.setQuery(boundSql.getSql()); auditMessage.setQuery(boundSql.getSql());
Object parameter = boundSql.getParameterObject(); Object parameter = boundSql.getParameterObject();
/** parameter 的组装请查看 getNamedParams 方法 /** parameter 的组装请查看 getNamedParams 方法
* @see ParamNameResolver#getNamedParams(Object[]) * @see ParamNameResolver#getNamedParams(Object[])
*/ */
if (parameter instanceof Map) { if (parameter instanceof Map) {
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
if (((Map<?, ?>) parameter).containsKey(FlexConsts.SQL_ARGS)) { if (((Map<?, ?>) parameter).containsKey(FlexConsts.SQL_ARGS)) {
auditMessage.addParams(((Map<?, ?>) parameter).get(FlexConsts.SQL_ARGS)); auditMessage.addParams(((Map<?, ?>) parameter).get(FlexConsts.SQL_ARGS));
} else if (((Map<?, ?>) parameter).containsKey("collection")) { } else if (((Map<?, ?>) parameter).containsKey("collection")) {
@ -112,9 +118,20 @@ public class AuditManager {
} else if (((Map<?, ?>) parameter).containsKey("array")) { } else if (((Map<?, ?>) parameter).containsKey("array")) {
auditMessage.addParams(((Map<?, ?>) parameter).get("array")); auditMessage.addParams(((Map<?, ?>) parameter).get("array"));
} else { } else {
for (int i = 1; i <= 100; i++) { List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
if (((Map<?, ?>) parameter).containsKey(ParamNameResolver.GENERIC_NAME_PREFIX + i)) { for (ParameterMapping parameterMapping : parameterMappings) {
auditMessage.addParams(((Map<?, ?>) parameter).get(ParamNameResolver.GENERIC_NAME_PREFIX + i)); 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(value);
} }
} }
} }

View File

@ -15,12 +15,6 @@
*/ */
package com.mybatisflex.core.audit; package com.mybatisflex.core.audit;
import com.mybatisflex.core.util.DateUtil;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
public class ConsoleMessageCollector implements MessageCollector { public class ConsoleMessageCollector implements MessageCollector {

View File

@ -25,6 +25,7 @@ import org.apache.ibatis.executor.statement.SimpleStatementHandler;
import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds; import org.apache.ibatis.session.RowBounds;
@ -44,9 +45,10 @@ public class FlexStatementHandler implements StatementHandler {
private final StatementHandler delegate; private final StatementHandler delegate;
private final BoundSql boundSql; private final BoundSql boundSql;
private final boolean auditEnable = AuditManager.isAuditEnable(); private final boolean auditEnable = AuditManager.isAuditEnable();
private final Configuration configuration;
public FlexStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { public FlexStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
configuration = ms.getConfiguration();
switch (ms.getStatementType()) { switch (ms.getStatementType()) {
case STATEMENT: case STATEMENT:
delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql); delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
@ -82,7 +84,7 @@ public class FlexStatementHandler implements StatementHandler {
AuditManager.startAudit(() -> { AuditManager.startAudit(() -> {
delegate.batch(statement); delegate.batch(statement);
return null; return null;
}, boundSql); }, boundSql, configuration);
} else { } else {
delegate.batch(statement); delegate.batch(statement);
} }
@ -90,19 +92,19 @@ public class FlexStatementHandler implements StatementHandler {
@Override @Override
public int update(Statement statement) throws SQLException { public int update(Statement statement) throws SQLException {
return auditEnable ? AuditManager.startAudit(() -> delegate.update(statement), boundSql) return auditEnable ? AuditManager.startAudit(() -> delegate.update(statement), boundSql,configuration)
: delegate.update(statement); : delegate.update(statement);
} }
@Override @Override
public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException { public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException {
return auditEnable ? AuditManager.startAudit(() -> delegate.query(statement, resultHandler), boundSql) return auditEnable ? AuditManager.startAudit(() -> delegate.query(statement, resultHandler), boundSql, configuration)
: delegate.query(statement, resultHandler); : delegate.query(statement, resultHandler);
} }
@Override @Override
public <E> Cursor<E> queryCursor(Statement statement) throws SQLException { public <E> Cursor<E> queryCursor(Statement statement) throws SQLException {
return auditEnable ? AuditManager.startAudit(() -> delegate.queryCursor(statement), boundSql) return auditEnable ? AuditManager.startAudit(() -> delegate.queryCursor(statement), boundSql, configuration)
: delegate.queryCursor(statement); : delegate.queryCursor(statement);
} }

View File

@ -15,14 +15,21 @@
*/ */
package com.mybatisflex.test; package com.mybatisflex.test;
import com.mybatisflex.core.audit.AuditManager;
import com.mybatisflex.core.audit.ConsoleMessageCollector;
import com.mybatisflex.core.audit.MessageCollector;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
@SpringBootApplication @SpringBootApplication
@Configuration
@MapperScan("com.mybatisflex.test.mapper") @MapperScan("com.mybatisflex.test.mapper")
public class SampleApplication implements CommandLineRunner { public class SampleApplication implements CommandLineRunner, ApplicationListener<ContextRefreshedEvent> {
// @Resource // @Resource
@ -40,4 +47,18 @@ public class SampleApplication implements CommandLineRunner {
} }
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println("onApplicationEvent");
//开启审计功能
AuditManager.setAuditEnable(true);
//设置 SQL 审计收集器
MessageCollector collector = new ConsoleMessageCollector();
AuditManager.setMessageCollector(collector);
}
} }

View File

@ -9,6 +9,6 @@ public interface MyAccountMapper extends AccountMapper {
Account selectByName(@Param("name") String name); Account selectByName(@Param("name") String name);
@Select("select * from tb_account where id = #{id}") @Select("select * from tb_account where id = #{id} and id =#{id}")
Account selectById(@Param("id") Object id); Account selectById(@Param("id") Object id);
} }