mybatis foreach, но отправляю отдельные вкладки - PullRequest
0 голосов
/ 11 декабря 2018

Следующее отображение mybatis работает во всех поддерживаемых нами базах данных, кроме одной.Это связано с тем, что в этой базе данных не поддерживается метод массовой вставки (Intersystems Cache).Из-за этого я хотел бы подавать отдельные операторы вставки вместо одного.Как я могу структурировать этот оператор 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 голосов
/ 12 декабря 2018

Прежде всего, проверьте https://stackoverflow.com/a/40608353/5053214.

Дополнительно в соответствии с mybatis doc :

Единственный параметр, который может быть новым для вас, - ExecutorType.Это перечисление определяет 3 значения:

ExecutorType.SIMPLE: этот тип исполнителя не делает ничего особенного.Он создает новый PreparedStatement для каждого выполнения оператора.

ExecutorType.REUSE: этот тип исполнителя будет повторно использовать PreparedStatements.

ExecutorType.BATCH: этот исполнитель будет пакетировать все операторы обновления и разграничивать ихпри необходимости, если между ними выполняются SELECT, чтобы обеспечить простое для понимания поведение.

По умолчанию установлено значение ExecutorType.SIMPLE, вам нужно изменить его на ExecutorType.BATCH.

0 голосов
/ 11 декабря 2018

Если вы используете 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>
...