目录

1. foreach元素的属性

2.foreach时,collection属性值的三种情况:

3.代码示例:

3.1 collection属性值类型为List:

使用@Param注解自定义keyName;

使用默认属性值list作为keyname

3.2 collection属性值类型为Array:

使用@Param注解自定义keyName;

使用默认属性值array作为keyname

3.3 collection属性值类型为Map

第一种:获取Map的键值对

第二种:参数Map类型,只需要获取key值或者value值


在mybatis的xml文件中构建动态sql语句时,经常会用到标签遍历查询条件。特此记录下不同情况下书写方式!-------仅供大家参考------

1. foreach元素的属性

  • collection: 需做foreach(遍历)的对象,作为入参时,list、array对象时,collection属性值分别默认用"list"、"array"代替,Map对象没有默认的属性值。但是,在作为入参时可以使用@Param(“keyName”)注解来设置自定义collection属性值,设置keyName后,list、array会失效;
  • item: 集合元素迭代时的别名称,该参数为必选项;
  • index: 在list、array中,index为元素的序号索引。但是在Map中,index为遍历元素的key值,该参数为可选项;
  • open: 遍历集合时的开始符号,通常与close=")"搭配使用。使用场景IN(),values()时,该参数为可选项;
  • separator: 元素之间的分隔符,类比在IN()的时候,separator=",",最终所有遍历的元素将会以设定的(,)逗号符号隔开,该参数为可选项;
  • close: 遍历集合时的结束符号,通常与open="("搭配使用,该参数为可选项;

2.foreach时,collection属性值的三种情况

  • 如果传入的参数类型为List时,collection的默认属性值为list,同样可以使用@Param注解自定义keyName;
  • 如果传入的参数类型为array时,collection的默认属性值为array,同样可以使用@Param注解自定义keyName;
  • 如果传入的参数类型为Map时,collection的属性值可为三种情况:(1.遍历map.keys;2.遍历map.values;3.遍历map.entrySet()),稍后会在代码中示例;

3.代码示例:

3.1 collection属性值类型为List:

使用@Param注解自定义keyName;

Mapper接口定义的方法:UserList为模拟返回的数据对象

List<UserList> getUserInfo(@Param("userName") List<String> userName);

Mapper.xml 动态sql构建,Mapper接口的方法名和xml文件的id值,必须一一对应,否则会报错:
-----建议做if test="xxxx !=null and xxxx.size()>0"的校验,比较严谨。array为.length();

 <select id="getUserInfo" resultType="com.test.UserList">SELECT*FROM user_infowhere<if test="userName!= null and userName.size() >0">USERNAME IN<foreach collection="userName" item="value" separator="," open="(" close=")">#{value}</foreach></if>
</select>

使用默认属性值list作为keyname

对应的Dao中的Mapper文件是:

public List<User> selectByIds(List<Integer> userIds);

xml文件代码片段:

<select id="selectByIds" resultType="com.olive.pojo.User">select * from t_user where id in<foreach collection="list" index="index" item="item" open="(" separator="," close=")">#{item}</foreach>
</select>

3.2 collection属性值类型为Array:

使用@Param注解自定义keyName;

Mapper接口定义的方法:UserList为模拟返回的数据对象

List<UserList> getUserInfo(@Param("userName") String[] userName);

Mapper.xml 动态sql构建,Mapper接口的方法名和xml文件的id值,必须一一对应,否则会报错:
-----建议做if test="xxxx !=null and xxxx.length()>0"的校验,比较严谨。

  <select id="getUserInfo" resultType="com.test.UserList">SELECT*FROM user_infowhere<if test="userName!= null and userName.length() >0">USERNAME IN<foreach collection="userName" item="value" separator="," open="(" close=")">#{value}</foreach></if></select>

使用默认属性值array作为keyname

对应的Dao中的Mapper文件是:

public List<User> selectByIds(int[] userIds);

xml文件代码片段:

<select id="selectByIds" resultType="com.olive.pojo.User">select * from t_user where id in<foreach collection="array" index="index" item="item" open="(" separator="," close=")">#{item}</foreach></select>

3.3 collection属性值类型为Map

Mapper接口定义的方法:UserList为模拟返回的数据对象

List<UserList> getUserInfo(@Param("user") Map<String,String> user);

Mapper.xml 动态sql构建,Mapper接口的方法名和xml文件的id值,必须一一对应,否则会报错:
-----建议做 if test="xxxx !=null and xxxx.size()>0"的校验,比较严谨。

第一种:获取Map的键值对

多字段组合条件情况下,一定要注意书写格式:括号()

eg: SELECT * FROM user_info WHERE (USERNAME,AGE) IN (('张三','26'),('李四','58'),('王五','27'),......);
 <select id="getUserInfo" resultType="com.test.UserList">SELECT*FROM user_infowhere<if test="user!= null and user.size() >0">(USERNAME,AGE) IN<foreach collection="user.entrySet()" item="value" index="key" separator="," open="(" close=")">(#{key},#{value})</foreach></if>
</select>

第二种:参数Map类型,只需要获取key值或者value值

key:

 <select id="getUserInfo" resultType="com.test.UserList">SELECT*FROM user_infowhere<if test="user!= null and user.size() >0">(USERNAME) IN<foreach collection="user.keys" item="key"  separator="," open="(" close=")">#{key}</foreach></if>
</select>

value:

  <select id="getUserInfo" resultType="com.test.UserList">SELECT*FROM user_infowhere<if test="user!= null and user.size() >0">(USERNAME) IN<foreach collection="user.values" item="value"  separator="," open="(" close=")">#{key}</foreach></if>
</select>

Mybatis——foreach用法相关推荐

  1. linux foreach用法,mybatis foreach用法

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

  2. MyBatis中foreach用法

    foreach用法 SQL语句中有时会使用in关键字,如id in {1,2,3},我们可以使用${ids}方式直接获取值,但是这种方法不能防止SQL注入,想避免SQL注入的话就需要使用#{id}的方 ...

  3. Mybatis中的foreach用法

    Mybatis中的foreach用法 目录 Mybatis中的foreach用法 元素属性 List对象集合查询 根据数组中的Id删除 update修改 元素属性 item: 集合中元素迭代时的别名, ...

  4. JavaScript中foreach()用法及使用的坑

    JavaScript中foreach()用法及使用的坑 JavaScript中foreach是用于遍历数组的方法,将遍历到的元素传递给回调函数,遍历的数组不能是空的要有值. foreach 语法: [ ...

  5. php foreach是什么,php foreach用法是什么

    php foreach用法是:foreach仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误,格式为[foreach(数组名 as 下标=>值)]. php forea ...

  6. Mybatis foreach 使用与理解(支持Array,List,HashMap及相互嵌套)

    2019独角兽企业重金招聘Python工程师标准>>> Mybatis foreach 使用与理解(支持List<Hashmap<String,String>> ...

  7. MyBatis foreach 标签常用方法总结

    一.前言   在 MyBatis 中,常常会遇到集合类型的参数,虽然我们可以通过 OGNL 表达式来访问集合的某一个元素,但是 OGNL 表达式无法遍历集合.foreach 标签就是专门用来解决这类问 ...

  8. SSM项目使用Mybatis通用mapper插件tk.mybatis的用法

    SSM项目使用Mybatis通用mapper插件tk.mybatis的用法 https://blog.csdn.net/qq_40060806/article/details/82949722 TKm ...

  9. linux tcl 循环foreach,tcl foreach用法

    現在先讓我們來看看set建立陣列的用法,使用set建立陣列是很簡單的就如同建立一般的變數,只要在變數名稱後面加上一對小括號,這樣Tcl就會把這個變數 .... 第4~6行示範使用foreach迴圈列印 ...

最新文章

  1. 什么是 DDos 攻击
  2. CodeForces - 224C. Bracket Sequence (栈模拟)简单做法
  3. ubuntu11.10 samba服务器配置
  4. 39--打印从1到最大的n位数
  5. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。
  6. Vue常用特性~非常详细哦,带源码资料
  7. loadrunner中面向目标场景的设计
  8. [最短路-Floyd][数学]Luogu P1552 牛的旅行
  9. 深度学习笔记(二)——VGG
  10. android gms包找不到,错误:包com.google.android.gms.appstate不存在
  11. 举例计算机的发展状况,计算机的发展过程教学设计.doc
  12. python catia二次开发_CATIA VBA二次开发教程|使用零件的Body生成Product
  13. 学习笔记 Tianmao 篇 recyclerView 辅助的RecycleAdapterImpl类(适配自定义 模板)
  14. 如何在标准的机器学习流程上玩出新花样?
  15. “客户真的是魔鬼”吗?
  16. C语言SVPWM代码与软件测试
  17. 互联网——常见英文缩写及其含义
  18. 没有技术说明文档的开源都是耍流氓:微软Roslyn编译即服务在CIIP中具体应用(上)...
  19. python:scipy.optimize.minimize(method=’Nelder-Mead’)
  20. IEEE之后,学术政治化会成为人类的“潘多拉魔盒”吗?

热门文章

  1. 使用homebrew安装Java环境
  2. Harris角点检测原理详解
  3. 中国地质大学952软件工程(学硕)考研经验分享
  4. 2019年chrome浏览器主页被劫持无法清除
  5. 【From Audio to Talking Heads in Real-Time with AI! RAD-NeRF explained】
  6. 30个最佳和免费的Android媒体播放器
  7. 网页设计上机考试原题_《网页设计与制作》上机考试试题2
  8. 新成立公司的会计第一个月要做什么?
  9. # py自动创建日期文件夹用来记录自己的成长,以及如何打包成exe文件
  10. chatr.js 制作漂亮的图表