foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。

foreach元素的属性主要有 item,index,collection,open,separator,close。

item表示集合中每一个元素进行迭代时的别名,

index指
定一个名字,用于表示在迭代过程中,每次迭代到的位置,

open表示该语句以什么开始,

separator表示在每次进行迭代之间以什么符号作为分隔
符,

collection表示要循环的集合,

close表示以什么结束。

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

1.
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

2.
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

4.如果传入的参数是实体类对象,该对象中有对应的要循环的集合或数组,则可以直接将collection的值写成该字段名称。

下面分别来看看上述四种情况的示例代码:

1.单参数List的类型:

<select id="dynamicForeach" resultType="Services">
select * from t_service where id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach> </select>

若传入的是List<String>类型 在Mapper文件中处理过后,SQL如下:(直接引用注解中的参数名字,这样mybatis会忽略类型,按名字引入)

<select id="dynamicForeach" resultType="Services">
select * from t_services where id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>

上述collection的值为list,对应的Mapper是这样的

public List dynamicForeachTest(List ids);

若是传入的是的是List<String>类型的  可能会报出两个参数的异常,这时我们可以用Mybatis官方的注解@Param

public List dynamicForeach(@Param("ids")List<String> ids);

2.单参数array数组的类型:

<select id="dynamicForeach2" resultType="Services">
select * from t_service where id in
<foreach collection="array" index="index" item="item" open="(" separator="," close=")"> #{item}
</foreach>
</select>

上述collection为array,对应的Mapper代码:

public List dynamicForeach2(int[] ids);

3.自己把参数封装成Map的类型:

<select id="dynamicForeach3" resultType="Services">
select * from t_service where title like "%"#{title}"%" and id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>

上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:

public List dynamicForeach3(Map params);

4.传入的参数是实体类对象,该对象中有对应的要循环的集合或数组。

public List<T> findList(T entity) {
return dao.findList(entity);
}

对应的mapper可以这样使用:

<select id="findList" resultType="Services">
SELECT
<include refid="cmsServicesColumns"/>
FROM cms_Services a
<include refid="cmsServicesJoins"/>
<where> <if test="category.id != null and category.id != ''">
AND (a.category_id = #{category.id})
</if>
<if test="categoryList != null">
and
a.category_id in
<foreach item="category" collection="categoryList" open="(" separator="," close=")"> #{category.id} </foreach>
</if>
</where>
</select>

collection对应的categoryList是实体类中的List:

伪代码:
public class Services extends DataEntity<Services> { private List<Category> categoryList;// 分类编号(组)
}

另外要注意的是:foreach循环出来的实体,是可以当成实体在循环外面去调用的,即如果例4中代码写成如下这样:

<select id="findList" resultType="Services">
SELECT
<include refid="cmsServicesColumns"/>
FROM cms_Services a
<include refid="cmsServicesJoins"/>
<where> <if test="categoryList != null">
and
a.category_id in
<foreach item="category" collection="categoryList" open="(" separator="," close=")"> #{category.id} </foreach>
</if> <if test="category.id != null and category.id != ''">
AND (a.category_id = #{category.id})
</if>
</where>
</select>

则如果该实体没有传入category

依然会进入最后那一个循环中去,这点需要注意。

mybatis sql循环的使用的更多相关文章

  1. Mybatis sql映射文件浅析 Mybatis简介(三)

    简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML为载体映射SQL 之前提到过,各项配置信息将Mybatis应用的整 ...

  2. Mybatis sql映射文件浅析 Mybatis简介(三) 简介

    Mybatis sql映射文件浅析 Mybatis简介(三)   简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML ...

  3. ibatis mybatis sql语句配置 符号不兼容 大于号 小于号<!CDATA[ ]>

    ibatis mybatis sql语句配置 符号不兼容 大于号 小于号<!CDATA[ ]> 因为这个是xml格式的,所以不允许出现类似">"这样的字符,但是都 ...

  4. MyBatis SQL xml处理小于号与大于号

    MyBatis SQL xml处理小于号与大于号 当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台 ...

  5. mybatis 参数为list时,校验list是否为空, mybatis ${}与#{}的区别,Mybatis sql in

    1.mybatis 参数为list时,校验list是否为空 2. mybatis ${}与#{}的区别 简单来说#{} 解析的是占位符?可以防止SQL注入, 比如打印出来的语句 select * fr ...

  6. SpringMVC4+MyBatis+SQL Server2014 基于SqlSession实现读写分离(也可以实现主从分离)

    前言 上篇文章我觉的使用拦截器虽然方便快捷,但是在使用读串还是写串上你无法控制,我更希望我们像jdbc那样可以手动控制我使用读写串,那么这篇则在sqlsession的基础上实现读写分离, 这种方式则需 ...

  7. SQL循环语句 详解

    SQL循环语句 declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+ ...

  8. mybatis sql参考

    参考mybatis sql: <select id="xxx" resultType="com.xxxx.xxx.vo.xx.xx" parameterT ...

  9. mybatis foreach 循环 list(map)

    直接上代码: 整体需求就是: 1.分页对象里面有map map里面又有数组对象 2.分页对象里面有list list里面有map map里面有数组对象. public class Page { pri ...

随机推荐

  1. vue基础学习(二)

    02-01  vue事件深入-传参.冒泡.默认事件 <div id="box"> <div @click="show2()"> < ...

  2. 【分治】peak find

    分治算法 算法设计中一种常用的优化方法就是分治的思想,它的解决思路就是将原始的问题划分为性质一样,但是规模减小的子问题,然后通过子问题的解和合并子问题的解得到最终的解,就是分治的思想: 比较常见的分治 ...

  3. 关于oracle数据库 跨表查询建立 视图的方法

    工作中很多时候都会遇到需要将两个不同的表空间甚至数据库的表进行联合查询或者建立视图的情况. 不同的表空间查询我们可以通过在将要查询的表前面加上 表空间的对应的用户名来实现,如有两个表空间分别对应两个用 ...

  4. commons-dbutils 字段名称转换

    我们在写bean的时候,字段通常都使用小驼峰命名法,但是在设计数据库时,一般使用下划线分割命名.这样,在取出数据库字段时,还需要转换.如何简洁的实现这种转换呢? 你能遇到的问题,只要是普遍存在的,大家 ...

  5. 一种laravel特有的serviceProvider的加载方式

    这里的laravel版本5.5. 我是使用到dingo这个包的时候,觉得很奇怪,我们一般的包使用的时候都需要加载一个serviceProvider,提供服务,dingo/api这里也有ServiceP ...

  6. CSS 参考手册

    CSS3 动画属性(Animation) 属性 描述 CSS @keyframes 规定动画. 3 animation 所有动画属性的简写属性,除了 animation-play-state 属性. ...

  7. TPYBoard开发板ADC数模转换一: 初识ADC使用

    转载请以链接形式注明文章来源,公众号:MicroPython玩家汇 1.前言 ADC,Analog-to-DigitalConverter的缩写,指模/数转换器或者模数转换器[1].是指将连续变化的模 ...

  8. js 对象的值传递

    一.变量赋值的不同 1.原始值 在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的. 2.引用值: 在将一个保存着对象内存地址的变量复制给另一个变量 ...

  9. 知识点练习day9

    列表 作用:多个装备,多个爱好,多门课程,多个女朋友等 定义:[]内可以有多个任意类型的值,逗号分隔 my_girl_friends=['alex','wupeiqi','yuanhao',4,5] ...

  10. 轻松逃脱某防火墙对ss的探测

    ss里面有些诡异的日志(我用的是ss-go) 2017/10/1* 1*:5*:19 error getting request  ***:***  ***:*** EOF 这种日志不多,一般新开一个 ...