mybatis學習之路----動態sql之foreach set
點滴記載,點滴進步,願自己更上一層樓。
就像jsp前臺展示少不了集合遍歷一樣,這裡也支援集合遍歷,生成動態sql。
像sql的in函式,批量操作都少不了集合的遍歷。
foreach可以遍歷所有的可以迭代的物件,集合,陣列,map等等。
屬性:index 當迭代物件是陣列,列表時,表示的是當前迭代的次數
當物件是map之類的時候,表示的是當前map的key。
item 當迭代物件是陣列,列表時,表示的是當前迭代的元素。
當物件是map之類的時候,表示的是當前map的value值。
collection 當前不要遍歷的物件
separator 遍歷完一次後,在末尾新增的字元等。
open 遍歷的sql以什麼開頭
close 遍歷的sql以什麼結尾
示例:
1 遍歷集合為list
<select id="selectUseIf" parameterType="com.soft.test.model.DynamicTestModel" resultMap="userMap"> select * from t_user <where> <foreach collection="userList" separator="," item="str" index="index" open=" id in (" close=")"> #{str.id} </foreach> </where> </select>
結果:@Test public void dynamic() throws Exception { dynamicSqlDao = new DynamicSqlDaoImpl(); DynamicTestModel user = new DynamicTestModel(); List<User> list = new ArrayList<>(); User user1 = new User(); user1.setId(1); User user2 = new User(); user2.setId(2); User user3 = new User(); user3.setId(3); User user4 = new User(); user4.setId(4); User user5 = new User(); user5.setId(5); User user6 = new User(); user6.setId(6); User user7 = new User(); user7.setId(7); list.add(user1); list.add(user2); list.add(user3); list.add(user4); list.add(user5); list.add(user6); list.add(user7); user.setUserList(list); // Map<String,Object> map = new HashMap<>(); // map.put("aaaa","xiao"); // user.setMapParam(map); DynamicTest1Model dynamicTest1Model = new DynamicTest1Model(); user.setDynamicTest1Model(dynamicTest1Model); List<User> userList = dynamicSqlDao.dynamic(user); System.out.println(userList); }
DEBUG
[main] - ==> Preparing: select * from t_user WHERE id in ( ? , ? , ? , ? , ? , ? , ? )
DEBUG [main] - ==> Parameters: 1(Integer), 2(Integer), 3(Integer), 4(Integer), 5(Integer), 6(Integer), 7(Integer)
2 當遍歷集合為map
注意這個時候的index是key item對應的是value即可。map方式case when 更新表資料
<select id="selectUseIf" parameterType="com.soft.test.model.DynamicTestModel" resultMap="userMap">
update t_user
<set>
<foreach collection="mapParam" separator="" item="str" index="index" open=" username = case " close="end,">
when id=#{index} then #{str}
</foreach>
</set>
<where>
<foreach collection="mapParam" separator="," item="str" index="index" open=" id in ( " close=")">
#{index}
</foreach>
</where>
</select>
@Test
public void dynamic() throws Exception {
dynamicSqlDao = new DynamicSqlDaoImpl();
DynamicTestModel user = new DynamicTestModel();
Map<Object,Object> map = new HashMap<>();
map.put(1,"xiao");
map.put(2,"xiaoh");
map.put(3,"xiaoho");
map.put(4,"xiaohong");
map.put(28,"xiaohong1");
user.setMapParam(map);
DynamicTest1Model dynamicTest1Model = new DynamicTest1Model();
user.setDynamicTest1Model(dynamicTest1Model);
List<User> userList = dynamicSqlDao.dynamic(user);
System.out.println(userList);
}
測試結果:
DEBUG
[main] - ==> Preparing: update t_user SET username = case when id=? then ? when id=? then ? when id=? then ? when id=? then ? when id=? then ? end WHERE id in ( ? , ? , ? , ? , ? )
DEBUG [main] - ==> Parameters: 1(Integer), xiao(String), 2(Integer), xiaoh(String), 3(Integer), xiaoho(String), 4(Integer), xiaohong(String), 28(Integer), xiaohong1(String), 1(Integer), 2(Integer), 3(Integer), 4(Integer), 28(Integer)
foreach示例完畢。功能很強大,些許注意點注意下即可。
-----------------------------------------------------------set------------------------------------------------
set其實應該放到trim那一節的,但是那時候還沒看這個。貼出原始碼
public class SetSqlNode extends TrimSqlNode {
private static List<String> suffixList = Arrays.asList(",");
public SetSqlNode(Configuration configuration,SqlNode contents) {
super(configuration, contents, "SET", null, null, suffixList);
}
}
看的出來他就是一個特殊的trim而已。