MyBatis批量插入
一、在MySQL数据库中
在mysql数据库中,使用的是foreach标签。 foreach元素的属性主要有 collection,item,index,open,separator,close。
常用的有
item ,是临时的元素的代表。迭代的时候要用上它,很容易被忽略从而报错。
collection标签是集合的代表。如果传入的值是List集合,那么collection的值是list。如果传入的是数组,那么collection的值是array。如果在接口上定义了传递进来的参数,那么collection的值就是那么定义好的参数,比如下面的tags。
public interface ArticleMapper ...
int insertArticleTag(@Param("tags")List<Tag> tags);
index表示迭代的位置。
open表示从什么地方开始,close表示什么地方结束
separator表示在每次进行迭代之间以什么符号作为分隔符。MySQL中通常是",",Oracle中有时写union。
插入实例。INSERT INTO t_tag(name,articleId) VALUES('good','22') , ('nice','22'),('perfect','22')
INSERT INTO temp7(name) VALUES('a'),('B'),('C')
<insert id="insertList" keyProperty="id" useGeneratedKeys="true"
parameterType="java.util.List">
INSERT INTO t_tag(name,articleId)
VALUES
<foreach collection="list" item="tag" separator="," index="index">
(#{tag.name},#{tag.articleId})
</foreach>
</insert>
注意:这里需要使用tag.name,我第一次写的时候,忘记了加上item中定义的临时属性,导致出错。
二、Oracle数据库
MySQL写法,转成Oracle。
<insert id="insert" parameterType="java.util.List" databaseId="oracle">
INSERT INTO T_REGION
(
ID,
GRADE,
COLLEGE_CODE,
TYPE,
MAX,
GMT_CREATE
)
SELECT 序列.NEXTVAL ID, A.*
FROM(
<foreach collection="list" item="entity" index="index" separator="UNION ALL">
SELECT
#{entity.grade} GRADE,
#{entity.collegeCode} COLLEGE_CODE,
1 TYPE,
#{entity.maxProjectCredit} MAX,
sysdate GMT_CREATE
FROM dual
</foreach>
)A
</insert>
<insert id="insert" keyColumn="ID" keyProperty="id"
parameterType="java.util.List" useGeneratedKeys="true" databaseId="mysql">
INSERT INTO t_region (
grade,
college_code,
type,
max,
gmt_create
)
VALUES
<!-- Auto Generated by @PATIENT -->
<foreach collection="list" item="entity" separator="," index="index">
(
#{entity.grade},
#{entity.collegeCode},
2,
#{entity.max},
now()
)
</foreach>
</insert>