MyBatis中foreach循环的用法
一、在了解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对象没有默认的键。 |
| 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循环的用法的更多相关文章
- PHP和Java中foreach循环的用法区别
1.foreach语句介绍: ①PHP: foreach 语法结构提供了遍历数组的简单方式.foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息. ...
- mybatis中foreach的用法(转)
foreach一共有三种类型,分别为List,[](array),Map三种. foreach属性 属性 描述 item 循环体中的具体对象.支持属性的点路径访问,如item.age,item.inf ...
- ecshop中foreach的详细用法归纳
ec模版中foreach的常见用法. foreach 语法: 假如后台:$smarty->assign('test',$test); {foreach from=$test item=list ...
- PHP中foreach循环详解
首先要说的是,其实我对foreach循环的用法并不是很精通,说详解,其实也只是我自己的理解,希望对你能有点帮助 . 先来看一下foreach的语法: foreach ($array as $key=& ...
- Mybatis中使用循环遍历
Mybatis中传参数的方法 1.使用注解绑定,mapper.xml 对应方法 不需要指定 parameterType,(推荐使用注解绑定方式) 方法接口: List<CalculateIdea ...
- SSIS之Foreach循环容器用法
要实现的业务:A数据库服务器上某库的T_GOODS_DECL的状态字段“Is_Delete”标记为“1”的时候删除B数据库服务器上对应库的T_GOODS_DECL表中的记录,二者的主键为“DECL_N ...
- PHP中foreach循环传值问题
首先看一段代码: <?php $a=array('ab','cd','ef'); $count=3; foreach($a as $key=>$value){ $value='abcdef ...
- mybatis中foreach使用
mybatis中的<foreach collection="list" item="item" index="index" open= ...
- c# 中foreach 循环
使用foreach循环可以迭代数组或一个集合对象, 1.通过foreach 循环输出整型数组中的数组: 2.通过for循环输出整型数组中的元素: 3.foreach 循环设置数组元素的计算器: cla ...
随机推荐
- 异常处理 | java.lang.IllegalArgumentException: Request header is too large
背景 今天在自己使用Springboot开发博客系统的时候,在浏览器点击提交markdown文件一直出现以下异常: java.lang.IllegalArgumentException: Reques ...
- gulp的简单打包示例(一)
引言 前端开发,打包工具是必不可少的,虽然有很多别人帮你封装好的打包工具,但自己配置一个,自身的实力也会大增呀.这篇博文主要讲的是使用gulp对html.js.less.css.图片的压缩合并等配置. ...
- <背包>solution-POJ1742_Coins
POJ1742 - Coins People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dol ...
- YUM安装软件提示[Errno 14] curl#6 - "Could not resolve host: mirrors.cloud.aliyuncs.com; 未知的错误"
报错如下: 翻译过来就是 所以问题很简单: 第一种情况:本地DNS服务错误 第二种情况:远程主机挂了 第三种情况:远程主机地址配置错误 第一种解决方法:换DNS 首先验证一下是不是本地DNS错误 从上 ...
- 【论文笔记系列】AutoML:A Survey of State-of-the-art (上)
之前已经发过一篇文章来介绍我写的AutoML综述,最近把文章内容做了更新,所以这篇稍微细致地介绍一下.由于篇幅有限,下面介绍的方法中涉及到的细节感兴趣的可以移步到论文中查看. 论文地址:https:/ ...
- TortoiseSVN的安装及其简单使用
VisualSVN-Server的安装以及简单使用 TortoiseSVN的安装及其简单使用 VisualSVN的安装及冲突的处理 安装完VisualSVN-Server后,Test仓储里边什么都没有 ...
- Linux系统之网络文件共享与数据实时同步实践
1.实现基于MYSQL验证的vsftpd虚拟用户访问 首先环境说明,数据库服务器是192.168.0.10,vsftpd服务器是192.168.0.30 1)安装vsftpd [root@test-c ...
- 题解【Luogu P6102 谔运算】
\[ \texttt{Description} \] 给出一个长度为 \(n\) 的数列 \(a\),求 \(\sum\limits_{i=1}\limits^{n}\sum\limits_{j=1} ...
- Java 添加、读取、删除Excel文档属性
在文档属性中,可以设置诸多关于文档的信息,如创建时间.作者.单位.类别.关键词.备注等摘要信息以及一些自定义的文档属性.下面将通过Java程序来演示如何设置,同时对文档内的已有信息,也可以实现读取和删 ...
- iRedmail的php由5.4升级到5.6
安装ireadmail时,自带的php是5.4,打算升级到5.6. 升级前注意备份原来的/etc/php-fpm.d下的www.conf,文件内容如下: [inet] user = nginx gro ...