Varias formas de implementar la actualización por lotes en Mybatis

I. Resumen

Es muy simple implementar la inserción por lotes en mybatis. En comparación con lo que todos saben, no entraré en detalles aquí. Este artículo describe principalmente cómo implementar la actualización por lotes.

A continuación, se presentan los diversos métodos que se analizarán en este artículo, que se implementan principalmente en xml y no incluyen los métodos que necesitan cambiar la lógica del código Aquí, además de los casos comunes mencionados en Internet, también hay métodos de actualización por lotes adecuados para mysql y oracle: 1. caso cuando 2 .foreach en múltiples SQL 3. EN ACTUALIZACIÓN DE CLAVE DUPLICADA (mysql) 4. reemplazar en (mysql)

En esta ocasión, hablaré de estos cuatro métodos.

2. caso cuando

La operación de actualización por lotes implementada de esta manera es muy ineficiente y cuando hay muchos campos para actualizar, la instrucción SQL será particularmente larga.

<update id="updateBatch">
    update t_calendar_extend
    <trim prefix="set" suffixOverrides=",">
        <trim prefix="modify_time = case index" suffix="end,">
            <foreach collection="list" item="item">
                when #{item.index} then #{item.modifyTime}
            </foreach>
        </trim>
        <trim prefix="user_type = case index" suffix="end">
            <foreach collection="list" item="item">
                when #{item.index} then #{item.type}
            </foreach>
        </trim>
    </trim>
    <where>
        index in (
        <foreach collection="list" separator="," item="item">
            #{item.index}
        </foreach>
        )
    </where>
</update>

Aquí, los valores de modify_time y user_type se actualizan de acuerdo con el valor del índice.Si hay varios campos, debe recorrerse varias veces, lo que es muy ineficiente.

Tres, foreach en múltiples sql

La forma más sencilla es utilizar foreach para ensamblar varias sentencias de actualización, pero la sentencia SQL en el archivo de asignación de Mybatis no admite el final de ";" de forma predeterminada, es decir, no admite la ejecución de varias sentencias SQL. Por lo tanto, debe agregar &allowMultiQueries=true a la URL que se conecta a mysql para ejecutarlo.

<update id="updateBatch"  parameterType="java.util.List">  
    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
        update tableName
        <set>
            name=${item.name},
            name2=${item.name2}
        </set>
        where id = ${item.id}
    </foreach>      
</update>

四、EN ACTUALIZACIÓN DE CLAVE DUPLICADA

ON ACTUALIZACIÓN DE CLAVE DUPLICADA en MYSQL se basa en la clave principal (CLAVE PRINCIPAL) o índice único (ÍNDICE ÚNICO).

Actualice si el identificador único o la clave principal ya existe, o insértelo como una nueva fila si el identificador único o la clave principal no existen.

<update id="updateBatch">
    insert into t_output_calendar (index, 
      cal_date, user_type, create_time, 
      modify_time, delete_flag
      )
    values
    <foreach collection="list" item="item" index="index"
        separator=",">
        (
        #{item.index,jdbcType=INTEGER}, 
        #{item.calDate,jdbcType=TIMESTAMP}, 
        #{item.type,jdbcType=TINYINT}, 
        #{item.createTime,jdbcType=TIMESTAMP}, 
        #{item.modifyTime,jdbcType=TIMESTAMP}, 
        #{item.deleteFlag,jdbcType=TINYINT}
        )
    </foreach>
    ON DUPLICATE KEY UPDATE modify_time = VALUES(modify_time), user_type = VALUES(user_type);
</update>

Cinco, reemplazar en

Reemplazar en Msql es exactamente lo mismo que insertar en, pero tiene una función de actualización:

Si se encuentra que esta fila de datos ya existe en la tabla (a juzgar por la clave principal o el índice único), primero elimine esta fila de datos y luego inserte nuevos datos. De lo contrario, inserte nuevos datos directamente.

Tenga en cuenta que primero elimina los datos y luego los inserta. Esto es ON DUPLICATE KEY UPDATEdiferente de eso. Si el usuario actual de la base de datos no tiene permiso de eliminación, no se puede usar reemplazar en.

Ejemplo:

<insert id="updateBatch" parameterType="java.util.List">
    replace into t_output_calendar (index, cal_date, user_type, create_time, 
      modify_time, delete_flag
      )
    values
    <foreach collection="list" item="item" index="index"
        separator=",">
        (
        #{item.index,jdbcType=INTEGER}, 
        #{item.calDate,jdbcType=TIMESTAMP}, 
        #{item.type,jdbcType=TINYINT}, 
        #{item.createTime,jdbcType=TIMESTAMP}, 
        #{item.modifyTime,jdbcType=TIMESTAMP}, 
        #{item.deleteFlag,jdbcType=TINYINT}
        )
    </foreach>
</insert>

 

1. Inserte en los medios para insertar datos, la base de datos verificará la clave principal y, si hay una duplicación, se informará un error;

2. reemplazar en medios para insertar y reemplazar datos. Hay una clave principal o un índice único en la tabla de demanda. Si los datos ya existen en la base de datos, se reemplazarán con datos nuevos. Si no hay efecto de datos, se lo mismo que insertar en;

-- 存在就更新:
REPLACE INTO 表名(字段1, 字段2, ...) VALUES(值1, 值2, ...), (值1, 值2, ...);

3. insertar ignorar significa que si el mismo registro ya existe en la tabla, los nuevos datos actuales serán ignorados;

-- 存在就忽略:
INSERT IGNORE 表名(字段1, 字段2, ...) VALUES(值1, 值2, ...), (值1, 值2, ...);

4. Al actualizar la clave duplicada Esta sintaxis se puede utilizar para determinar si el registro existe al insertar el registro, si no existe, insértelo, de lo contrario, es muy conveniente actualizar, y no es necesario ejecutar dos SQL 

Supongo que te gusta

Origin blog.csdn.net/yyongsheng/article/details/127867105
Recomendado
Clasificación