很多情况下我们想直接在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

将代码下载下来,修改数据库连接为自己本地的,并建好对应的表,运行如下图所示 的测试类即可

mybatis 插入 Result consisted of more than one row mybatis insert foreach if_java