Descripción de fondo: Por lo general, si necesita actualizar múltiples datos a la vez, hay dos formas de actualizarlo uno por uno. (1) Reunir a través del código de negocio para actualizar uno por uno. (2) Actualice todos los datos a la vez (para ser más precisos, es una declaración SQL para actualizar todos los datos, colocar las operaciones de actualización uno por uno en el lado de la base de datos, y el lado del código de negocio es actualizar todos los datos a la vez). Los dos métodos tienen sus pros y contras. Lo siguiente analizará brevemente los pros y los contras de los dos métodos, e introducirá principalmente la implementación del segundo método en MyBatis.
Actualizar uno por uno
Este método es obviamente el más simple y menos propenso a los errores. Incluso si se produce un error, solo afecta los datos de error. Puede ser controlado por cada pieza de datos. Si la actualización falla o tiene éxito, se puede obtener de qué contenido se actualiza a qué contenido. El código puede verse así:
UpdateBatch (List <MyData> DataS) {for (MyData Data: DataS) {try {myDatadao.update (data); // Actualizar un datos, actualización del archivo XML a continuación en myBatis} capt (excepción e) {... // Si la actualización falla, puede hacer otras operaciones, como imprimir un registro de error, etc.}}}}}} // Actualizar el conjunto de MyData ... donde ... </update>El mayor problema con este método es el problema de eficiencia. Se actualiza uno por uno y se conecta a la base de datos cada vez, luego se actualiza y luego libera los recursos de conexión (aunque la eficiencia de los datos conectados frecuentemente se puede mejorar enormemente a través del grupo de conexión, lo que no puede soportar la gran cantidad de datos). Esta pérdida reflejará el problema de eficiencia cuando la cantidad de datos es grande. Esto también es cuando satisfacen las necesidades comerciales, la segunda implementación de actualización de lotes mencionada anteriormente se usa generalmente (por supuesto, este método también tiene limitaciones de escala de datos, que se mencionarán más adelante).
Actualización por lotes SQL
Se utiliza una declaración SQL para actualizar todos los datos en lotes. Echemos un vistazo a cómo se escribe generalmente en mybatis (eliminar la sintaxis mybatis es la declaración nativa de SQL, por lo que no hablo de cómo se escribe en SQL).
<update id = "updateBatch" parametertype = "java.util.list"> update myData_table set status = <foreach Collection = "list" item = "item" índice = "índice" separador = "" abre = "case id" cierre = "end"> cuando #{item.id} luego #{elemento separator = "," Open = "(" Close = ")"> #{item.id, jdbctype = bigint} </stideach> </update>donde cuándo ... entonces ... es la sintaxis del "interruptor" en SQL. Aquí, la sintaxis <deach> de MyBatis se usa para reconstruir la actualización de lotes SQL. Lo anterior significa que el campo de estado de los datos aprobados en la lista de ID en el parámetro UpdateBatch está actualizado por lotes. También puede usar <CRIM> para implementar la misma función, el código es el siguiente:
<update id = "updateBatch" parametertype = "java.util.list"> update myData_table <TRIM prefix = "set" sufreMoverRides = ","> <TRIM prefix = "status = case" suffix = "end,"> <foreach = "list" item = "item" = "index"> when ID = #{item.id} ENTRA # # #{» </crim> </crim> Where id en <foreach Collection = "list" index = "index" item = "item" separator = "," Open = "(" Close = ")"> #{item.id, jdbctype = bigint} </boreach> </update><RIM> Descripción de la propiedad
1.Prefix, sufijo significa agregar contenido en el frente o después de la pieza envuelta en la etiqueta de ajuste
2. Si hay prefijeverridos al mismo tiempo, sufixoverrides significa que el contenido en anulaciones se sobrescribirá con prefijo y sufijo.
3. Si solo prefiXoverrides, sufixoverrides significa eliminar el contenido especificado por xxxoverides al principio o al final.
El código anterior se convierte en SQL de la siguiente manera:
Actualizar myData_table set status = case when id = #{item.id} entonces #{item.status} // Este debería ser el valor <deachiach> expandir ... finalizar donde id en (...);Por supuesto, esta es la implementación de actualización por lotes más fácil. A veces, es posible que deban actualizarse múltiples campos, por lo que debe
<TRIM prefix = "status = case" suffix = "end,"> <foreach Collection = "list" item = "item" index = "index"> When id = #{item.id} entonces #{item.status} </boreach> </crot>Copie varias veces, cambie el contenido del prefijo y cuándo ... entonces ... y si necesita establecer el valor predeterminado para un campo determinado, puede usar el otro
<TRIM prefix = "status = case" suffix = "end,"> <foreach Collection = "list" item = "item" index = "index"> When id = #{item.id} entonces #{item.status} </foreach> else default_value </trim>También hay una situación más común en la que los datos a actualizar deben juzgarse, y solo los datos que cumplan con las condiciones se pueden actualizar. Esta situación se puede hacer:
<TRIM prefix = "status = case" suffix = "end,"> <foreach Collection = "list" item = "item" index = "index"> <if test = "item.status! = null y item.status! = -1"> when id = #{item.id} entonces #{item.status} </if> </foreach> </crim> En este caso, solo se pueden actualizar status != null && status != -1 en la lista a actualizar. Otros se actualizarán con los valores predeterminados, sin mantener los datos originales sin cambios. ¿Qué pasa si desea mantener los datos originales sin cambios? Es decir, actualizaciones que cumplen con las condiciones y aquellas que no cumplen con las condiciones permanecen sin cambios. Una forma simple de hacerlo es agregar otro <if>, porque no hay ... si ... de lo contrario ... sintaxis en mybatis, pero el mismo efecto se puede lograr a través de múltiples <if>, como sigue:
<TRIM prefix = "status = case" suffix = "end,"> <foreach Collection = "list" item = "item" index = "index"> <if test = "item.Status! = null y item.status! = -1"> when id = #{item.id} entonces #{item.status} </if> <if test = "item.status == o ítem. id =#{item.id} entonces myData_table.status // Estos son los datos originales </if> </ foreach> </tripl>La actualización general de lotes se escribe de la siguiente manera:
<update id = "updateBatch" parametertype = "java.util.list"> update myData_table <tripler prefix = "set" sufixoverrides = ","> <trim prefix = "status = case" sufix = "end,"> <foreach = "list" item = "item" Índice = "Índice"> <if test = "item.status! = null y null y ítem! id =#{item.id} entonces#{item.status} </if> <if test = "item.status == null o item.status == -1"> when id =#{item.id} entonces myData_table.status // data original </if> </boreach> </crim> </crim> where id en <foreach colección = "Índice" Índic "Ítem" separator = "," Open = "(" Close = ")"> #{item.id, jdbctype = bigint} </stideach> </update>Este método de base de datos de lotes y núcleo puede actualizar todos los datos en una conexión de base de datos, evitando la sobrecarga del establecimiento y la desconexión de la base de datos frecuentes, y mejorando enormemente la eficiencia de la actualización de datos. Sin embargo, el problema es que si se produce un error de actualización durante este proceso, será difícil saber qué datos están mal. Si se usa la propia garantía de transacción de los datos, una vez que ocurre un error, todas las actualizaciones se retirarán automáticamente. Y este método a menudo es más propenso a los errores. Por lo tanto, la solución habitual es hacer compromisos, es decir, actualizar parte de ella en lotes (la paginación se realiza, por ejemplo, hay un total de 1,000 datos y se actualizan 100 datos a la vez). Esto puede compartir la probabilidad de errores y es más fácil localizar el error.
Por supuesto, si la cantidad de datos es realmente grande, esta actualización por lotes también conducirá a actualizaciones ineficientes (por ejemplo, si se actualizan 100 elementos a la vez, entonces si se actualizan mil millones de datos, se requerirán 10 millones de veces para una actualización por lotes 10 millones de veces, y se establecerán 10 millones de bases de datos y se desconectarán, lo cual es inútil). En este momento, solo puede considerar otras soluciones, como introducir un mecanismo de almacenamiento en caché.
Resumir
Lo anterior es el Batch UpdateBatch introducido por el editor al usar UpdateBatch en MyBatis. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!