Mybatis foreach的参数(Map)

一、平时用到List、array[数组]的情况比较多,工作中有一个需求,想到可以用map来传值,而且比较方便,把我的场景分享给大家。

二、
场景1:insert时,列的数量和名称是不固定的,需要动态的处理,这种需求感觉用map传值比较方便。
场景2:

1 单元测试:

@RunWith(SpringJUnit4ClassRunner.class)//junit整合spring的测试//立马开启了spring的注解
@ContextConfiguration(locations="classpath:spring/application*.xml")//加载核心配置文件,自动构建spring容器
public class Start1 {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testInsert(){
        Map<String,Map<String,Object>> param = new HashMap<String,Map<String,Object>>();
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("id", null);
        map.put("user_name", "testname");
        map.put("password", "1234556");
        map.put("name", "test");
        map.put("age", 10);
        map.put("birthday", "2018-08-31");
        map.put("created", "2018-08-31");
        map.put("updated", "2018-08-31");
        param.put("keys", map);
        int count = this.userMapper.insertUser(param);
        System.out.println(count);
    }


    @Test
    public void testInserts(){
        Map<String,List<Object>> param = new HashMap<String,List<Object>>();
        List<Object> l = new ArrayList<Object>();
        User u1 = new User();
        u1.setUserName("u1_name");
        u1.setPassword("11111");
        u1.setName("u1");
        u1.setSex(1);
        u1.setAge(20);
        u1.setCreated(new Date());
        u1.setBirthday(new Date());
        u1.setUpdated(new Date());
        User u2 = new User();
        u2.setUserName("u2_name");
        u2.setPassword("11111");
        u2.setName("u2");
        u2.setSex(1);
        u2.setAge(20);
        u2.setCreated(new Date());
        u2.setBirthday(new Date());
        u2.setUpdated(new Date());
        l.add(u1);
        l.add(u2);
        param.put("keys", l);
        int count = this.userMapper.insertUsers(param);
        System.out.println("..............."+count);
    }
}

2 Mapper接口

public interface UserMapper {

   //如果使用@param("xxx")注解的话,foreach集合中的colleciton的值可以是"xxx.keys"
    public int insertUser(Map<String,Map<String,Object>> param); 


    public int insertUsers(Map<String,List<Object>> param);
}

3 mapper.xml文件

<insert id="insertUser" parameterType="map">
    insert into tb_user 
    <foreach collection="keys" index="key" item="value" open="(" close=")" separator=",">
       ${key} <!--此处用$,不要用#,这里是连接的需要,不是占位 -->
    </foreach>
    values
    <foreach collection="keys" item="value1" open="(" close=")" separator=",">
       #{value1}
    </foreach>
    <!-- 第二次foreach时,其实循环的顺序和第一次是一样的,因为此时map是一定的,并没有增删-->
    </insert>
    <!--( id, user_name, password,
    name, age, birthday, created, updated) valu  -->
    <insert id="insertUsers">
       insert into tb_user
       ( id, user_name, password,sex,
         name, age, birthday, created, updated)
       values
       <foreach collection="keys" item="value"  separator=",">
          (null,#{value.userName},#{value.password},#{value.sex},#{value.name},#{value.age},#{value.birthday},#{value.created},#{value.updated})
       </foreach>
    </insert>

三、 foreach 中的参数详解
场景1中的foreach
这里写图片描述

场景2中的foreach
这里写图片描述

四、转载的图(文字说明)
此图转自:https://blog.csdn.net/d729332647/article/details/80985812
这里写图片描述

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 2
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值