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

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

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

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

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

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

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

 User findById(Integer id);

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

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

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

 void addUser(User user);

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

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

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

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

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

 <select id="findUserListByIdList" parameterType="List" resultType="User">
     select * from `user `
     <where>
         user.ID in
         <foreach collection="idList" index="index" item="value" open="(" close=")" separator=","> #{value} </foreach>
     </where>
 </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>

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

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

 // 初始化一个数据
 Map<String, Object> dataMap1 = new HashMap<String, Object>();
 Map<String, Object> dataMap2 = new HashMap<String, Object>();
 List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
     dataMap1.put("name", "Tom");
     dataMap1.put("age", "13");
     dataList.add(dataMap1);
     dataMap2.put("name", "Jack");
     dataMap2.put("age", "18");
     dataList.add(dataMap2);
 // 将dataList传递到Dao层
 public void addUser(List<Map<String, Object>> list);
 // DaoMapper.xml
 /* 批量向数据库中添加数据 */
 <insert id="addUser" parameterType="List">
     INSERT INTO `user`(name, age) VALUES
     <foreach collection="list" index="index" item="item" separator=",">
         <foreach collection="item" index="key" item="value" open="(" close=")" separator=",">
             #{value}
         </foreach>
     </foreach>
 <insert>

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

 // 初始化数据
 // lineColumn 用来存需要添加的字段
     String lineColumn = "";
 // paramsMap 用来打包整个数据,并将数据传递到Dao层
     Map<String, Object> paramsMap = new HashMap<String, Object>();
 // 创建两个map,用来存对应的字段和值,一个map就是一个新用户
     Map<String, Object> dataMap1 = new HashMap<String, Object>();
     Map<String, Object> dataMap2 = new HashMap<String, Object>();
 // 创建一个list,以list来存用户的map集合
     List<Map<String, Object>> linList = new ArrayList<Map<String, Object>>();
         dataMap1.put("name", "Tom");
         dataMap1.put("age", "12");
         linList.add(dataMap1);
         dataMap2.put("name", "Jack");
         dataMap2.put("age", "18");
         linList.add(dataMap2);
     for(String key : dataMap1.keySet()){
         lineColumn += key + ",";
     }
     lineColumn = lineColumn.substring(0,lineColumn.lingth() - 1);
     paramsMap.put("lineColumn", lineColumn);
     paramsMap.put("table", "user");
     paramsMap.put("lineList", lineList);
 // 将paramsMap传递到Dao层
 public void addUser(Map<String, Object> map);
 // DaoMapper.xml; 根据map中传递的 表名, 字段名, 字段对应的数据 进行批量添加
 /* 在Dao层传入的map集合做数据中,如果只需要拿map集合中某一个指定的单条数据时,在mapper.xml中可以 以 ${key} 即可拿到数据 */
 <insert id="addUser" parameterType="Map">
     INSERT INTO `${table}` (${lineColumn}) VALUES
     <foreach collection="lineList" index="index" item="item" separator=",">
         <foreach collection="item" index="key" item="value" open="(" close=")" separator=",">
             #{value}
         </foreach>
     </foreach>
 </insert>

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

 // 初始化一个数据
 Map<String, Object> dataMap = new HashMap<String, Object>();
     dataMap.put("id", "001");
     dataMap.put("name","Tom");
     dataMap.put("age", null);
 // 传递到Dao层
 public void addUser(@Param("map") Map<String, Object> map);
 // DaoMapper.xml
 /* 根据参数是否为null来选择性的向数据库添加数据 */
 <insert id="addUser" parameterType="Map">
     INSERT INTO `user`
     <foreach collection="map" index="key" item="value" open="(" close=")" separator=",">
         <if test="value != null and value != '' ">
             ${key}
         </if>
     </foreach>
     VALUES
     <foreach collection="map" index="key" item="value" open="(" close=")" separator=",">
         <if test="value != null and value != '' ">
             #{value}
         </if>
     </foreach>
 </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)

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

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

    1.foreach语句介绍: ①PHP: foreach 语法结构提供了遍历数组的简单方式.foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息. ...

  2. mybatis中foreach的用法(转)

    foreach一共有三种类型,分别为List,[](array),Map三种. foreach属性 属性 描述 item 循环体中的具体对象.支持属性的点路径访问,如item.age,item.inf ...

  3. ecshop中foreach的详细用法归纳

    ec模版中foreach的常见用法. foreach 语法: 假如后台:$smarty->assign('test',$test); {foreach from=$test item=list ...

  4. PHP中foreach循环详解

    首先要说的是,其实我对foreach循环的用法并不是很精通,说详解,其实也只是我自己的理解,希望对你能有点帮助 . 先来看一下foreach的语法: foreach ($array as $key=& ...

  5. Mybatis中使用循环遍历

    Mybatis中传参数的方法 1.使用注解绑定,mapper.xml 对应方法 不需要指定 parameterType,(推荐使用注解绑定方式) 方法接口: List<CalculateIdea ...

  6. SSIS之Foreach循环容器用法

    要实现的业务:A数据库服务器上某库的T_GOODS_DECL的状态字段“Is_Delete”标记为“1”的时候删除B数据库服务器上对应库的T_GOODS_DECL表中的记录,二者的主键为“DECL_N ...

  7. PHP中foreach循环传值问题

    首先看一段代码: <?php $a=array('ab','cd','ef'); $count=3; foreach($a as $key=>$value){ $value='abcdef ...

  8. mybatis中foreach使用

    mybatis中的<foreach collection="list" item="item" index="index" open= ...

  9. c# 中foreach 循环

    使用foreach循环可以迭代数组或一个集合对象, 1.通过foreach 循环输出整型数组中的数组: 2.通过for循环输出整型数组中的元素: 3.foreach 循环设置数组元素的计算器: cla ...

随机推荐

  1. springboot之整合基本的jdbc并操作Mysql数据库

    对于数据访问层,无论是SQL还是NOSQL,springboot默认采用整合spring data方式进行统一处理,添加大量自动配置,屏蔽了许多设置,引入各种xxxTemplate,xxxReposi ...

  2. 我学React Native开发的经历(一) 第一周学习,环境搭建及demo1,一个导航跳转页面

    大家好,这是跋涉者,wadereye,说来惭愧, 我是从2017年8月25日左右开始学习React Native的,因为时间不多, 在学习的过程中,感觉资料非常零散,要趟过的坑巨多,遇到的问题也非常多 ...

  3. num12---组合模式

    案例描述: 学校下有多个学院,每个学院下有多个专业系. 把学校.院系.专业  全都看成某个组织类型,含有添加add方法,删除remove方法,显示print方法. 如果有新增的院系.专业,新增加对应的 ...

  4. go微服务框架kratos学习笔记八 (kratos的依赖注入)

    目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...

  5. Kali桥接模式下配置ip

    以管理员身份运行虚拟机 打开控制面板-->网络和Internet-->更改适配器 再在虚拟机处桥接到这个WLAN2 点击 编辑-->编辑虚拟网卡 没有网卡就点上图的添加网络作为桥接网 ...

  6. Docker / Kubernetes 镜像源

    由于众所周知的原因, Docker 官方镜像仓库和 Google 镜像仓库在国内访问速度很慢或者不可用.这样就给我们在部署和使用 Kubernetes 时带来了极大的不便.今天我们就来介绍几种方法,可 ...

  7. [Python]List 过滤

    获取数据库列表屏蔽系统自带数据库 # 原代码 db_list_result = [('master', ), ('tempdb', ), ('model', ), ('msdb', ), ('stud ...

  8. ab使用详解—如何使用apache性能测试工具进行压力测试

    作为后端工程师,除了实现业务需求之外,需要考虑的就是自己写的服务,在大并发下是否能正常运行了.但是,在一般开发情况下,没那么多大并发情况让你测试,那该怎么办呢? 这时候,我们就可以用到apache的压 ...

  9. 解决shiro自定义filter后,ajax登录无法登录,并且无法显示静态资源的问题

    这个问题困扰了我一天,看了下面两个文章,豁然开朗: https://www.cnblogs.com/gj1990/p/8057348.html https://412887952-qq-com.ite ...

  10. [PHP] 使用PHP在mongodb中进行count查询

    在php7的mongodb扩展中,当要查询某个集合在某个条件下的数据个数时,可以使用下面的方式来获取. 比原生的命令要复杂许多 比旧版mongo扩展也复杂许多 需要使用到MongoDB\Driver\ ...