Skip to content

Commit 881cf64

Browse files
committed
Type handler should be applied to parameter objects
1 parent 7c8a3c1 commit 881cf64

File tree

7 files changed

+41
-16
lines changed

7 files changed

+41
-16
lines changed

src/main/java/org/apache/ibatis/executor/BaseExecutor.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.apache.ibatis.mapping.ParameterMode;
3737
import org.apache.ibatis.mapping.StatementType;
3838
import org.apache.ibatis.reflection.MetaObject;
39+
import org.apache.ibatis.reflection.ParamNameResolver;
3940
import org.apache.ibatis.reflection.factory.ObjectFactory;
4041
import org.apache.ibatis.session.Configuration;
4142
import org.apache.ibatis.session.LocalCacheScope;
@@ -218,13 +219,18 @@ public CacheKey createCacheKey(MappedStatement ms, Object parameterObject, RowBo
218219
value = boundSql.getAdditionalParameter(propertyName);
219220
} else if (parameterObject == null) {
220221
value = null;
221-
} else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
222-
value = parameterObject;
223222
} else {
224-
if (metaObject == null) {
225-
metaObject = configuration.newMetaObject(parameterObject);
223+
ParamNameResolver paramNameResolver = ms.getParamNameResolver();
224+
if (paramNameResolver != null
225+
&& typeHandlerRegistry.hasTypeHandler(paramNameResolver.getType(paramNameResolver.getNames()[0]))
226+
|| typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
227+
value = parameterObject;
228+
} else {
229+
if (metaObject == null) {
230+
metaObject = configuration.newMetaObject(parameterObject);
231+
}
232+
value = metaObject.getValue(propertyName);
226233
}
227-
value = metaObject.getValue(propertyName);
228234
}
229235
cacheKey.update(value);
230236
}

src/main/java/org/apache/ibatis/scripting/defaults/DefaultParameterHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ public void setParameters(PreparedStatement ps) {
138138
} else {
139139
propertyGenericType = actualParamClass;
140140
}
141+
} else {
142+
propertyGenericType = actualParamType;
141143
}
142144
} else {
143145
try {

src/main/java/org/apache/ibatis/type/TypeHandlerRegistry.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ public void setDefaultEnumTypeHandler(@SuppressWarnings("rawtypes") Class<? exte
193193
this.defaultEnumTypeHandler = typeHandler;
194194
}
195195

196-
public boolean hasTypeHandler(Class<?> javaType) {
196+
public boolean hasTypeHandler(Type javaType) {
197197
return hasTypeHandler(javaType, null);
198198
}
199199

@@ -216,13 +216,6 @@ public TypeHandler<?> getMappingTypeHandler(Class<? extends TypeHandler<?>> hand
216216
return allTypeHandlersMap.get(handlerType);
217217
}
218218

219-
@Deprecated
220-
@SuppressWarnings("unchecked")
221-
public <T> TypeHandler<T> getTypeHandler(Class<T> clazz) {
222-
return (TypeHandler<T>) getTypeHandler((Type) clazz);
223-
}
224-
225-
@Deprecated
226219
public TypeHandler<?> getTypeHandler(Type type) {
227220
return getTypeHandler(type, null);
228221
}

src/test/java/org/apache/ibatis/builder/XmlConfigBuilderTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2024 the original author or authors.
2+
* Copyright 2009-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -170,7 +170,7 @@ void registerJavaTypeInitializingTypeHandler() {
170170
builder.parse();
171171

172172
TypeHandlerRegistry typeHandlerRegistry = builder.getConfiguration().getTypeHandlerRegistry();
173-
TypeHandler<MyEnum> typeHandler = typeHandlerRegistry.getTypeHandler(MyEnum.class);
173+
TypeHandler<?> typeHandler = typeHandlerRegistry.getTypeHandler(MyEnum.class);
174174

175175
assertTrue(typeHandler instanceof EnumOrderTypeHandler);
176176
assertArrayEquals(MyEnum.values(), ((EnumOrderTypeHandler<MyEnum>) typeHandler).constants);

src/test/java/org/apache/ibatis/submitted/typebasedtypehandlerresolution/GloballyRegisteredHandlerMapper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,10 @@ public interface GloballyRegisteredHandlerMapper {
3939

4040
@Select("select strvalue from users where id = #{id}")
4141
FuzzyBean<String> selectFuzzyString(Integer id);
42+
43+
@Select("select id, strvalue, intvalue, strings, integers from users where strvalue = #{v}")
44+
User getUserByFuzzyBean(FuzzyBean<String> str);
45+
46+
@Select("select id, strvalue, intvalue, strings, integers from users where strvalue = #{p1} and intvalue = #{p2}")
47+
User getUserByFuzzyBeans(FuzzyBean<String> p1, FuzzyBean<Integer> p2);
4248
}

src/test/java/org/apache/ibatis/submitted/typebasedtypehandlerresolution/GloballyRegisteredTypeHandlerResolutionTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,4 +183,22 @@ void handleReturnTypeWithTypeParam() {
183183
assertEquals("garden", fuzzyBean.getValue());
184184
}
185185
}
186+
187+
@Test
188+
void shouldHandlerBeAppliedToSoleParam() {
189+
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
190+
GloballyRegisteredHandlerMapper mapper = sqlSession.getMapper(GloballyRegisteredHandlerMapper.class);
191+
User user = mapper.getUserByFuzzyBean(new FuzzyBean<String>("garden"));
192+
assertEquals(1, user.getId());
193+
}
194+
}
195+
196+
@Test
197+
void shouldHandlerBeAppliedToMultiParams() {
198+
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
199+
GloballyRegisteredHandlerMapper mapper = sqlSession.getMapper(GloballyRegisteredHandlerMapper.class);
200+
User user = mapper.getUserByFuzzyBeans(new FuzzyBean<String>("garden"), new FuzzyBean<Integer>(31));
201+
assertEquals(1, user.getId());
202+
}
203+
}
186204
}

src/test/java/org/apache/ibatis/type/TypeHandlerRegistryTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ void setup() {
5050

5151
@Test
5252
void shouldRegisterAndRetrieveTypeHandler() {
53-
TypeHandler<String> stringTypeHandler = typeHandlerRegistry.getTypeHandler(String.class);
53+
TypeHandler<?> stringTypeHandler = typeHandlerRegistry.getTypeHandler(String.class);
5454
typeHandlerRegistry.register(String.class, JdbcType.LONGVARCHAR, stringTypeHandler);
5555
assertEquals(stringTypeHandler, typeHandlerRegistry.getTypeHandler(String.class, JdbcType.LONGVARCHAR));
5656

0 commit comments

Comments
 (0)