1 MyBatis动态SQL之if 语句

2 MyBatis动态sql之where标签|转

3 MyBatis动态SQL之set标签|转

4 MyBatis动态SQL之trim元素|转

5 MyBatis动态sql中foreach标签的使用

6 MyBatis动态SQL之choose(when、otherwise)语句

7 MyBatis动态SQL之bind标签|转

  关于动态SQL另外一个常用的功能就是使用foreach标签对一个集合进行遍历,尤其是在构建IN条件语句的时候。

  案例1 Spring Boot项目中,Dao层代码片段如下:

    // 查询指定ID的员工
List<Employee> selectEmployeeIn(Long[] ids);

  xml文件代码片段如下:

	<select id="selectEmployeeIn" resultType="cn.mybatis.domain.Employee">
SELECT * FROM tb_employee
<where>
<if test="ids != null">
<foreach item="item" index="index" collection="ids"
open="id in (" separator="," close=")" nullable="true">
#{item}
</foreach>
</if>
</where>
</select>

  foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符,看它多智能!

  温馨提示 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

  假如在上述案例中,请求参数为int[] ids = {1,2,3,4,5},那么,调用selectEmployeeIn后,控制台打印的SQL如下:

SELECT * FROM tb_employee where id in (1,2,3,4,5)

  如果把请求参数封装为map,如下:

public void selectPostIn() {
final List<Long> ids = new ArrayList<Long>();
ids.add(1L);
ids.add(2L);
ids.add(32L);
Map<String,Long> maps = new HashMap();
params.put("ids", ids);
List<Employee> employeeList = employeeMapper.selectEmployeeIn(maps);
} //---- Dao层修改 ------
List<Employee> selectEmployeeIn(Map<String, Long> mapParam);

  则对应的xml仍然可以使用案例1中的selectEmployeeIn。

  foreach标签的主要属性描述如下:

  • collection :指定被遍历的集合,支持参数类型包括List、数组、Map和自定义对象,请注意,Dao和xml中的变量名必须一致。
  • item:表示在迭代过程中每一个元素的别名,值可以自定义。
  • index :表示在迭代过程中,当前迭代到的位置(下标),一般很少使用。若遍历的是list或者数组,index代表下标;若遍历的是Map,index代表键。
  • open :前缀,即遍历开始时的拼接字符串。
  • close :后缀,即遍历结束时拼接的字符串。
  • separator :分隔符,表示遍历时每个元素之间以什么分隔。
  • nullable:是否为空开关。如果启用该配置且设置为true,程序会在遇到null时自动跳过,而不是抛出异常。

  通常可以将foreach用到批量增删改查等操作中,关于批量删除和修改的介绍,请戳《Mybatis 批量操作-删除、修改和查询》。

5 MyBatis动态sql中foreach标签的使用的更多相关文章

  1. mybatis动态sql中foreach标签的使用

    foreach标签主要用于构建in条件,他可以在sql中对集合进行迭代.如下: <delete id="deleteBatch"> delete from user w ...

  2. MyBatis动态SQL中trim标签的使用

    My Batis 官方文档 对 动态SQL中使用trim标签的场景及效果介绍比较少. 事实上trim标签有点类似于replace效果. trim 属性 prefix:前缀覆盖并增加其内容 suffix ...

  3. mybatis动态sql中where标签的使用

    where标记的作用类似于动态sql中的set标记,他的作用主要是用来简化sql语句中where条件判断的书写的,如下所示: <select id="selectByParams&qu ...

  4. MyBatis从入门到精通(八):MyBatis动态Sql之foreach标签的用法

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用foreach ...

  5. mybatis动态sql之foreach标签

    foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量.它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符.这个元素是很 ...

  6. MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】

    (第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...

  7. mybatis动态sql中的两个内置参数(_parameter和_databaseId)

    mybatis动态sql中的两个内置参数(_parameter和_databaseId)   <!-- mybatis动态sql的两个内置参数           不只是方法传递过来的参数可以被 ...

  8. mybatis动态sql中的sql标签——抽取可重用的sql片段

    1.用<sql>标签抽取可重用的sql片段 <!-- 抽取可重用的SQL片段,方便后面引用           1.sql抽取,经常将要查询的列名,或者插入用的列名,之后方便引用   ...

  9. mybatis动态SQL中的set标签的使用

    set标记是mybatis提供的一个智能标记,我一般将其用在修改的sql中,例如以下情况: <update> update user <set> <if test=&qu ...

  10. mybatis动态SQL中的sql片段

    在mybatis中通过使用SQL片段可以提高代码的重用性,如下情景: 1.创建动态SQL <sql id="sql_count">select count(*)< ...

随机推荐

  1. [rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(06):基于iced实现一个简单的图片浏览器

    前言 本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发. iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动. 本合集是基于新版本的关于分 ...

  2. 【MIPS】经典指令块集锦

    Directives声明变量值存储 容易将数据段地址和地址上的内容搞混 .data fibs: .space 48 # allocate 12 * 4 = 48 Byte memory, store ...

  3. 1h玩转kubernetes

    学习k8s就跟学习office三件套上,95%的人只会5%,而5%的知识可以干95%的事情,所以不要觉的k8s难 1 kubernetes 1 什么是kubernetes Kubernetes 是一个 ...

  4. xshell连接Win10下子系统Unbuntu

    自带的ssh server不好用,需要先卸载再安装. 1. 卸载 ssh server sudo apt-get remove openssh-server 2. 安装 ssh server sudo ...

  5. pandas数据统一绘图风格配置

    在使用pandas的时候,经常会用到Dataframe或者Series的plot方法,该方法底层实际上调的还是matplotlib.pyplot的plot方法.因此,通过对pyplot模块的绘图全局参 ...

  6. 【数据结构与算法】不同路径 III:使用哈密尔顿路径算法实现

    [数据结构与算法]不同路径 III:使用哈密尔顿路径算法实现 Java 不同路径 III https://leetcode-cn.com/problems/unique-paths-iii/ 解题思路 ...

  7. Linux下时区/系统时间/硬件时间的设置

    涨姿势,顺带笔记,留爪. 先简述下时区/系统时间/硬件时间的3个主要命令吧 tzselect tzselect命令主要针对时区设置和查看 tz=timezone的缩写,直译=时区 date date命 ...

  8. 在Winform开发框架支持多种数据库基础上,增加对国产数据库人大金仓的支持

    一个良好的产品,可能往往需要支持多种数据库的接入,根据实际业务的需要进行调整,有时候可能需要2到3种数据库的支持. 在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统 ...

  9. 🎀Java-Exception与RuntimeException

    简介 Exception Exception 类是所有非致命性异常的基类.这些异常通常是由于编程逻辑问题或外部因素(如文件不存在.网络连接失败等)导致的,可以通过适当的编程手段来恢复或处理.Excep ...

  10. base的含义及使用及与this的区别

    C#中base关键字的几种用法 - bobob - 博客园 (cnblogs.com) C#构造函数里的base和this的区别 - 傲世狂枫 - 博客园 (cnblogs.com) 我的理解 1.在 ...