foreach

     foreach 元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是很智能的,它不会偶然地附加多余的分隔符。

注意 你可以传递一个 List 实例或者数组作为参数对象传给 MyBatis。当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list” 作为键,而数组实例将会以“array”作为键。 

属性

描述

item

循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。 具体说明:在list和数组中是其中的对象,在map中是value。 该参数为必选。

collection

要做foreach的对象,作为入参时,List<?>对象默认用list代替作为键,数组对象有array代替作为键,Map对象用map代替作为键。 当然在作为入参时可以使用@Param("keyName")来设置键,设置keyName后,list,array,map将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子: 如果User有属性List ids。入参是User对象,那么这个collection = "ids" 如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = "ids.id" 上面只是举例,具体collection等于什么,就看你想对那个元素做循环。 该参数为必选。

separator

元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。

open

foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选。

close

foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。

index

在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。

多数时候用foreach仅作为sql的inst<User> selIn(@Param("alsit") List<Integer> list);

<select id="selIn" resultType="User">
select * from user
<where>
id in
<foreach collection="alsit" open="(" separator=","
close=")" item="item">
#{item}
</foreach>
</where>
</select> @Test
public void selectIn() throws IOException {
SqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml")).openSession(); UserMapper mapper = session.getMapper(UserMapper.class); List<Integer> integerList = new ArrayList<>();
integerList.add(1);
integerList.add(2);
integerList.add(3);
integerList.add(4);
integerList.add(5); List<User> userList = mapper.selIn(integerList); for (User user : userList) {
System.out.println(user);
}
}

foreach之map的使用

  当foreach的collection为map的时候,它的index就位map的key,value为值

int insUser(@Param("map") Map<Integer,User> map);

<insert id="insUser">
insert into user values
<foreach collection="map" item="item" index="key" separator=",">
(default,#{item.userCode},#{item.userPassword})
</foreach>
</insert> @Test
public void insertUser() throws IOException {
SqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml")).openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User u1 = new User(0,"a","a");
User u2= new User(0,"a1","a");
User u3 = new User(0,"a2","a");
User u4 = new User(0,"a3","a");
Map<Integer, User> map = new HashMap<>();
map.put(1,u1);
map.put(2,u2);
map.put(3,u3);
map.put(4,u4); int result = mapper.insUser(map);
if (result > 0) {
System.out.println("success");
session.commit();
} else {
System.out.println("failed");
session.rollback();
}
}

使用foreach遍历list对象,对象里面又包含listd的嵌套查询

List<User> selIn(@Param("list") List<Entry> list);

<select id="selIn" resultType="User">
select * from user
<where>
userCode in
<foreach collection="list" item="item">
<foreach collection="item.list" open="(" separator="," close=")" item="son">
#{son.userCode}
</foreach>
</foreach>
</where>
</select> 实体
package cn.arebirth.pojo; import java.util.List; public class Entry {
int id;
List<User> list; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public List<User> getList() {
return list;
} public void setList(List<User> list) {
this.list = list;
}
} @Test
public void selectIn() throws IOException {
SqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml")).openSession(); UserMapper mapper = session.getMapper(UserMapper.class); User u1 = new User(0, "a", "a");
User u2 = new User(0, "a1", "a");
User u3 = new User(0, "a2", "a");
User u4 = new User(0, "a3", "a"); List<User> addUser = new ArrayList<>();
addUser.add(u1);
addUser.add(u2);
addUser.add(u3);
addUser.add(u4); Entry entry = new Entry();
entry.setId(1);
entry.setList(addUser); List<Entry> entryList = new ArrayList<>();
entryList.add(entry); List<User> userList = mapper.selIn(entryList); for (User user : userList) {
System.out.println(user);
}
}

---恢复内容结束---

MyBatis之foreach的更多相关文章

  1. mybatis map foreach遍历

    mybatis map foreach遍历 转至http://www.cnblogs.com/yg_zhang/p/4314602.html mybatis 遍历map实例 map 数据如下 Map& ...

  2. mybatis中foreach的用法(转)

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

  3. mybatis的foreach标签

    今天写sql发现了一点问题,乱弄了好久算是搞定了.关于mybatis的批量插入使用foreach插入形式为: insert into role_privilege( role_id, privileg ...

  4. mybatis之foreach用法

    在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况:动态生成sql语句的查询条件,这个时候我们就可以用mybatis的foreach了 foreach元素的属性主要有item, ...

  5. MyBatis 使用 foreach 批量插入

    MyBatis 使用 foreach 批量插入 参考博文 老司机学习MyBatis之动态SQL使用foreach在MySQL中批量插入 使用MyBatis一次性插入多条数据时候可以使用 <for ...

  6. MyBatis的foreach查询(List、Array、Map)

    mybatis 中 foreach collection的三种用法 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index ...

  7. MyBatis map foreach

    以下资料来源于网络,仅供参考学习.   mybatis 遍历map实例 map 数据如下 Map<String,List<Long>>.   测试代码如下: public vo ...

  8. mybatis中foreach使用

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

  9. mybatis 中 foreach collection的三种用法(转)

    文章转自 https://blog.csdn.net/qq_24084925/article/details/53790287 oreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集 ...

  10. mybatis的foreach写用法

    一.mybatis查询 public abstract List<Model> findByIds(@Param("ids")List<Integer> i ...

随机推荐

  1. 抽丝剥茧分析asyncio事件调度的核心原理

    先来看一下一个简单的例子 例1: async def foo(): print('enter foo ...') await bar() print('exit foo ...') async def ...

  2. 从零到一,利用kubeadm在ubuntu server 16.04 64位系统离线安装kubernetes v1.10.0

    说明 初步接触kubernets,记录学习过程 本教程目的利用kubeadm在ubuntu server 16.04 64位系统离线安装kubernets v1.10.0 环境信息 节点IP地址 角色 ...

  3. 第七章 手动部署Fisco Bcos 区块链并完成新增群组,在原有群组中新增机构

    鉴于笔者以前各大博客教程都有很多人提问,早期建立一个技术交流群,里面技术体系可能比较杂,想了解相关区块链开发,技术提问,请加QQ群:538327407 目标 1.新增群组搭建完整联盟链 2.根据群组新 ...

  4. XTOJ 1267:Highway(树的直径)***

    http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1267 题意:给出一棵树,每条树边有权值,现在要修建n-1条边,边的权值为边 ...

  5. scrapy基础知识之 关于爬虫部分一些建议:

    1.尽量减少请求次数,能抓列表页就不抓详情页,减轻服务器压力,程序员都是混口饭吃不容易. 2.不要只看 Web 网站,还有手机 App 和 H5,这样的反爬虫措施一般比较少. 3.实际应用时候,一般防 ...

  6. Requests方法 -- 项目实现自动发送邮件

    """1.discover方法里面有三个参数:-case_dir:这个是待执行用例的目录.-pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开 ...

  7. 在eclipse中使用git创建本地库,以及托管项目到GitHub超详细教程

    关于安装git的教程,由于比较简单,并且网上教程特别多,而且即使不按照网上教程,下载好的windows版本git,安装时候一路默认设置就行. 安装好之后,在桌面上有git图标:右键菜单中有Git Ba ...

  8. Redis+Twemproxy分片存储实现

    from unsplash 为提高Redis存储能力的提升,以及对外提供服务可用性提升,有时候有必要针对Redis进行集群式搭建,比较常用的有Twemproxy分片存储以及官方提供的Cluster方式 ...

  9. ecshop数据库结构和字段介绍(转载)

    ecs_account_log:账户变动日志(注册用户充值.支付等记录信息)字段 类型 Null 默认 字段说明log_id mediumint(8) 否 无 日志IDuser_id mediumin ...

  10. springcloud启动多个实例

    1. 场景描述 springcloud微服务,部署一般需要多台服务器配合,开发测试过程中,也需要启动多个实例来进行测试与验证. 2. 问题解决 在idea下,只需要配置下就能启动多个实例,本案例采用在 ...