From 34212989148c06be03cb22fb79950e1c84d44e98 Mon Sep 17 00:00:00 2001 From: yffstart Date: Wed, 30 Aug 2023 14:22:46 +0800 Subject: [PATCH] optimize DefaultParameterHandler creating MeteObject multiple times when obtaining properties of the same parameter object --- .../defaults/DefaultParameterHandler.java | 5 ++- .../defaults/DefaultParameterHandlerTest.java | 35 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/ibatis/scripting/defaults/DefaultParameterHandler.java b/src/main/java/org/apache/ibatis/scripting/defaults/DefaultParameterHandler.java index a9f5a91a0b8..e22b7ccfc8e 100644 --- a/src/main/java/org/apache/ibatis/scripting/defaults/DefaultParameterHandler.java +++ b/src/main/java/org/apache/ibatis/scripting/defaults/DefaultParameterHandler.java @@ -63,6 +63,7 @@ public void setParameters(PreparedStatement ps) { ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId()); List parameterMappings = boundSql.getParameterMappings(); if (parameterMappings != null) { + MetaObject metaObject = null; for (int i = 0; i < parameterMappings.size(); i++) { ParameterMapping parameterMapping = parameterMappings.get(i); if (parameterMapping.getMode() != ParameterMode.OUT) { @@ -75,7 +76,9 @@ public void setParameters(PreparedStatement ps) { } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) { value = parameterObject; } else { - MetaObject metaObject = configuration.newMetaObject(parameterObject); + if (metaObject == null) { + metaObject = configuration.newMetaObject(parameterObject); + } value = metaObject.getValue(propertyName); } TypeHandler typeHandler = parameterMapping.getTypeHandler(); diff --git a/src/test/java/org/apache/ibatis/scripting/defaults/DefaultParameterHandlerTest.java b/src/test/java/org/apache/ibatis/scripting/defaults/DefaultParameterHandlerTest.java index 9998445ae79..05c30912b28 100644 --- a/src/test/java/org/apache/ibatis/scripting/defaults/DefaultParameterHandlerTest.java +++ b/src/test/java/org/apache/ibatis/scripting/defaults/DefaultParameterHandlerTest.java @@ -20,6 +20,8 @@ import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.times; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -29,6 +31,8 @@ import java.util.List; import org.apache.ibatis.builder.StaticSqlSource; +import org.apache.ibatis.domain.blog.Author; +import org.apache.ibatis.domain.blog.Section; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.ParameterMapping; @@ -98,4 +102,35 @@ MappedStatement getMappedStatement() { }).build(); } + @Test + void testParameterObjectMetaObjectGetValue() { + Configuration config = new Configuration(); + TypeHandlerRegistry registry = config.getTypeHandlerRegistry(); + + MappedStatement mappedStatement = new MappedStatement.Builder(config, "testSelect", new StaticSqlSource(config, "some select statement"), SqlCommandType.SELECT).build(); + + Author parameterObject = mock(Author.class); + + BoundSql boundSql = new BoundSql(config, "some select statement", new ArrayList() { + { + add(new ParameterMapping.Builder(config, "username", registry.getTypeHandler(String.class)).build()); + add(new ParameterMapping.Builder(config, "password", registry.getTypeHandler(String.class)).build()); + add(new ParameterMapping.Builder(config, "email", registry.getTypeHandler(String.class)).build()); + add(new ParameterMapping.Builder(config, "bio", registry.getTypeHandler(String.class)).jdbcType(JdbcType.VARCHAR).build()); + add(new ParameterMapping.Builder(config, "favouriteSection", registry.getTypeHandler(Section.class)).jdbcType(JdbcType.VARCHAR).build()); + } + }, parameterObject); + + DefaultParameterHandler defaultParameterHandler = new DefaultParameterHandler(mappedStatement, parameterObject, boundSql); + + PreparedStatement ps = mock(PreparedStatement.class); + + defaultParameterHandler.setParameters(ps); + + verify(parameterObject, times(1)).getUsername(); + verify(parameterObject, times(1)).getPassword(); + verify(parameterObject, times(1)).getEmail(); + verify(parameterObject, times(1)).getBio(); + verify(parameterObject, times(1)).getFavouriteSection(); + } }