foreach写法一般来说,有的是在外面用open, close
写括号。有的是直接在foreach语句里面写括号:
<foreach collection="flavors" item="df" separator=",">
(#{df.dishId}, #{df.name}, #{df.value})
</foreach>
<foreach collection="dishIds" item="dishId" separator="," open="(" close=")">
#{dishId}
</foreach>
上面两种写法都正确。第一个是插入的,要插入的每个数据里有的数据是(#{df.dishId}, #{df.name}, #{df.value})
,所以在foreach语句里面写括号。
第二个是查询,在 IN
后面写了这么多。说的是只要在这么多里面中的一个就可以。所以这个可以在外面包括号,会把里面所有的数据全部包起来。
错误写法
<insert id="insertBatch">
insert into setmeal_dish (setmeal_id, dish_id, name, price, copies) values
<foreach collection="setmealDishes" item="setmealDish" separator="," open="(" close=")">
#{setmealDish.setmealId}, #{setmealDish.dishId}, #{setmealDish.name}, #{setmealDish.price}, #{setmealDish.copies}
</foreach>
</insert>
这个写法就是错误的。他应该在里面包,因为是插入,所以每插入一个数据都要包裹起来。因此,如果在外面用open, close
把这些包裹起来,插入两条数据时的SQL语句就会是这个样子:
insert into setmeal_dish (setmeal_id, dish_id, name, price, copies) values
(1, 101, 'Dish 1', 10.50, 2, 2, 102, 'Dish 2', 12.00, 3)
但是我们实际想要的是:
insert into setmeal_dish (setmeal_id, dish_id, name, price, copies) values
(1, 101, 'Dish 1', 10.50, 2),
(2, 102, 'Dish 2', 12.00, 3)
总结
foreach标签在插入时,括号要写在里面。
在查询(例如IN
后面时),需要把括号写在外面(open, close, separator
)