[Aplicación técnica] Escenarios donde el valor de retorno de las operaciones de la base de datos mybatis (insertar, actualizar, eliminar) es 0

I. Introducción

Recientemente, al revisar el código de los miembros del equipo del proyecto, descubrí que hay muchas mybatisoperaciones de base de datos ( insert、update、delete) en 返回值el código sin ningún procesamiento. En algunos escenarios comerciales, puede haber errores potenciales que generen datos basura o causen inconsistencia en los datos. Así que hoy especialmente en conclusión;

Vale la pena comprender el regreso de Mybatis a la operación de la base de datos:
insert ** Inserte n registros y devuelva el número de filas afectadas n. ( n>=1Cuando n es 0, la inserción real falla)
update: actualiza n registros y devuelve el número de filas afectadas n. ( n>=0)
delete: Elimina n registros y devuelve el número de filas afectadas n. ( n>=0)

Es más fácil para nosotros entender la situación cuando el valor de retorno n>0, pero en qué escenario cuando mybatis opera (insert、update、deletela base de datos, el valor de retorno n =0 es el objetivo principal de nuestro resumen de hoy ;

2. Manejo de excepciones de la base de datos

A menudo nos encontramos con situaciones anormales al operar la base de datos. Podemos detectar directamente la excepción al 操作数据库conectarnos a conn . En este caso, no hay valor de retorno. Podemos realizar directamente la reversión de la transacción u otro procesamiento en la excepción capturada. No hay gran objeción. aquí;抛出的异常try{}catch(){}

Cuando escribimos un procedimiento almacenado, pueden ocurrir algunas de las siguientes situaciones:

  • Los datos insertados violan la restricción única, lo que provoca que la inserción falle.
  • La inserción o actualización de datos excede la longitud máxima del campo, lo que provoca que la operación falle.
  • El número de filas afectadas por la actualización no coincide con el resultado esperado

Cuando nos encontramos con las diversas excepciones anteriores, es posible que necesitemos capturarlas y luego es posible que debamos revertir la transacción actual.

3. El valor de retorno de la operación de inserción es: 0

En mybatis, es raro que el valor de retorno de la operación de inserción sea 0. La mayoría de las fallas de operación se producen en forma de excepciones, que podemos capturar mediante try{}catch(){};

Para la inserción, introducimos principalmente varios 返回值comandos de operación que pueden devolver 0 u otras operaciones, que también son más propensas a errores.

1、insertar ignorar en

soporte mysql insert ignore into.
insertar en significa insertar datos, la base de datos verificará la clave principal (PrimaryKey) y se informará un error si hay un duplicado,
insert ignoresignifica que si el mismo registro ya existe, los nuevos datos actuales se ignorarán;

1) ejemplo de SQL:

INSERT IGNORE INTO tbl_user(id,NAME,age,pass_time)VALUES(9,'哈哈哈',18,11111111);

Resultados de:

1 queries executed, 1 success, 0 errors, 1 warnings

查询:INSERT IGNORE INTO tbl_user(id,NAME,age,pass_time)VALUES(9,'哈哈哈',18,11111111)0 行受到影响, 1 个警告

执行耗时   : 0.001 sec
传送时间   : 0.001 sec
总耗时      : 0.002 sec

2) ejemplo de mybatis:

método del mapeador:

@Insert(value = "INSERT IGNORE INTO tbl_user (id,name,age,pass_time) VALUES (${user.id},'${user.name}',${user.age},${user.pass_time})")
Integer add(@Param(value = "user") User user);

Clase de servicio:

@Override
public Integer add(User user) {
    
    
  Integer insert = userMapper.add(user);
  System.out.println("insert 执行结果: "+insert);
  return insert;
}

Solicitud:
id=9 los datos ya existen en la tabla de la base de datos tbl_user
Insertar descripción de la imagen aquí

Resultados de:

2022-12-15 19:45:17.972  INFO 14868 --- [nio-8079-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms
insert 执行结果: 0

2、reemplazar en

replace intoIndica insertar y reemplazar datos. Hay una clave primaria en la tabla de demanda, o unique索引si los datos ya existen en la base de datos, reemplazarlos con datos nuevos (primero elimine los datos antiguos, luego inserte los datos nuevos). Si no hay datos, el efecto es el mismo que insert into;

replaceLa declaración devuelve un número que indica el número de filas afectadas;

  • Si los datos ya existen, el número devuelto es: el número de filas de datos modificados + el número de filas de datos de ejecución;
  • Si los datos no existen, el número de retorno es: el número de filas de datos de ejecución;

El valor de retorno de la ejecución de la base de datos mysql es el valor de retorno de la operación mybatis. Por conveniencia, a continuación operaremos en la base de datos;

1) reemplazar en el ejemplo:

REPLACE INTO tbl_user(id,NAME,age,pass_time)VALUES(10,'小四',10,10000000000);
REPLACE INTO tbl_user(id,NAME,age,pass_time)VALUES(10,'小四',10,100000001000);

Resultados de:

2 queries executed, 2 success, 0 errors, 0 warnings

查询:replace into tbl_user(id,name,age,pass_time)values(10,'小四',10,10000000000)1 行受到影响

执行耗时   : 0.026 sec
传送时间   : 0 sec
总耗时      : 0.026 sec
-----------------------------------------------------------

查询:REPLACE INTO tbl_user(id,NAME,age,pass_time)VALUES(10,'小四',10,100000001000)2 行受到影响

执行耗时   : 0.042 sec
传送时间   : 0 sec
总耗时      : 0.042 sec

2) ejemplo de mybatis:

@Override
    public Integer test() {
    
    
        User user = new User();
        user.setId(10);
        user.setName("小四");
        user.setAge(10);
        user.setPass_time(10000000002L);
        Integer insert = userMapper.add2(user);
        System.out.println("insert 执行结果: "+insert);
        return insert;
    }

Resultados de:

2022-12-15 20:54:08.698  INFO 17236 --- [  restartedMain] com.alibaba.druid.pool.DruidDataSource   : {
    
    dataSource-1} inited
insert 执行结果: 2

3、en actualización de clave duplicada

Concepto : INSERT ... ON DUPLICATE KEY UPDATESe utiliza para resolver problemas repetitivos. Primero determine si el registro existe, actualícelo si existe e insértelo si no existe. Entonces la atención se centra en determinar si el registro existe.
El criterio es que si el registro insertado da como resultado un índice único o una duplicación de clave primaria, se considera que el registro existe.

Se puede distinguir si la declaración realmente realiza una inserción o una actualización en función del número de filas afectadas:

  • El número de filas afectadas es 1, lo que indica que la fila se inserta como un registro nuevo;
  • El número de filas afectadas es 2, lo que indica que las filas están duplicadas y los registros originales están actualizados;
  • El número de filas afectadas es 0, lo que indica que los datos actualizados son los mismos que los datos originales y en realidad no se han actualizado.

1) ejemplo de SQL:

INSERT INTO tbl_user(id,NAME,age,pass_time)VALUES(12,'小六',10,10000000000) ON DUPLICATE KEY UPDATE NAME=VALUES(NAME),age=VALUES(age),pass_time=VALUES(pass_time);
INSERT INTO tbl_user(id,NAME,age,pass_time)VALUES(12,'小六',11,10000000000) ON DUPLICATE KEY UPDATE NAME=VALUES(NAME),age=VALUES(age),pass_time=VALUES(pass_time);
INSERT INTO tbl_user(id,NAME,age,pass_time)VALUES(12,'小六',11,10000000000) ON DUPLICATE KEY UPDATE NAME=VALUES(NAME),age=VALUES(age),pass_time=VALUES(pass_time);

Resultados de:

3 queries executed, 3 success, 0 errors, 3 warnings

查询:INSERt INTO tbl_user(id,NAME,age,pass_time)VALUES(12,'小六',10,10000000000) on duplicate key update NAME=VALUES(NAME),age=VALU...1 行受到影响, 3 个警告

执行耗时   : 0.057 sec
传送时间   : 0.001 sec
总耗时      : 0.058 sec

注意:要查看所有警告的完整列表,请启用 工具 -> 首选项 -> 常规 -> 在信息选项卡下显示警告
-----------------------------------------------------------

查询:INSERT INTO tbl_user(id,NAME,age,pass_time)VALUES(12,'小六',11,10000000000) ON DUPLICATE KEY UPDATE NAME=VALUES(NAME),age=VALU...2 行受到影响, 3 个警告

执行耗时   : 0.063 sec
传送时间   : 0 sec
总耗时      : 0.063 sec

注意:要查看所有警告的完整列表,请启用 工具 -> 首选项 -> 常规 -> 在信息选项卡下显示警告
-----------------------------------------------------------

查询:INSERT INTO tbl_user(id,NAME,age,pass_time)VALUES(12,'小六',11,10000000000) ON DUPLICATE KEY UPDATE NAME=VALUES(NAME),age=VALU...0 行受到影响, 3 个警告

执行耗时   : 0.001 sec
传送时间   : 0 sec
总耗时      : 0.001 sec

注意:要查看所有警告的完整列表,请启用 工具 -> 首选项 -> 常规 -> 在信息选项卡下显示警告

2) ejemplo de mybatis:

@Override
    public Integer test() {
    
    

        //  12,'小六',11,10000000000

        User user = new User();
        user.setId(15);
        user.setName("小六");
        user.setAge(11);
        user.setPass_time(10000000010L);
        Integer insert = userMapper.add3(user);
        System.out.println("insert 执行结果: "+insert);
        return insert;
    }

Resultados de:

2022-12-15 21:01:41.720  INFO 12340 --- [  restartedMain] com.alibaba.druid.pool.DruidDataSource   : {
    
    dataSource-1} inited
insert 执行结果: 1

Nota: Cuando los datos de inserción no han cambiado, el número de filas afectadas devueltas por la ejecución en el cliente mysql es 0, pero el valor de retorno cuando se ejecuta en mybatis es 1. El motivo aquí queda por analizar;

4. El valor de retorno de la operación de actualización es: 0

updateUna situación común en la que el valor de retorno de la operación es 0 es: al actualizar datos en la tabla de la base de datos según la clave principal, si no hay datos con id=13 en la tabla de la base de datos tbl_user, el número de filas afectadas devueltas: 0

1) ejemplo de SQL:

UPDATE tbl_user SET NAME='小七' , age=18, pass_time=10000000000 WHERE ID=13

Resultados de:

<n>查询:UPDATE tbl_user SET name='小七' , age=18, pass_time=10000000000 WHERE ID=130 行受到影响

执行耗时   : 0.001 sec
传送时间   : 0 sec
总耗时      : 0.001 sec

2) ejemplo de mybatis:

@Override
    public Integer test() {
    
    

        //  12,'小六',11,10000000000

        User user = new User();
        user.setId(13);
        user.setName("小七");
        user.setAge(18);
        user.setPass_time(10000000010L);
        Integer insert = userMapper.update(user);
        System.out.println("insert 执行结果: "+insert);
        return insert;
    }

Resultados de:

2022-12-15 21:04:41.245  INFO 7896 --- [  restartedMain] com.alibaba.druid.pool.DruidDataSource   : {
    
    dataSource-1} inited
insert 执行结果: 0

5. El valor de retorno de la operación de eliminación es: 0

deleteUna situación común en la que el valor de retorno de la operación es 0 es: al eliminar datos en una tabla de base de datos según un determinado atributo (por ejemplo, id=13), si no hay datos con id=13 en la tabla de base de datos tbl_user, el número de filas afectadas devueltas: 0

1) ejemplo de SQL:

DELETE FROM tbl_user WHERE ID = 13;

Resultados de:

1 queries executed, 1 success, 0 errors, 0 warnings

查询:DELETE FROM tbl_user WHERE ID = 130 行受到影响

执行耗时   : 0.001 sec
传送时间   : 0.001 sec
总耗时      : 0.002 sec

2) ejemplo de mybatis:

@Override
    public Integer test() {
    
    

        //  12,'小六',11,10000000000

        /*User user = new User();
        user.setId(13);
        user.setName("小七");
        user.setAge(18);
        user.setPass_time(10000000010L);*/
        Integer delete = userMapper.delete(13);
        System.out.println("insert 执行结果: "+delete);
        return delete;
    }

Resultados de:

2022-12-15 21:06:17.742  INFO 12644 --- [  restartedMain] com.alibaba.druid.pool.DruidDataSource   : {
    
    dataSource-1} inited
insert 执行结果: 0

6. Resumen

Cuando se utiliza mybatis para operar la base de datos , el valor de retorno debe combinarse con diferentes escenarios de uso para el procesamiento comercial para evitar posibles errores y también reflejar la estandarización del código.

Supongo que te gusta

Origin blog.csdn.net/weixin_37598243/article/details/128334546
Recomendado
Clasificación