Skip to content

Commit

Permalink
Allow collection or array object on item attribute of foreach element
Browse files Browse the repository at this point in the history
  • Loading branch information
kazuki43zoo committed Aug 13, 2017
1 parent e5435a6 commit e578768
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ public void appendSql(String sql) {
GenericTokenParser parser = new GenericTokenParser("#{", "}", new TokenHandler() {
@Override
public String handleToken(String content) {
String newContent = content.replaceFirst("^\\s*" + item + "(?![^.,:\\s])", itemizeItem(item, index));
String newContent = content.replaceFirst("^\\s*" + item + "(?![^.\\[,:\\s])", itemizeItem(item, index));
if (itemIndex != null && newContent.equals(content)) {
newContent = content.replaceFirst("^\\s*" + itemIndex + "(?![^.,:\\s])", itemizeItem(itemIndex, index));
}
Expand Down
60 changes: 60 additions & 0 deletions src/test/java/org/apache/ibatis/submitted/foreach/ForEachTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -167,4 +167,64 @@ public void shouldRemoveIndexVariableInTheContext() {
}
}

@Test
public void shouldInsertUsersUsingListElement() {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
Mapper mapper = sqlSession.getMapper(Mapper.class);
List<List<Object>> records = new ArrayList<List<Object>>();
{
List<Object> record = new ArrayList<Object>();
record.add(100);
record.add("Ken");
records.add(record);
}
{
List<Object> record = new ArrayList<Object>();
record.add(101);
record.add("Jon");
records.add(record);
}

int insertCount = mapper.insertUsersUsingList(records);

Assert.assertEquals(2, insertCount);
{
User user = mapper.selectUser(100);
Assert.assertEquals("Ken 0", user.getName());
}
{
User user = mapper.selectUser(101);
Assert.assertEquals("Jon 1", user.getName());
}
} finally {
sqlSession.close();
}
}

@Test
public void shouldInsertUsersUsingArrayElement() {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
Mapper mapper = sqlSession.getMapper(Mapper.class);
List<Object[]> records = new ArrayList<Object[]>();
records.add(new Object[] {100, "Ken"});
records.add(new Object[] {101, "Jon"});

int insertCount = mapper.insertUsersUsingArray(records);

Assert.assertEquals(2, insertCount);
{
User user = mapper.selectUser(100);
Assert.assertEquals("Ken 0", user.getName());
}
{
User user = mapper.selectUser(101);
Assert.assertEquals("Jon 1", user.getName());
}
} finally {
sqlSession.close();
}
}

}
9 changes: 9 additions & 0 deletions src/test/java/org/apache/ibatis/submitted/foreach/Mapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import java.util.List;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

public interface Mapper {

Expand All @@ -34,4 +35,12 @@ public interface Mapper {
int itemVariableConflict(@Param("id") Integer id, @Param("ids") List<Integer> ids, @Param("ids2") List<Integer> ids2);

int indexVariableConflict(@Param("idx") Integer id, @Param("idxs") List<Integer> ids, @Param("idxs2") List<Integer> ids2);

int insertUsersUsingList(List<List<Object>> records);

int insertUsersUsingArray(List<Object[]> records);

@Select("SELECT id, name FROM users WHERE id = #{id}")
User selectUser(int id);

}
15 changes: 15 additions & 0 deletions src/test/java/org/apache/ibatis/submitted/foreach/Mapper.xml
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,19 @@
</foreach>
or id = #{idx}
</select>

<insert id="insertUsersUsingList">
insert into users (id, name) values
<foreach collection="list" item="element" index="i" separator=",">
(#{element[0]}, #{element[1]} || ' ' || #{i})
</foreach>
</insert>

<insert id="insertUsersUsingArray">
insert into users (id, name) values
<foreach collection="list" item="element" index="i" separator=",">
(#{element[0], jdbcType=NUMERIC}, #{element[1]} || ' ' || #{i})
</foreach>
</insert>

</mapper>

0 comments on commit e578768

Please sign in to comment.