Intenta entender el código bien antes de adaptarlo a tu trabajo si ttienes algo que aportar puedes decirlo en los comentarios.
Solución:
La respuesta aceptada no es la forma recomendada de manejar operaciones por lotes. no muestra true declaraciones por lotes ya que el modo ejecutor por lotes debe usarse al abrir una sesión. Vea esta publicación en la que un colaborador de código recomendó que la forma correcta de actualizar (o insertar) por lotes es abrir una sesión en modo por lotes y llamar repetidamente a actualizar (o insertar) para un solo registro.
Esto es lo que funciona para mí:
public void updateRecords(final List objectsToUpdate)
final SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession(ExecutorType.BATCH);
try
final GisObjectMapper mapper = sqlSession.getMapper(GisObjectMapper.class);
for (final GisObject gisObject : objectsToUpdate)
mapper.updateRecord(gisObject);
sqlSession.commit();
finally
sqlSession.close();
No use foreach en su actualización/inserción y asegúrese de que solo actualice/inserte un solo registro. Me encontré con errores de Oracle irresolubles al hacerlo de acuerdo con la respuesta aceptada (carácter no válido, declaración no finalizada, etc.). Como indica la publicación vinculada, la actualización (o inserción) que se muestra en la respuesta aceptada es en realidad solo una declaración sql gigante.
En mi caso también hay mismo escenario. Usé for loop para verificar si este registro existe en la base de datos o no y luego, de acuerdo con eso, agregué este objeto a dos listas de matrices para insertar o actualizar. Y luego usé el lote para insertar y actualizar después del bucle for para que se incluya en la lista.
aquí está ex. para actualizar según diferentes condiciones
1]esto es para actualizar
UPDATE parties SET attending_user_count = #model.attending_count
WHERE fb_party_id = #model.eid
2]esto es para insertar
INSERT INTO accountability_users
(
accountability_user_id, accountability_id, to_username,
record_status, created_by, created_at, updated_by, updated_at
)
VALUES
(
#model.accountabilityUserId, #model.accountabilityId, #model.toUsername,
'A', #model.createdBy, #model.createdAt, #model.updatedBy, #model.updatedAt
)
En el método dao declarar como
void insertAccountabilityUsers(@Param("usersList") List usersList);
Actualizar
Aquí está mi código de sesión por lotes
public static synchronized SqlSession getSqlBatchSession()
ConnectionBuilderAction connection = new ConnectionBuilderAction();
sf = connection.getConnection();
SqlSession session = sf.openSession(ExecutorType.BATCH);
return session;
SqlSession session = ConnectionBuilderAction.getSqlSession();
En realidad, ya di un ejemplo completo aquí para esta pregunta.
Si guardas algún reparo o disposición de acrecentar nuestro reseña puedes dejar un exégesis y con gusto lo interpretaremos.