From e4675c1047efd26f2f96e7e974c7b2e3d8d2ac48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Wed, 28 Jun 2023 11:02:50 +0800 Subject: [PATCH] fixed NPE in ArrayTypeHandler.setNonNullParameter --- .../mybatisflex/core/audit/AuditManager.java | 11 +++--- .../mybatisflex/core/audit/AuditMessage.java | 34 ++++++++++++------- .../core/mybatis/FlexStatementHandler.java | 8 ++--- 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/audit/AuditManager.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/audit/AuditManager.java index c22a15ae..741dc581 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/audit/AuditManager.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/audit/AuditManager.java @@ -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 startAudit(AuditRunnable supplier, BoundSql boundSql, Configuration configuration) throws SQLException { + public static T startAudit(AuditRunnable 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 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); } } } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/audit/AuditMessage.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/audit/AuditMessage.java index 61925c35..098dfaad 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/audit/AuditMessage.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/audit/AuditMessage.java @@ -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 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; }); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexStatementHandler.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexStatementHandler.java index 8fc09efc..2cca38b1 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexStatementHandler.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexStatementHandler.java @@ -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 List 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 Cursor 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); }