mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-07 00:58:24 +08:00
fixed NPE in ArrayTypeHandler.setNonNullParameter
This commit is contained in:
parent
42c623b3e2
commit
e4675c1047
@ -25,6 +25,7 @@ import org.apache.ibatis.session.Configuration;
|
||||
import org.apache.ibatis.type.TypeHandlerRegistry;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -93,7 +94,7 @@ public class AuditManager {
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static <T> T startAudit(AuditRunnable<T> supplier, BoundSql boundSql, Configuration configuration) throws SQLException {
|
||||
public static <T> T startAudit(AuditRunnable<T> supplier, Statement statement, BoundSql boundSql, Configuration configuration) throws SQLException {
|
||||
AuditMessage auditMessage = messageFactory.create();
|
||||
if (auditMessage == null) {
|
||||
return supplier.execute();
|
||||
@ -118,12 +119,12 @@ public class AuditManager {
|
||||
if (parameter instanceof Map) {
|
||||
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
|
||||
if (((Map<?, ?>) parameter).containsKey(FlexConsts.SQL_ARGS)) {
|
||||
auditMessage.addParams(((Map<?, ?>) parameter).get(FlexConsts.SQL_ARGS));
|
||||
auditMessage.addParams(statement, ((Map<?, ?>) parameter).get(FlexConsts.SQL_ARGS));
|
||||
} else if (((Map<?, ?>) parameter).containsKey("collection")) {
|
||||
Collection collection = (Collection) ((Map<?, ?>) parameter).get("collection");
|
||||
auditMessage.addParams(collection.toArray());
|
||||
auditMessage.addParams(statement, collection.toArray());
|
||||
} else if (((Map<?, ?>) parameter).containsKey("array")) {
|
||||
auditMessage.addParams(((Map<?, ?>) parameter).get("array"));
|
||||
auditMessage.addParams(statement, ((Map<?, ?>) parameter).get("array"));
|
||||
} else {
|
||||
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
|
||||
for (ParameterMapping parameterMapping : parameterMappings) {
|
||||
@ -138,7 +139,7 @@ public class AuditManager {
|
||||
MetaObject metaObject = configuration.newMetaObject(parameter);
|
||||
value = metaObject.getValue(propertyName);
|
||||
}
|
||||
auditMessage.addParams(value);
|
||||
auditMessage.addParams(statement, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,6 +24,7 @@ import java.lang.reflect.Array;
|
||||
import java.lang.reflect.Proxy;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@ -171,38 +172,47 @@ public class AuditMessage implements Serializable {
|
||||
this.queryParams = queryParams;
|
||||
}
|
||||
|
||||
public void addParams(Object... objects) {
|
||||
public void addParams(Statement statement, Object... objects) {
|
||||
if (queryParams == null) {
|
||||
queryParams = new ArrayList<>();
|
||||
}
|
||||
|
||||
for (Object object : objects) {
|
||||
if (object != null && ClassUtil.isArray(object.getClass())) {
|
||||
for (int i = 0; i < Array.getLength(object); i++) {
|
||||
addParams(Array.get(object, i));
|
||||
}
|
||||
} else if (object instanceof TypeHandlerObject) {
|
||||
try {
|
||||
((TypeHandlerObject) object).setParameter(createPreparedStatement(), 0);
|
||||
} catch (SQLException e) {
|
||||
//ignore
|
||||
doAddParam(statement, Array.get(object, i));
|
||||
}
|
||||
} else {
|
||||
queryParams.add(object);
|
||||
doAddParam(statement, object);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void doAddParam(Statement statement, Object object) {
|
||||
if (object instanceof TypeHandlerObject) {
|
||||
try {
|
||||
((TypeHandlerObject) object).setParameter(createPreparedStatement(statement), 0);
|
||||
} catch (SQLException e) {
|
||||
//ignore
|
||||
}
|
||||
} else {
|
||||
queryParams.add(object);
|
||||
}
|
||||
}
|
||||
|
||||
public String getFullSql() {
|
||||
List<Object> queryParams = getQueryParams();
|
||||
return SqlUtil.replaceSqlParams(getQuery(), queryParams == null ? null : queryParams.toArray());
|
||||
}
|
||||
|
||||
private PreparedStatement createPreparedStatement() {
|
||||
private PreparedStatement createPreparedStatement(Statement statement) {
|
||||
return (PreparedStatement) Proxy.newProxyInstance(
|
||||
AuditMessage.class.getClassLoader(),
|
||||
new Class[]{PreparedStatement.class}, (proxy, method, args) -> {
|
||||
if (args != null && args.length == 2) {
|
||||
addParams(args[1]);
|
||||
if (args != null && (args.length == 2 || args.length == 3)) {
|
||||
doAddParam(statement, args[1]);
|
||||
} else if ("getConnection".equals(method.getName())) {
|
||||
return statement.getConnection();
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
@ -83,7 +83,7 @@ public class FlexStatementHandler implements StatementHandler {
|
||||
AuditManager.startAudit(() -> {
|
||||
delegate.batch(statement);
|
||||
return null;
|
||||
}, boundSql, configuration);
|
||||
}, statement, boundSql, configuration);
|
||||
} else {
|
||||
delegate.batch(statement);
|
||||
}
|
||||
@ -91,19 +91,19 @@ public class FlexStatementHandler implements StatementHandler {
|
||||
|
||||
@Override
|
||||
public int update(Statement statement) throws SQLException {
|
||||
return auditEnable ? AuditManager.startAudit(() -> delegate.update(statement), boundSql,configuration)
|
||||
return auditEnable ? AuditManager.startAudit(() -> delegate.update(statement), statement, boundSql, configuration)
|
||||
: delegate.update(statement);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException {
|
||||
return auditEnable ? AuditManager.startAudit(() -> delegate.query(statement, resultHandler), boundSql, configuration)
|
||||
return auditEnable ? AuditManager.startAudit(() -> delegate.query(statement, resultHandler), statement, boundSql, configuration)
|
||||
: delegate.query(statement, resultHandler);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <E> Cursor<E> queryCursor(Statement statement) throws SQLException {
|
||||
return auditEnable ? AuditManager.startAudit(() -> delegate.queryCursor(statement), boundSql, configuration)
|
||||
return auditEnable ? AuditManager.startAudit(() -> delegate.queryCursor(statement), statement, boundSql, configuration)
|
||||
: delegate.queryCursor(statement);
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user