当前位置:   article > 正文

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

insert foreach

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

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

map接口

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


  • 1
  • 2
  • 3
  • 4
  • 5

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>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

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

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

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

  • 1
  • 2
  • 3
  • 4
  • 5

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

List<Person> personList = new ArrayList();
personList.add(person1);
personList.add(person2);
...
insert(personList);
  • 1
  • 2
  • 3
  • 4
  • 5

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


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

卧槽 我要吐了!!

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/749143
推荐阅读
相关标签
  

闽ICP备14008679号