Skip to content

Commit

Permalink
Merge pull request #1606 from kazuki43zoo/gh-1604-fix-broken-backward…
Browse files Browse the repository at this point in the history
…-compatibility

Fix broken backward compatibility by gh-1604
  • Loading branch information
kazuki43zoo committed Jul 15, 2019
2 parents 0a9f940 + 1eb11b8 commit 934eebe
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 2 deletions.
Expand Up @@ -116,10 +116,11 @@ public BoundSql getBoundSql(Object parameterObject) {

private SqlSource createSqlSource(Object parameterObject) {
try {
int bindParameterCount = providerMethodParameterTypes.length - (providerContext == null ? 0 : 1);
String sql;
if (parameterObject instanceof Map) {
if (bindParameterCount == 1 && providerMethodParameterTypes[0] == Map.class) {
int bindParameterCount = providerMethodParameterTypes.length - (providerContext == null ? 0 : 1);
if (bindParameterCount == 1 &&
(providerMethodParameterTypes[Integer.valueOf(0).equals(providerContextIndex) ? 1 : 0].isAssignableFrom(parameterObject.getClass()))) {
sql = invokeProviderMethod(extractProviderMethodArguments(parameterObject));
} else {
@SuppressWarnings("unchecked")
Expand Down
Expand Up @@ -24,6 +24,7 @@
import java.io.Reader;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand All @@ -32,6 +33,7 @@
import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.binding.MapperMethod;
import org.apache.ibatis.builder.BuilderException;
import org.apache.ibatis.builder.annotation.ProviderContext;
import org.apache.ibatis.builder.annotation.ProviderSqlSource;
Expand Down Expand Up @@ -619,6 +621,33 @@ void staticMethodOneArgumentAndProviderContext() {
}
}

@Test
void mapAndProviderContext() {
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
StaticMethodSqlProviderMapper mapper =
sqlSession.getMapper(StaticMethodSqlProviderMapper.class);
assertEquals("mybatis", mapper.mapAndProviderContext("mybatis"));
}
}

@Test
void multipleMap() {
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
StaticMethodSqlProviderMapper mapper =
sqlSession.getMapper(StaticMethodSqlProviderMapper.class);
assertEquals("123456", mapper.multipleMap(Collections.singletonMap("value", "123"), Collections.singletonMap("value", "456")));
}
}

@Test
void providerContextAndMap() {
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
StaticMethodSqlProviderMapper mapper =
sqlSession.getMapper(StaticMethodSqlProviderMapper.class);
assertEquals("mybatis", mapper.providerContextAndParamMap("mybatis"));
}
}

public interface ErrorMapper {
@SelectProvider(type = ErrorSqlBuilder.class, method = "methodNotFound")
void methodNotFound();
Expand Down Expand Up @@ -716,6 +745,15 @@ public interface StaticMethodSqlProviderMapper {
@SelectProvider(type = SqlProvider.class, method = "oneArgumentAndProviderContext")
String oneArgumentAndProviderContext(Integer value);

@SelectProvider(type = SqlProvider.class, method = "mapAndProviderContext")
String mapAndProviderContext(@Param("value") String value);

@SelectProvider(type = SqlProvider.class, method = "providerContextAndParamMap")
String providerContextAndParamMap(@Param("value") String value);

@SelectProvider(type = SqlProvider.class, method = "multipleMap")
String multipleMap(@Param("map1") Map<String, Object> map1, @Param("map2") Map<String, Object> map2);

@SuppressWarnings("unused")
class SqlProvider {

Expand Down Expand Up @@ -793,6 +831,18 @@ public static String oneArgumentAndProviderContext(Integer value, ProviderContex
+ "' FROM INFORMATION_SCHEMA.SYSTEM_USERS";
}

public static String mapAndProviderContext(Map<String, Object> map, ProviderContext context) {
return "SELECT '" + map.get("value") + "' FROM INFORMATION_SCHEMA.SYSTEM_USERS";
}

public static String providerContextAndParamMap(ProviderContext context, MapperMethod.ParamMap<Object> map) {
return "SELECT '" + map.get("value") + "' FROM INFORMATION_SCHEMA.SYSTEM_USERS";
}

public static String multipleMap(@Param("map1") Map<String, Object> map1, @Param("map2") Map<String, Object> map2) {
return "SELECT '" + map1.get("value") + map2.get("value") + "' FROM INFORMATION_SCHEMA.SYSTEM_USERS";
}

}

}
Expand Down

0 comments on commit 934eebe

Please sign in to comment.