SpringFrameworkでMyBatisを使ってみる⑦(Javaアプリケーション) foreach
今回はsqlファイルでforeachを使ってみます。MyBatis⑤の続きなので、先にそちらで環境を構築して下さい。
foreach list
sql.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="spring.test.UserMapper">
<select id="getUserList" resultType="spring.test.User">
select id,name from m_user
<where>
<foreach item="item" collection="list" open="("
separator=" or " close=")">
(
id = #{item.id}
and name = #{item.name}
)
</foreach>
</where>
</select>
</mapper>
Paramの指定がない場合、collectionは"list"を指定します。
UserMapper.java
package spring.test;
import java.util.List;
public interface UserMapper {
public List<User> getUserList(List<User> ary);
}
SpringBean.java
package spring.test;
import java.util.ArrayList;
import java.util.List;
public class SpringBean {
private final UserMapper userMapper;
public SpringBean(UserMapper mp) {
this.userMapper = mp;
}
public void show() {
List<User> args = new ArrayList<>();
User arg1 = new User();
arg1.setId("test");
arg1.setName("テスト");
args.add(arg1);
User arg2 = new User();
arg2.setId("test2");
arg2.setName("テスト2");
args.add(arg2);
List<User> list = userMapper.getUserList(args);
for (User user : list) {
System.out.println(user.getId() + "-" + user.getName());
}
}
}
pom.xml、SpringTest.xml、User.java、HelloWorldTest.java はMyBatis⑤を見て下さい。
実行されるSQL
select
id, name
from
m_user
WHERE
(
(id = 'test' and name = 'テスト')
or (id = 'test2' and name = 'テスト2')
)
foreach Param指定
sql.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="spring.test.UserMapper">
<select id="getUserList" resultType="spring.test.User">
select id,name from m_user
<where>
<foreach item="item" collection="prm" open="("
separator=" or " close=")">
(
id = #{item.id}
and name = #{item.name}
)
</foreach>
</where>
</select>
</mapper>
Paramの指定がある場合、collectionにはParamで指定したものを指定します。
UserMapper.java
package spring.test;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface UserMapper {
public List<User> getUserList(@Param("prm") List<User> ary);
}
出力されるSQLは最初の例と同じになります。
foreach map
sql.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="spring.test.UserMapper">
<select id="getUserList" resultType="spring.test.User">
select id,name from m_user
<where>
<foreach item="value" index="key" collection="_parameter"
open="(" separator=" or " close=")">
(
id = #{key}
and name = #{value}
)
</foreach>
</where>
</select>
</mapper>
UserMapper.java
package spring.test;
import java.util.List;
import java.util.Map;
public interface UserMapper {
public List<User> getUserList(Map<String, String> argMap);
}
SpringBean.java
package spring.test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SpringBean {
private final UserMapper userMapper;
public SpringBean(UserMapper mp) {
this.userMapper = mp;
}
public void show() {
Map<String, String> args = new HashMap<>();
args.put("test", "テスト");
args.put("test2", "テスト2");
List<User> list = userMapper.getUserList(args);
for (User user : list) {
System.out.println(user.getId() + "-" + user.getName());
}
}
}
出力されるSQLは最初の例と同じになります。
listと同じようにmapでも@Paramでパラメータ指定ができます。
属性にMap、Listを指定
sql.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="spring.test.UserMapper">
<update id="updateMapList" parameterType="spring.test.MapList">
UPDATE M_USER SET
<foreach item="value" index="key" collection="testMap"
separator=",">
<if test="value != null">
${key} = #{value}
</if>
</foreach>
<where>
<if test="testList != null and testList.size() > 0">
ID IN
<foreach item="item" index="index" collection="testList"
open="(" separator="," close=")">
#{item}
</foreach>
</if>
</where>
</update>
</mapper>
ドル記号はそのまま出力、シャープ記号は実行時にシングルクォーテーションを自動で付けてくれます。
MapList.java
package spring.test;
import java.util.List;
import java.util.Map;
public class MapList {
private List<String> testList;
private Map<String, String> testMap;
public List<String> getTestList() {
return testList;
}
public void setTestList(List<String> testList) {
this.testList = testList;
}
public Map<String, String> getTestMap() {
return testMap;
}
public void setTestMap(Map<String, String> testMap) {
this.testMap = testMap;
}
}
UserMapper.java
package spring.test;
public interface UserMapper {
public void updateMapList(MapList mapList);
}
SpringBean.java
package spring.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SpringBean {
private final UserMapper userMapper;
public SpringBean(UserMapper mp) {
this.userMapper = mp;
}
public void show() {
MapList mapList = new MapList();
Map<String, String> map = new HashMap<String, String>();
List<String> ids = new ArrayList<String>();
map.put("attr1", "a");
map.put("attr2", "b");
ids.add("1");
ids.add("2");
mapList.setTestMap(map);
mapList.setTestList(ids);
userMapper.updateMapList(mapList);
}
}
pom.xml、SpringTest.xml、User.java、HelloWorldTest.java はMyBatis⑤を見て下さい。
実行されるSQL
UPDATE M_USER SET attr1 = 'a', attr2 = 'b' WHERE ID IN ('1', '2')
ページのトップへ戻る