mybatis多个foreach_MyBatis中foreach循环的⽤法
⼀、在了解foreach之前,先了解⼀下mybatis传⼊参数及parameterType
1、我们在Dao层向对应的l⽂件传递参数时,可以传递的参数有:
①、基本数据类型(如int/Integer、long/Long、float等)
②、简单引⽤数据类型(如String、User实体类对象等)
③、集合数据类型(如List、Map等)
我们在parameterType属性获取参数类型时,只需要与传⼊的参数类型相同即可,如:
①基本数据类型:Java代码:
1 User findById(Integer id);
①基本数据类型:l代码:
1
2 SELECT * FROM `user` where id=#{id};3
②简单引⽤类型:Java代码:
1 void addUser(User user);
②简单引⽤类型:l代码:
1
2 insert into `user` values (null,#{userName},#{userAge})3
③集合数据类型(List):Java代码:
1 List findUserListByIdList(List idList);
③集合数据类型(List):l代码:
1
2 select *from `user `3
4 user.ID in
5 #{value}
6
7
⼆、foreach属性——collection、index、item、open、close、separator
属性
描述
collection
要做foreach的对象,作为⼊参时,List>对象默认⽤list代替作为键,数组对象有array代替作为键,Map对象没有默认的键。
当然在作为⼊参时可以使⽤@Param("keyName")来设置键,设置keyName后,list,array将会失效。 除了⼊参这种情况外,还有⼀种作为参数对象的某个字段的时候。举个例⼦:
如果User有属性List ids。⼊参是User对象,那么这个collection = "ids"
如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;⼊参是User对象,那么collection = "ids.id"
上⾯只是举例,具体collection等于什么,就看你想对那个元素做循环。
该参数为必选。
index
在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。
item
循环体中的具体对象。⽀持属性的点路径访问,如item.age,item.info.details。
具体说明:在list和数组中是其中的对象,在map中是value。
该参数为必选。
open
foreach代码的开始符号,⼀般是(和close=")"合⽤。常⽤在in(),values()时。该参数可选。
close
foreach代码的关闭符号,⼀般是)和open="("合⽤。常⽤在in(),values()时。该参数可选。
separator
元素之间的分隔符,例如在in()的时候,separator=","会⾃动在元素中间⽤“,“隔开,避免⼿动输⼊逗号导致sql错误,如in(1,2,)这样。该参数可选。
三、foreach简单使⽤:
(⼀)集合数据类型:Map
1 //初始化⼀个Map数据
2 Map dataMap = new HashMap();
3 dataMap.put("id", "0001");
4 dataMap.put("name", "Tom");
5 dataMap.put("age", "12");
6 //将dataMap传递到Dao层
7 public void addUser(@Param("map") Mapmap);8 //l mapper⽂件
9 /*这段添加语句的意思是:根据map提供的字段,向数据库user表中,添加数据(只添加指定字段的数据);注意区分mybatis
中“$”与“#”的⽤法*/
java中index是什么意思
10
11 INSERT INTO `user`12
13 close=")" separator=",">
14 ${key}15
16 VALUES17
18 close=")" separator=",">
19 #{value}20
21
(⼆)集合数据类型:List> (list集合中存的是map)
1 //初始化⼀个数据
2 Map dataMap1 = new HashMap();
3 Map dataMap2 = new HashMap();
4 List> dataList = new ArrayList>();5
dataMap1.put("name", "Tom");6 dataMap1.put("age", "13");7 dataList.add(dataMap1);8 dataMap2.put("name", "Jack");9 dataMap2.put("age", "18");10 dataList.add(dataMap2);11 //将dataList传递到Dao层
12 public voidaddUser(List> list);13 //l
14 /*批量向数据库中添加数据*/
15
16 INSERT INTO `user`(name, age) VALUES17
18
19 #{value}20
21
22
(三) 集合数据类型:Map(map集合中存的数据有:String, List(List⾥⾯存的是Map);)
1 //初始化数据
2 //lineColumn ⽤来存需要添加的字段
3 String lineColumn = "";
4 //paramsMap ⽤来打包整个数据,并将数据传递到Dao层
5 Map paramsMap = new HashMap();
6 //创建两个map,⽤来存对应的字段和值,⼀个map就是⼀个新⽤户
7 Map dataMap1 = new HashMap();8 Map dataMap2 = new HashMap();9 //创建⼀个list,以list来存⽤户的map集合
10 List> linList = new ArrayList>();11 dataMap1.put("name", "Tom");12 dataMap1.put("age", "12");13
linList.add(dataMap1);14 dataMap2.put("name", "Jack");15 dataMap2.put("age", "18");16 linList.add(dataMap2);17 for(String key : dataMap1.keySet()){18 lineColumn += key + ",";19 }20 lineColumn = lineColumn.substring(0,lineColumn.lingth() - 1);21 paramsMap.put("lineColumn", lineColumn);22 paramsMap.put("table", "user");23 paramsMap.put("lineList", lineList);24 //将paramsMap传递到Dao层
25 public void addUser(Mapmap);26 //l; 根据map中传递的 表名, 字段名, 字段对应的数据 进⾏批量添加
27 /*在Dao层传⼊的map集合做数据中,如果只需要拿map集合中某⼀个指定的单条数据时,在l中可以 以 ${key} 即可拿到数据*/
28
29 INSERT INTO `${table}` (${lineColumn}) VALUES30
31
32 #{value}33
34
35
(四)数据集合类型:Map(根据集合中value是否为null来选择性的向数据库添加数据)
1 //初始化⼀个数据
2 Map dataMap = new HashMap();
3 dataMap.put("id", "001");
4 dataMap.put("name","Tom");
5 dataMap.put("age", null);
6 //传递到Dao层
7 public void addUser(@Param("map") Mapmap);8 //l
9 /*根据参数是否为null来选择性的向数据库添加数据*/
10
11 INSERT INTO `user`12
13
14 ${key}15
16
17 VALUES18
19
20 #{value}21
22
23
*在l中,使⽤"if"或者"where"标签⼩⼩的注意事项:
在使⽤if或者where标签时,如(当你传递参数是⼀个单类型时( user findById(Integer id); )),有可能报⼀个异常“There is no getter for property named ‘xxx’ in 'class ';
此时解决办法:
①将 中的“id”更改为“_parameter”;
②在接⼝⽅法中(user findById (Integer id);)添加@Param("xxx")注解,如user findById (@Param("id") Integer id)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。