【mybatis】mapper.xml中foreach的用法,含批量查询、插入、修改、删除方法的使用

一、xml文件中foreach的主要属性

foreach元素的属性主要有 collection,item,index,separator,open,close。

collection: 表示集合,数据源

item :表示集合中的每一个元素

index :用于表示在迭代过程中,每次迭代到的位置

separator :表示在迭代时数据以什么符号作为分隔符

open :表示该语句以什么开始

close :表示以什么结束

二、foreach批量查询数据

1、当查询的参数只有一个时

例如:findByIds(List ids)

a.如果参数类型为List,在使用时,collection的属性需指定为list

b.如果参数类型为数组,则在使用时,collection属性需指定为array

<select id="findByIdsMap" resultMap="BaseResultMap">

Select sum(mark)

from table_user where user_id in

<foreach item="item" index="index" collection="list"

open="(" separator="," close=")">

#{item}

</foreach>

</select>

2、当查询的参数是一个对象时

例如:findByIds(List userList)

<select id="findByIdsMap" resultMap="BaseResultMap">

Select sum(mark)

from table_user where user_id in

<foreach item="item" index="index" collection="list"

open="(" separator="," close=")">

#{item.userId}

</foreach>

</select>

三、foreach批量插入数据

实现foreach批量插入数据有两种方法,一种是只发送一条 SQL,插入的多条数据之间通过"," 分隔开,另一种方式是每插入一条数据就发送一条 SQL 语句,多个 SQL 语句之间用";"分割。

1.一条 SQL 批量插入数据

对应的Mapper接口代码如下:

/** 返回值为 Integer 类型 */

Integer addStudentByList(@Param("list") List<Student> list);

1

2

对应的SQL 映射文件如下:

<insert id="addStudentByList" parameterType="">

INSERT INTO Student(username, age, password) VALUES

<foreach collection="list" item="item" separator=",">

(#{ item.username}, #{ item.age}, #{ item.password})

</foreach>

</insert>

2.执行多条 SQL 批量插入数据

对应的Mapper接口代码和一条 SQL 批量插入数据相同

对应的SQL 映射文件在一条 SQL 批量插入数据的基础上修改如下:

<insert id="addEmpsByList" parameterType="com.jas.mybatis.bean.Employee">

<!-- 每插入一条数据就执行一次 SQL,中间用";"分隔开 -->

<foreach collection="list" item="emp" separator=";">

INSERT INTO Student(username, age, password) VALUES

(#{ item.username}, #{ item.age}, #{ item.password})

</foreach>

</insert>

三、foreach批量更新数据

实现foreach批量插入数据有两种种方法,第一种是一条sql语句来批量更新数据,第二种是批量更新的sql。

一条 SQL 批量更新数据

一条sql语句来批量更新所有数据,下面直接看一下在mybatis中通常是怎么写的(去掉mybatis语法就是原生的sql语句了,所有就没单独说sql是怎么写的)

对应的SQL 映射文件如下:

<update id="updateBatch" parameterType="java.util.List">

update Student set username=

<foreach collection="list" item="item" index="index" separator=" " open="case ID" close="end">

when #{ item.id} then #{ item.username}

</foreach>

where id in

<foreach collection="list" index="index" item="item" separator="," open="(" close=")">

#{ item.id,jdbcType=BIGINT}

</foreach>

</update>

<------------------------------------分隔符-------------------------------->

<update id="updateBatch" parameterType="java.util.List">

<foreach collection="list" item="item" index="index" open="" close="" separator=";">

update Student

<set>

username=${ item.username}

</set>

where id = ${ item.id}

</foreach>

</update>

四、foreach批量删除数据

所对应的SQL映射文件如下:

<delete id="delAssetstype" parameterType="java.util.List">

DELETE FROM WHERE id in

<foreach collection="list" item="item" open="(" close=")" separator=",">

#{ item}

</foreach>

</delete>

对应的Mapper接口代码如下:

public void deleteAssetstype(List<Integer> ids);

相关推荐
GHN198788828 分钟前
开源小工具按一下空格,什么都看见了
windows
围炉聊科技3 小时前
Windows-MCP 拆解与实测:AI 操作 Windows 这件事——智能体基建系列
windows·llm·dom
面包狗AI4S3 小时前
ChatGPT/Codex Windows:本地桌面端应用离线包安装与免安装启动方法(无需管理员权限)
人工智能·windows·ai·chatgpt
自养Agent4 小时前
MCP Server Boundary Audit Report
linux·服务器·人工智能·windows·大模型·llm
2301_786756607 小时前
中科院分区表停发后,期刊评价的技术逻辑:从期刊超越指数到多指标选刊方案
java·数据库·windows
是我知白哒9 小时前
下载的图片Windows上无法设置为屏保如何解决
windows
Vex2une9 小时前
获取 PowerToys - 从系统外挂工具到开源效率平台
windows·开源·效率工具·powertoys·fancyzones·command palette·键盘管理器
夕除10 小时前
redis--主从还是集群,内存
java·spring·mybatis
驭渊的小故事10 小时前
MyBatis-Plus 实战指南:从基础 CRUD 到条件构造器与自定义 SQL(二)
数据库·sql·mybatis
骇客野人10 小时前
Windows 安全清理临时文件 bat 脚本
windows·安全