From 1d3860d18ac7ed1dee71b055c5d0aacdb1e2a8da Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Fri, 1 Mar 2024 10:20:10 +0800 Subject: [PATCH] refactor: optimize FlexDefaultResultSetHandler.java --- .../core/mybatis/FlexConfiguration.java | 2 +- .../mybatis/FlexDefaultResultSetHandler.java | 14 +++-- .../core/mybatis/SqlArgsParameterHandler.java | 54 +++++++++---------- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexConfiguration.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexConfiguration.java index fd631838..5d3d4602 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexConfiguration.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexConfiguration.java @@ -85,7 +85,7 @@ public class FlexConfiguration extends Configuration { if (!mappedStatementId.endsWith(SelectKeyGenerator.SELECT_KEY_SUFFIX) && parameterObject instanceof Map && ((Map) parameterObject).containsKey(FlexConsts.SQL_ARGS)) { - SqlArgsParameterHandler sqlArgsParameterHandler = new SqlArgsParameterHandler(mappedStatement, (Map) parameterObject, boundSql); + SqlArgsParameterHandler sqlArgsParameterHandler = new SqlArgsParameterHandler(mappedStatement, parameterObject, boundSql); return (ParameterHandler) interceptorChain.pluginAll(sqlArgsParameterHandler); } else { return super.newParameterHandler(mappedStatement, parameterObject, boundSql); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexDefaultResultSetHandler.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexDefaultResultSetHandler.java index 578a8dad..ab202613 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexDefaultResultSetHandler.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexDefaultResultSetHandler.java @@ -15,7 +15,6 @@ */ package com.mybatisflex.core.mybatis; -import com.mybatisflex.core.util.StringUtil; import org.apache.ibatis.annotations.AutomapConstructor; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.binding.MapperMethod.ParamMap; @@ -927,10 +926,15 @@ public class FlexDefaultResultSetHandler extends DefaultResultSetHandler { private Object prepareSimpleKeyParameter(ResultSet rs, ResultMapping resultMapping, Class parameterType, String columnPrefix) throws SQLException { - final TypeHandler typeHandler; - if (typeHandlerRegistry.hasTypeHandler(parameterType)) { - typeHandler = typeHandlerRegistry.getTypeHandler(parameterType); - } else { +// final TypeHandler typeHandler; +// if (typeHandlerRegistry.hasTypeHandler(parameterType)) { +// typeHandler = typeHandlerRegistry.getTypeHandler(parameterType); +// } else { +// typeHandler = typeHandlerRegistry.getUnknownTypeHandler(); +// } + + TypeHandler typeHandler = typeHandlerRegistry.getTypeHandler(parameterType); + if (typeHandler == null) { typeHandler = typeHandlerRegistry.getUnknownTypeHandler(); } return typeHandler.getResult(rs, prependPrefix(resultMapping.getColumn(), columnPrefix)); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/SqlArgsParameterHandler.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/SqlArgsParameterHandler.java index c2b05cb0..c25f2a9d 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/SqlArgsParameterHandler.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/SqlArgsParameterHandler.java @@ -55,35 +55,33 @@ public class SqlArgsParameterHandler extends DefaultParameterHandler { @SuppressWarnings({"rawtypes", "unchecked"}) private void doSetParameters(PreparedStatement ps) throws SQLException { Object[] sqlArgs = (Object[]) ((Map) getParameterObject()).get(FlexConsts.SQL_ARGS); - if (sqlArgs != null && sqlArgs.length > 0) { - int index = 1; - for (Object value : sqlArgs) { - // 设置 NULL 值 - if (value == null) { - ps.setNull(index++, Types.NULL); - continue; - } - - // 通过配置的 TypeHandler 去设置值 - if (value instanceof TypeHandlerObject) { - ((TypeHandlerObject) value).setParameter(ps, index++); - continue; - } - - TypeHandler typeHandler = typeHandlerRegistry.getTypeHandler(value.getClass()); - if (typeHandler != null) { - // 通过对应的 TypeHandler 去设置值 - typeHandler.setParameter(ps, index++, value, null); - } else { - /* - * 在 MySql,Oracle 等驱动中,通过 PreparedStatement.setObject 后,驱动会自动根据 value 内容进行转换 - * 源码可参考: {{@link com.mysql.jdbc.PreparedStatement#setObject(int, Object)} - */ - ps.setObject(index++, value); - } - } - } else { + if (sqlArgs == null || sqlArgs.length == 0) { super.setParameters(ps); + return; + } + + int index = 1; + for (Object value : sqlArgs) { + // 设置 NULL 值 + if (value == null) { + ps.setNull(index++, Types.NULL); + continue; + } + + // 通过配置的 TypeHandler 去设置值 + if (value instanceof TypeHandlerObject) { + ((TypeHandlerObject) value).setParameter(ps, index++); + continue; + } + + TypeHandler typeHandler = typeHandlerRegistry.getTypeHandler(value.getClass()); + if (typeHandler == null) { + typeHandler = typeHandlerRegistry.getUnknownTypeHandler(); + } + + // 此处的 jdbcType 可以为 null 的,原因是 value 不为 null, + // 只有 value 为 null 时, jdbcType 不允许为 null + typeHandler.setParameter(ps, index++, value, null); } }