mybatis foreach,但提交单个插入

时间:2018-12-11 00:37:02

标签: mybatis intersystems-cache

以下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>

2 个答案:

答案 0 :(得分:1)

如果您使用的是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>

答案 1 :(得分:1)

首先,选中https://stackoverflow.com/a/40608353/5053214

另外根据mybatis doc

  

您可能不熟悉的一个参数是ExecutorType。该枚举定义了3个值:

     

ExecutorType.SIMPLE:这种类型的执行器没有什么特别的。它将为每次执行语句创建一个新的PreparedStatement。

     

ExecutorType.REUSE:这种执行器将重用PreparedStatements。

     

ExecutorType.BATCH:该执行器将批处理所有更新语句,并在必要时对它们进行标定(如果在它们之间执行SELECT的话),以确保行为易于理解。

默认值为ExecutorType.SIMPLE,您需要将其更改为ExecutorType.BATCH。