Mybatis——foreach用法

2023-05-16

目录

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_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);

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

	 <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


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_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>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis——foreach用法 的相关文章

随机推荐

  • 语法错误( error: array bound is not an integer constant before ‘]’ token)

    include lt iostream gt include lt cstdio gt using namespace std int N 61 100 int a N N int main 编译出现了 Error array bound
  • 使用ADB出现了system/bin/sh: adb: not found&system/bin/sh: pull: not found错误

    在使用ADB传送文件的时候出现了system bin sh adb not found amp system bin sh pull not found错误 解决办法 xff1a 可能你在使用adb pull 之前你使用了adb shell
  • 回环检测之决策模型

    前面我们已经讲了如何描述场景 xff0c 让机器人尽可能的了解周围环境 xff0c 那么了解了之后 xff0c 如何判断出是回环的呢 xff1f 本节讨论如何建立决策模型来根据当前场景描述和地图信息识别出可能的闭环 合理的决策模型可有效提高
  • 回环检测之DBoW2

    前面我们已经讲了回环检测中用的一些方法 xff0c 今天主要介绍一下现在用的最多的词袋模型 DBoW2 这里就不在细讲回环检测的定义 xff0c 具体可以看看我的前面的博客 xff0c 而回环检测在SLAM中的作用可以从下面的图片中大致有一
  • 快速解决rosdep update一直不通过问题

    以前安装ROS的时候遇到rosdep update不通过 xff0c 需要很多次测试才能通过 xff0c 能通过完全靠运气 xff0c 也找了网上很多种方法 xff0c 比较麻烦 xff0c 今天这里说一下一位大神帅鱼提供的一个方法 xff
  • Matlab读取文本数据

    用Nastran的时候 xff0c 想把bdf文件里的节点坐标导出来 xff0c 但是坐标的格式很奇怪 xff0c 见下图 xff1a 会发现这种科学计数法中间没有字母E或e xff0c 直接用Matlab中的load函数读取的话 xff0
  • 为学弟学妹熬夜的一份零基础 C++ 开发学习路线

    大家好 xff0c 我是帅地 之前写过几篇学习路线的文章 前端开发学习路线 Java 后端开发学习路线 一般开发岗主流的就是 Java 后台开发 xff0c 前端开发以及 C 43 43 后台开发 xff0c 现在 Go 开发也是越来越多了
  • ars408_ros驱动问题

    0 ars408 ros驱动 mkdir folder mkdir folder src cd folder src git clone https github com sergiocasaspastor myrepository git
  • Tensorflow实战:LSTM原理及实现(详解)

    LSTM规避了标准RNN中梯度爆炸和梯度消失的问题 xff0c 所以会显得更好用 xff0c 学习速度更快 下图是最基本的LSTM单元连接起来的样子 上图为一层LSTM单元连接起来的样子 xff0c 在工业上 xff0c LSTM是可以像一
  • Gazebo版本升级7.0--->7.16

    GPU issues The GPU problems reported in this issue have been solved with this pull request for the gazebo7branch The Gaz
  • 机器人局部动态避障算法dwa解析

    简介 dwa算法全称叫动态窗口法 xff08 dynamic window approach xff09 xff0c 其算法过程主要分为仿真获取机器人的运动轨迹 对轨迹进行评价选择最优轨迹两个主要过程 xff0c 动态窗口表达的是仿真的运动
  • 应届生应该如何准备校招

    大家好 xff0c 我是羽峰 xff0c 今天要和大家分享的是应届生应该如何准备校招 xff0c 希望该文章对一些今年要找工作的朋友有一些帮助 还是老话 xff0c 我是羽峰 xff0c 希望我所分享的文章能为您及更多的朋友带来帮助 欢迎转
  • docker容器迁移到其他服务器

    以把旧服务器的mysql容器迁移到虚拟机上为例 1 旧服务器查看路径映射 首先查看mysql容器的路径映射 span class token function docker span inspect mysql 2 基本数据由旧服务器迁移到
  • 查看msg类型数组的长度

    msg类型数组的使用 需要说明的是std msgs中有些数组用法和C 43 43 标准库中不一样 比如Float32MultiArray xff0c 其定义如下 xff1a std msgs MultiArrayLayout layout
  • ROS 查看tf树

    rosrun rqt tf tree rqt tf tree
  • C++——构造函数后加冒号

    其实冒号后的内容是初始化成员列表 xff0c 一般有三种情况 xff1a 1 对含有对象成员的对象进行初始化 xff0c 例如 xff0c 类 line 有两个私有对象成员 startpoint endpoint line 的构造函数写成
  • Redis——在windows下设置密码

    设置密码有两种方式 1 命令行设置密码 运行cmd切换到redis根目录 xff0c 先启动服务端 gt redis server exe 另开一个cmd切换到redis根目录 xff0c 启动客户端 gt redis cli exe h
  • C++——函数声明省略形参名的用法注意

    函数声明时 xff0c 形参可以没有参数名 xff08 形参 xff09 xff0c 函数定义时 xff0c 一定要有参数名 xff08 形参 xff09 xff0c 函数调用时 xff0c 一定要有参数名 xff08 实参 xff09 i
  • Go——打印变量类型的两种方法

    1 使用reflect的TypeOf方法 模块是 xff1a 34 reflect 34 fmt Println reflect TypeOf var 切片类型的输出 2 使用Printf中的占位符 T 占位符 说明 举例 输出 T 相应值
  • Mybatis——foreach用法

    目录 1 foreach元素的属性 2 foreach时 xff0c collection属性值的三种情况 xff1a 3 代码示例 xff1a 3 1 collection属性值类型为List 使用 64 Param注解自定义keyNam