mybatis学习之路----动态sql之foreach set

来源:互联网 发布:安卓便签软件 编辑:程序博客网 时间:2024/09/21 08:15

点滴记载,点滴进步,愿自己更上一层楼。

官方文档传送门

就像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而已。

想在了解了解的可以看前面一节
mybatis学习之路----动态sql之trim标签源码详解,附带where标签解析




原创粉丝点击