目录
使用原因:
批量新增和批量修改在业务中是很常见的,一条sql访问数据库和通过代码循环体中循环访问数据库做单个数据新增修改相比较下:一条sql访问数据库性能上明显提升,代码且简洁明了
foreach标签介绍:
- collection:必填,值为要迭代循环的属性名。这个属性值的情况有很多
- item :变量名,值为从迭代对象中取出来的每一个值
- index: 索引的属性名,在集合数组情况下值为当前索引值,当迭代循环的对象时Map类型时,这个值为map的key值
- open: 整个循环内容开头的字符串
- close:整个循环内容结尾的字符串
- separator: 每次循环的分隔符
代码示例:
1.oracle数据库写法
<insert id="insertCustomersBatch" parameterType="java.util.List">
insert into tableName(UUID,NAME)
<foreach collection="list" item="item" index="index" separator="union all">
(
SELECT
#{item.uuid},
#{item.customersname}
FROM DUAL
)
</foreach>
</insert>
2.mysql数据库写法
<!--
方式一 :
一条 SQL,插入的多条数据之间通过”,” 分隔开
-->
<insert id="insertCustomersBatch" parameterType="java.util.List">
insert into tableName(UUID,NAME) VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.uuid},
#{item.customersname}
)
</foreach>
</insert>
<!--
方式二 :
MySql 默认的情况下是不支持使用”;” 分隔开多条 SQL 进行执行的,需要设置一个连接属性
allowMultiQueries=true来支持。可以在连接数据库的时候设置这个属性。
jdbc.url=jdbc:mysql://localhost:3306/mybatis-study?allowMultiQueries=true
-->
<insert id="addEmpsByList" parameterType="com.jas.mybatis.bean.Employee">
<!--
每插入一条数据就执行一次 SQL,中间用";"分隔开
-->
<foreach collection="list" item="emp" separator=";">
insert into tableName(UUID,NAME) VALUES
(#{item.uuid}, #{item.customersname})
</foreach>
</insert>
总结:
这篇博文主要对 MyBati 动态 SQL 中的foreach进行了介绍与其使用场景的应用,MyBatis 还提供了其他的标签来支持动态 SQL。比如:if、choose (when, otherwise)、trim (where, set),有关的详细信息可以到官方文档进行深入了解,希望这篇博文能够为你提供一些帮助。