MyBatis中foreach循环的用法

一、在了解foreach之前,先了解一下mybatis传入参数及parameterType

1、我们在Dao层向对应的mapper.xml文件传递参数时,可以传递的参数有:

  ①、基本数据类型(如int/Integer、long/Long、float等)

  ②、简单引用数据类型(如String、User实体类对象等)

  ③、集合数据类型(如List、Map等)

  我们在parameterType属性获取参数类型时,只需要与传入的参数类型相同即可,如:

①基本数据类型:Java代码:

1 User findById(Integer id);

①基本数据类型:mapper.xml代码:

1 <select id="findById" parameterType="int" resultType="com.demo.entity.User">
2         SELECT * FROM `user` where id=#{id};
3 </select>

②简单引用类型:Java代码:

1 void addUser(User user);

②简单引用类型:mapper.xml代码:

1 <insert id="addUser" parameterType="com.demo.entity.User">
2         insert into `user` values (null,#{userName},#{userAge})
3 </insert>

③集合数据类型(List):Java代码:

1 List<User> findUserListByIdList(List<Integer> idList);

③集合数据类型(List):mapper.xml代码:

1 <select id="findUserListByIdList" parameterType="List" resultType="User">
2     select * from `user `
3     <where>
4         user.ID in
5         <foreach collection="idList" index="index" item="value" open="(" close=")" separator=","> #{value} </foreach>
6     </where>
7 </select>  

二、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<String, Object>

 1 // 初始化一个Map数据
 2 Map<String, Object> dataMap = new HashMap<String, Object>();
 3     dataMap.put("id", "0001");
 4     dataMap.put("name", "Tom");
 5     dataMap.put("age", "12");
 6 // 将dataMap传递到Dao层
 7 public void addUser(@Param("map") Map<String, Object> map);
 8 // DaoMapper.xml   mapper文件
 9 /* 这段添加语句的意思是:根据map提供的字段,向数据库user表中,添加数据(只添加指定字段的数据);注意区分mybatis中“$”与“#”的用法 */
10 <insert id="addUser" parameterType="Map">
11     INSERT INTO `user`
12     <foreach collection="map" index="key" item="value" open="("
13         close=")" separator=",">
14         ${key}
15     </foreach>
16     VALUES
17     <foreach collection="map" index="key" item="value" open="("
18         close=")" separator=",">
19         #{value}
20     </foreach>
21 </insert>

(二)集合数据类型:List<Map<String, Object>> (list集合中存的是map)

 1 // 初始化一个数据
 2 Map<String, Object> dataMap1 = new HashMap<String, Object>();
 3 Map<String, Object> dataMap2 = new HashMap<String, Object>();
 4 List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
 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 void addUser(List<Map<String, Object>> list);
13 // DaoMapper.xml
14 /* 批量向数据库中添加数据 */
15 <insert id="addUser" parameterType="List">
16     INSERT INTO `user`(name, age) VALUES
17     <foreach collection="list" index="index" item="item" separator=",">
18         <foreach collection="item" index="key" item="value" open="(" close=")" separator=",">
19             #{value}
20         </foreach>
21     </foreach>
22 <insert>

(三) 集合数据类型:Map<String,Object>(map集合中存的数据有:String, List(List里面存的是Map);)

 1 // 初始化数据
 2 // lineColumn 用来存需要添加的字段
 3     String lineColumn = "";
 4 // paramsMap 用来打包整个数据,并将数据传递到Dao层
 5     Map<String, Object> paramsMap = new HashMap<String, Object>();
 6 // 创建两个map,用来存对应的字段和值,一个map就是一个新用户
 7     Map<String, Object> dataMap1 = new HashMap<String, Object>();
 8     Map<String, Object> dataMap2 = new HashMap<String, Object>();
 9 // 创建一个list,以list来存用户的map集合
10     List<Map<String, Object>> linList = new ArrayList<Map<String, Object>>();
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(Map<String, Object> map);
26 // DaoMapper.xml; 根据map中传递的 表名, 字段名, 字段对应的数据 进行批量添加
27 /* 在Dao层传入的map集合做数据中,如果只需要拿map集合中某一个指定的单条数据时,在mapper.xml中可以 以 ${key} 即可拿到数据 */
28 <insert id="addUser" parameterType="Map">
29     INSERT INTO `${table}` (${lineColumn}) VALUES
30     <foreach collection="lineList" index="index" item="item" separator=",">
31         <foreach collection="item" index="key" item="value" open="(" close=")" separator=",">
32             #{value}
33         </foreach>
34     </foreach>
35 </insert>

(四)数据集合类型:Map(根据集合中value是否为null来选择性的向数据库添加数据)

 1 // 初始化一个数据
 2 Map<String, Object> dataMap = new HashMap<String, Object>();
 3     dataMap.put("id", "001");
 4     dataMap.put("name","Tom");
 5     dataMap.put("age", null);
 6 // 传递到Dao层
 7 public void addUser(@Param("map") Map<String, Object> map);
 8 // DaoMapper.xml
 9 /* 根据参数是否为null来选择性的向数据库添加数据 */
10 <insert id="addUser" parameterType="Map">
11     INSERT INTO `user`
12     <foreach collection="map" index="key" item="value" open="(" close=")" separator=",">
13         <if test="value != null and value != ‘‘ ">
14             ${key}
15         </if>
16     </foreach>
17     VALUES
18     <foreach collection="map" index="key" item="value" open="(" close=")" separator=",">
19         <if test="value != null and value != ‘‘ ">
20             #{value}
21         </if>
22     </foreach>
23 </insert>

*在mapper.xml中,使用"if"或者"where"标签小小的注意事项:

  在使用if或者where标签时,如<if test=" id != null ">(当你传递参数是一个单类型时( user findById(Integer id); )),有可能报一个异常“There is no getter for property named ‘xxx’ in ‘class java.lang.xxx‘;

  此时解决办法:

  ①将<if test=" id != null "> 中的“id”更改为“_parameter”;

  ②在接口方法中(user findById (Integer id);)添加@Param("xxx")注解,如user findById (@Param("id") Integer id)

原文地址:https://www.cnblogs.com/wgc-blog/p/10726767.html

时间: 2024-08-29 07:31:00

MyBatis中foreach循环的用法的相关文章

PHP和Java中foreach循环的用法区别

1.foreach语句介绍: ①PHP: foreach 语法结构提供了遍历数组的简单方式.foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息. ②Java: foreach语句是java5的新特征之一,在遍历数组.集合方面,foreach为开发人员提供了极大的方便.foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本.foreach并不是一个

记一下mybatis中foreach循环遇到的一个小问题

---恢复内容开始--- 我在添加单条数据的时候,参数是一个map,没有使用循环,直接map.字段,即使这个字段map中并不存在,也不会出错 但是是一个List<Map>这种,保存就需要循环遍历这个list,然后每个元素都是个map,这时候如果map取一个没有的字段就会报错,就是这个错误: 1 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingExcep

SSIS之Foreach循环容器用法

原文:SSIS之Foreach循环容器用法 要实现的业务:A数据库服务器上某库的T_GOODS_DECL的状态字段“Is_Delete”标记为“1”的时候删除B数据库服务器上对应库的T_GOODS_DECL表中的记录,二者的主键为“DECL_NO”. 总体设计图,实现原理:上一步骤将结果集传递到循环容器中,容器逐行取数据来执行容器里面的SQL任务. 第一步:建立“获取标记为已删除的DECL_NO”执行SQL任务 选择正确的数据连接器. 填写查询SQL语句. 结果集选项一定要选择“完整结果集”.

PHP中foreach循环详解

首先要说的是,其实我对foreach循环的用法并不是很精通,说详解,其实也只是我自己的理解,希望对你能有点帮助 . 先来看一下foreach的语法: foreach ($array as $key=>$value) { …… } 为了便于理解,我们假定这里的$array是一个一维的相关数组,$key是数组的索引,$value是这个索引的值,它们的名字可以随意,之所以叫$key和$value是为了便于理解.为了能让你更好的理解foreach的工作过程,我们来创建一个数组: $array = arr

谈一下思考,关于mybatis中&lt;foreach collection=&quot;list&quot;&gt;中list得来的原因 没看到官方说明

<foreach> 是在sql语句中进行多个id查询 时用到的,因为mybatis代替jdbc和hibernate, 使用 在xml文件中编写sql语句,这是一个标签文件.然后在 dao层?,用sqlSession.来调用这个写好的sql语句. 有时候我想会不会jdbc更简单一些?? 然后,在xml中写sql语句,会碰到根据条件或者模糊查询,这个时候需要接收来自dao层的 查询条件参数.此时需要在xml文件中的sql语句中接收,并且应该没有接收,只是确定有几个占位符,等到预编译之后,再在dao

Java中 for循环的用法解析

在Java程序中,要“逐一处理”――或者说,“遍历”――某一个数组或Collection中的元素的时候,一般会使用一个for循环来实现(当然,用其它种类的循环也不是不可以,只是不知道是因为for这个词的长度比较短,还是因为for这个词的含义和这种操作比较配,在这种时候for循环比其它循环常用得多).J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象.本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类

从字节码看Java中for-each循环(增强for循环)实现原理

转发:http://blog.csdn.net/u011392897/article/details/54562596 for-each循环是jdk1.5引入的新的语法功能.并不是所有东西都可以使用这个循环的.可以看下Iterable接口的注释,它说明了除了数组外,其他类想要使用for-each循环必须实现这个接口.这一点表明除了数组外的for-each可能底层是由迭代器实现的. Iterable接口在1.8之前只有一个方法,Iterator<T> iterator(),此方法返回一个迭代器.

thinkphp模板中foreach循环没数据的错误解决

从控制器方法中$this->assign();函数将值传递给html模板 但是模板不显示数据,直接出来的是代码,效果就和html中写了php代码不能解析一样. 原来是我将thinkphp框架的引擎和smarty模板引擎的使用方法混了.写成了 查手册知道了thinkphp模板中foreach的使用方法,这才恍然大悟

mybatis 中 foreach collection的三种用法

转载:http://blog.sina.com.cn/s/blog_b0d90e8c0102v1q1.html 传参参考:http://www.cnblogs.com/ruiati/p/6410339.html foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. item表示集合中每一个元素进行迭代时的别名,    index指 定一个名字,用于表示