很多情况下我们想直接在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
将代码下载下来,修改数据库连接为自己本地的,并建好对应的表,运行如下图所示 的测试类即可