Saltar al contenido

Inserción/Actualización por lotes de MyBatis para Oracle

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *