Следующее сопоставление 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>





Если вы используете версию Java 8+, вы можете использовать метод по умолчанию в картографе следующим образом:
interface MyMapper {
void insertResource(@Param("resource") MyResource resource);
default void bulkInsert(List<MyResource> resources) {
for(MyResource resource:resources) {
insertResource(resource);
}
}
}
И измените mapper 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>
Выглядит многообещающе, я скоро проверю здесь
Прежде всего, проверьте https://stackoverflow.com/a/40608353/5053214.
Дополнительно согласно mybatis doc:
The one parameter that might be new to you is ExecutorType. This enumeration defines 3 values:
ExecutorType.SIMPLE: This type of executor does nothing special. It creates a new PreparedStatement for each execution of a statement.
ExecutorType.REUSE: This type of executor will reuse PreparedStatements.
ExecutorType.BATCH: This executor will batch all update statements and demarcate them as necessary if SELECTs are executed between them, to ensure an easy-to-understand behavior.
По умолчанию это ExecutorType.SIMPLE, вам нужно изменить его на ExecutorType.BATCH.
Я не думаю, что для этого подходит foreach. Вы можете построить структуру вставить - foreach, но не foreach - вставить. Будем рады обоснованному ответу на ваш вопрос.