mybatis foreach, но отправляю отдельные вкладки
Следующее отображение 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 ответа
Если вы используете 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>
Прежде всего, проверьте /questions/5918687/ispolzuya-foreach-chtobyi-sdelat-paketnuyu-vstavku-s-mybatis/5918693#5918693.
Дополнительно согласно mybatis doc:
Один параметр, который может быть новым для вас, это ExecutorType. Это перечисление определяет 3 значения:
ExecutorType.SIMPLE: этот тип исполнителя не делает ничего особенного. Он создает новый PreparedStatement для каждого выполнения оператора.
ExecutorType.REUSE: этот тип исполнителя будет повторно использовать PreparedStatements.
ExecutorType.BATCH: этот исполнитель будет пакетировать все операторы обновления и разграничивать их по мере необходимости, если между ними выполняется SELECT, чтобы обеспечить простое для понимания поведение.
По умолчанию это ExecutorType.SIMPLE, вам нужно изменить его на ExecutorType.BATCH.