mybatis批量插入 insert foreach 操作传入map参数

很多情况下我们想直接在mybatis的insert操作中,传入一个map参数,然后将这个map保存到数据库中。网上查了好多,说的比较乱,试了好多最后还是自己神来之笔,竟然搞定。这里简单整理一下。

废话后面将,直接贴代码:

map接口

public interface Mapper{
  void insert(Map<String,Map<String,Integer>> params);
}


xml配置

<insert id="insert" keyProperty="id" useGeneratedKeys="true" parameterType="hashmap">
        INSERT INTO 表名 (c1,c2) VALUE
<!-- collection="keys"中的keys和最外层的map得key对应,不用管dao层的定义的那个参数名,且index=“key” 中key这个也是固定的,                          -->
        <foreach collection="keys" index="key" item="value" separator="," >
        <!--这个地方也是固定写法,key代码map的key,value代表map中该key对应的value-->
            (#{key},#{value}) 
        </foreach>
    </insert>

main方法中调用

SqlSession session = SessionFactoryUtil.openSeeion();
CommonMapper cm = session.getMapper(Mapper.class);          
Map<String,Integer> map = new HashMap<>();
map.put("key1",1);
map.put("key2",2);
map.put("key3",2);
Map<String,Map<String,Integer>> params = new HashMap<>();
params.put("keys",map);
mapper.insert(params);
session.commit();
session.close();

相信很多同学都遇到和我一样的问题,看到这里我想不需要解释太多你也已经大概清楚。简单啰嗦几句。

有时候为了方便,我们并不想写那么多java bean,这时候我们会考虑用map,map很方便,键保存一个值,值又保存了一个值,完事儿,前提是你的键保存的那个值不能重复。

简单举个栗子,比如我们要保存两个值,一个是人名(name),一个是年龄(age),熟悉java bean的同学,肯定会首先想到写一个如下的bean出来:

public class Person{
  private String name;
  private Integer age;
}

这样当我们保存一堆人的时候,可能就会new一个ArrayList,然后把这些人添加进去,再把这个list对象持久化到数据库。

List<Person> personList = new ArrayList();
personList.add(person1);
personList.add(person2);
...
insert(personList);

看起来挺好,没什麽毛病。


但是,但是,,如果一直这样为简单两个变量就写一个bean出来,,,将来再select操作的时候也要再包装一层。。

卧槽 我要吐了!!

直接放到map里面保存,多方便!!

Map personMap = new HashMap<>();
personMap.put("John",23);
personMap.put("Lee",34);
personMap.put("Julia",19);
insert(personMap);//?大家都想这样操作对嘛?这样的确很爽!但简单这样还不行,配置文件的foreach没法写

正确的做法是需要把我们真正想保存的map再包装再另一个map中

Map<String,Map<String,INteger>> param = new HashMap<>();
param.put("keys",personMap); //注意,这里的"keys",对应foreach中的collection
insert(param);  //这样把这个map的map传入到方法中才能进行插入

个人觉得为了两个变量就动辄使用一个java bean,虽然设计上比较合理,符合java面向对象思想,

由于读者反馈测试不成功,我用springboot+mybatis又进行了测试,并将代码上传,代码地址如下:

download.csdn.net/download/weter_drop/11990558
将代码下载下来,修改数据库连接为自己本地的,并建好对应的表,运行如下图所示 的测试类即可
在这里插入图片描述

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T-OPEN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值