以下mybatis映射适用于我们所有受支持的数据库(一个数据库除外)。这是因为该数据库不允许批量插入方法(系统间缓存)。因此,我想提交单个插入语句,而不是一个。我如何构造该mybatis语句,以便它仍从我的java.util.List中读取,但是会进行多次插入?
<insert id="bulkInsert" parameterType="java.util.List" >
<foreach collection="list" item="resource" index="index">
INSERT INTO ${prefix}ACT_APP_DEPLOYMENT_RESOURCE(ID_, NAME_, RESOURCE_BYTES_, DEPLOYMENT_ID_) VALUES
(#{resource.id, jdbcType=VARCHAR},
#{resource.name, jdbcType=VARCHAR},
#{resource.bytes, jdbcType=${blobType}},
#{resource.deploymentId, jdbcType=VARCHAR})
</foreach>
</insert>
最佳答案
如果您使用的是Java 8+版本,则可以在mapper中使用默认方法,如下所示:
interface MyMapper {
void insertResource(@Param("resource") MyResource resource);
default void bulkInsert(List<MyResource> resources) {
for(MyResource resource:resources) {
insertResource(resource);
}
}
}
并修改映射器xml:
<insert id="insertResource">
INSERT INTO ${prefix}ACT_APP_DEPLOYMENT_RESOURCE(ID_, NAME_, RESOURCE_BYTES_, DEPLOYMENT_ID_) VALUES
(#{resource.id, jdbcType=VARCHAR},
#{resource.name, jdbcType=VARCHAR},
#{resource.bytes, jdbcType=${blobType}},
#{resource.deploymentId, jdbcType=VARCHAR})
</insert>