Mybatis——foreach用法

Mybatis——foreach用法在做 mybatis 的 mapper xml 文件的时候 时常遇到一些需要批量操作的情况 这个时候 mybatis 的 foreach 标签就派上用场了 foreach 元素的属性主要有 item index collection open separator close item 集合中元素迭代时的别名 该参数为必选 index 在 list 和数组中 index 是元素的序号 在 map 中 index 是元素的 key 该参数可选 open foreach 代码的开始符号 一般是 和 clos

目录

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); 
 <select id="getUserInfo" resultType="com.test.UserList"> SELECT * FROM user_info where <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); 
 <select id="getUserInfo" resultType="com.test.UserList"> SELECT * FROM user_info where <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

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

第一种:获取Map的键值对

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231149.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CTF—逆向入门题目(超详细)

    CTF—逆向入门题目(超详细)0x00:介绍以下为一些简单的Windows逆向入门题目,帮助一些刚接触逆向又无法下手的朋友,如果对安卓逆向感兴趣的朋友可以看一下我的这一篇安卓逆向入门题目哦:https://blog.csdn.net/CharlesGodX/article/details/866029580×01:题目1.Bugkuctf平台中的逆向题easy_vb:打开文件发现需要输入注册码获取flag…

    2022年6月19日
    104
  • json对象转map对象_json map

    json对象转map对象_json map1.jsonObject转map相关jar包:importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importjava.util.Map.Entry;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;代码:JSONObjectuser=resJson.getJSONObj

    2022年8月23日
    9
  • mysql添加唯一索引语句_mysql修改唯一索引语句

    mysql添加唯一索引语句_mysql修改唯一索引语句查看索引showindexfrom数据库表名altertable数据库addindex索引名称(数据库字段名称)PRIMARYKEY(主键索引)ALTERTABLE`table_name`ADDPRIMARYKEY(`column`)UNIQUE(唯一索引)ALTERTABLE`table_name`ADDUNIQUE(`column`)INDEX(普…

    2026年2月1日
    6
  • MySql数据库约束

    关系型数据库系统和文件系统的一个不同点是,关系数据库本身能保证存储数据的完整性,不需要应用程序的控制,而文件系统一般需要在程序端进行控制。当前几乎所有的关系型数据库都提供了约束(constraits)

    2021年12月28日
    44
  • access 注入

    0x00前言现在access的站,比较少,有的话也是小型网站在用,因为access的性能比较差,多人访问都能卡死,所以很多网站都很少会采用access的数据库搭建。但是该学的我们还是得学。0x0

    2021年12月11日
    58
  • WINDOWS XP安装SQL2000方法

    一.在SQL服务器的安装盘中找到MSDE这个目录,并且点击setup.exe安装它,过程简单直接下一步就OK了。二.重启系统WINDOWSXP,这下就可以看到SQL服务的图标出现了。三.再拿出SQL服务器版的安装光盘,直接安装客户端工具(最简单的方法就是直接点击光盘根目录下的autorun.exe)根据提示安装,自检过程中知道系统不是SERVER版,会提示只安装客户端工具。四.打开企业管理器

    2022年4月13日
    130

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号