一、formach出现的背景需求
我们经常需要对Mysql数据库批量的操作,例如不想通过硬编码,而是通过sql语包的动态生成,实现批量的查询、添加、修改等操作(即用在select、update、insert、delete语句中,如何根据传入的集合(例如:list,map,Object,Array)把它的内容通过动态地去遍历他们将其中的元素内容应用到SQL语句中,即动态sql的拼装,经常碰到需要传进以下对象,本质上就是通过循环去动态生成sql语句,无论它传入以下哪个类型,它都会把参数放在一个Map(传参是Map除外):
- List : list作为键
- Map: 本身内容有键
- 数组Array, array作为键
- 对象Object
- 基本类型(Long,String等)
二、formach用法:六个元素
- collection: 必选,值一般是list,Map,数组,对象,基本类型。注意入参时用@Paraam(“keyName”)来设置键,list和array这个键将失效。也有可以作入对象的的集合属性,例如:ids.id
- item: 必选,集合中每一个元素迭代时的别名,例如value,后面有#{value}或者#{value.deptId}
- index: 可选,用的少,指定一个名字,表示迭代过程中每次迭到的位置
- sperator: 可选, 每次迭代之间以什么符号作为分隔符(即自动生成这个隔开符号),一般int条件或values函数一般就是用逗号','作为分隔符。
- open和close: 可选,即每一个迭代过程中,前后需要在sql中添加这个符号,常用'('和')',也可以写在formach内容体的中的sqk语句中,最常用在in和values时。
三、formach常用场景
1.批量插入表数据
INSERT INTO table (a, b, c, d) VALUES
<foreach collection = "list" item = "item" separatior = ",">
(#{item.a}, #{item.b}, #{item.c}, #{item.d})
</foreach>
/*执行Mybatis后的SQL语句示例
*<foreach>在每个数据集间添加了','
*/
INSERT INTO table (a, b, c, d) VALUES
('a',123,true,'112456789'),
('b',124,true,'112455789'),
('c',125,false,'112466789'),
('d',126,true,'112451789')
2.批量更新表数据
2.1单条件更新
UPDATE table SET b = '10'
WHERE a IN
<foreach collection = "list" item = "item" open = "(" close = ")" separator = ",">
#{item.a}
</foreach>
/*执行Mybatis后的SQL语句示例
*单条件用到了IN函数
*<foreach>在标签头尾添加了'(' ')',并在每个数据间添加了','
*/
UPDATE table SET b = '10'
WHERE a IN ('ZBD12131','ZBD12132','ZBD12133')
2.2多条件更新
UPDATE table
SET a =
CASE
<foreach collection="list" item="item">
WHEN b=#{item.b} AND c = #{item.c} THEN '10'
</foreach>
ELSE a END;
/*执行Mybatis后的SQL语句示例
*多条件批量更新用到了SQL语句中的CASE WHEN函数
*/
UPDATE table
SET d =
CASE
WHEN b=123 AND c = true THEN '10'
WHEN b=124 AND c = true THEN '10'
WHEN b=125 AND c = false THEN '10'
WHEN b=126 AND c = true THEN '10'
ELSE d END;
3.批量查询表数据
3.1 单条件查询
SELECT * FROM table
WHERE a IN
<foreach collection = "list" item = "item" open = '(' close = ')' separator = ','>
#{item.a}
</foreach>
//执行Mybatis后的SQL语句示例
SELECT * FROM table
WHERE a IN ('ZBD123','ZBD124','ZBD125','ZBD126')
3.2 多条件查询
SELECT * FROM table
WHERE a = #{a}
AND
<foreach collection = "list" item = "item" open = '(' close = ')' separator = 'OR'>
b = #{item.b}
AND c = #{item.c}
AND d = #{item.d}
</foreach>
/*执行Mybatis后的SQL语句示例
*多条件批量查询用到了SQL语句OR函数,视实际应用环境修改separator参数
*/
SELECT * FROM table
WHERE a = '123'
AND (
b=123 AND c = true AND d = 'ZBD123' OR
b=124 AND c = true AND d = 'ZBD124' OR
b=125 AND c = false AND d = 'ZBD125' OR
b=126 AND c = true AND d = 'ZBD126'
)