编程技巧系列:MyBatis 常用formach的应用场景及用法

73 阅读3分钟

一、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'
)