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. 详细的DedeCMS(织梦)目录权限安全设置教程

    一.目录权限根据统计,绝大部分网站的攻击都在根目录开始的,因此,栏目目录不能设置在根目录.DEDECMS部署完成后,重点目录设置如下:1)将install删除.2) data.templets.upl ...

  2. LeetCode题目总结(三)

    我的代码在github上,https://github.com/WINTERFELLS/LeetCode-Answers 这里只提供个人的解题思路,不一定是最好的. 41-60: 给定一个排好序的数组 ...

  3. spring boot 之热部署(三)

    热部署:当发现程序修改时自动启动应用程序. spring boot使用的是spring-boot-devtools是一个为开发者服务的一个模块.其原理用了classLoader 其中一个加载不变的类, ...

  4. Python爬虫知识点一

    一.入门知识: 1.1.HTTP简介HTTP = HyperText Transfer ProtocolURI = Uniform Resource IdentifierURL = Uniform R ...

  5. python 常用算法

    算法就是为了解决某一个问题而采取的具体有效的操作步骤 算法的复杂度,表示代码的运行效率,用一个大写的O加括号来表示,比如O(1),O(n) 认为算法的复杂度是渐进的,即对于一个大小为n的输入,如果他的 ...

  6. SQLite事务与自增深度分析

    SQLite什么都好,就怕“database is locked”这些年来想尽办法去规避它. 测试代码: static void Test2() { XCode.Setting.Current.Tra ...

  7. ubuntu使用rdesktop连接win10的两个问题

    关闭防火墙,解决主机ping不通虚拟机的问题 win10需要修改注册表 \HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStatio ...

  8. ISE14.7兼容性问题集锦

    六.WARNING:iMPACT:923 - Can not find cable, check cable setup ! 这个错误是由于驱动没有安装或者驱动安装有问题,一般ISE会在安装的时候把驱 ...

  9. Git基础命令使用(个人总结)

    个人在开发中整理常用的git命令,相信很多人会需要到的. 全局配置信息: git config --global user.name "Your name" git config ...

  10. ----------- Rootkit 核心技术之绕过 IopParseDevice() 调用源检测逻辑 ---------------

    ---------------------------------------------------------------- 在上一篇文章中,我们已经看到 IopParseDevice() 如何对 ...