Estrategia de generación de claves primarias MyBatis-Plus
Continuación del blog anterior: Comience rápidamente con el desarrollo de MyBatis-Plus
Ejecute la operación Insertar en la clase de prueba para insertar registros en la tabla de datos:
//测试插入操作
@Test
public void testInsert(){
User user = new User();
user.setName("Cloud");
user.setAge(3);
user.setEmail("[email protected]"); //MP自动生成id
int res = userMapper.insert(user);
System.out.println(res); //受影响的行数
System.out.println(user);
}
A través del registro impreso en la consola, se encuentra que MyBatis-Plus asigna user
automáticamente la id
propiedad del objeto, y la asignación utiliza el algoritmo de copo de nieve;
@TableId
: establezca la asignación de clave principal, value
asigne el nombre del campo de clave principal y type
establezca el tipo de clave principal, es decir, la estrategia de generación de clave principal. por ejemplo:@TableId(value = "id", type = IdType.AUTO)
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.Auto)
private Long id;
private String name;
private Integer age;
private String email;
}
IdType
Es una clase de enumeración, existen principalmente 4 tipos diferentes de valores (AUTO, NONE, INPUT, ASSIGN_ID y ASSIGN_UUID), el código fuente es el siguiente:
public enum IdType {
AUTO(0),
NONE(1),
INPUT(2),
ASSIGN_ID(3),
ASSIGN_UUID(4),
//下面的表示已经弃用了,并以上面几种代替
/** @deprecated */
@Deprecated
ID_WORKER(3),
/** @deprecated */
@Deprecated
ID_WORKER_STR(3),
/** @deprecated */
@Deprecated
UUID(4);
}
valor | describir |
---|---|
AUTO | Incremento automático del campo de clave principal |
NINGUNA | Clave principal no establecida |
APORTE | Requiere que los desarrolladores asignen valores manualmente |
ASSIGN_ID | ID de asignación de MP, número/tipo de cadena |
ASSIGN_UUID | MP asigna UUIN, tipo de cadena |
1. AUTO: El campo de clave principal se incrementa automáticamente
① Anotación del campo de clave principal de la clase de entidad @TableId(type = IdType.AUTO)
;
② Los campos correspondientes a la tabla de datos también deben configurarse para que se incrementen automáticamente;
Si solo se agregan anotaciones, pero el campo de clave principal correspondiente a la tabla de datos no está configurado para incrementarse automáticamente, se producirá la siguiente excepción.
Nota: cuando utilice type = IdType.AUTO
anotaciones , asegúrese de establecer el campo de clave principal correspondiente en [Aumento automático].
2. NINGUNO: la clave principal no está configurada
Dado que cada tabla de datos tiene una clave principal, casi no es necesario agregar esta anotación.
3. ENTRADA: requiere que los desarrolladores asignen valores manualmente
ENTRADA Si el desarrollador no establece el valor manualmente, la base de datos asigna la clave principal configurando el método de incremento automático ( MP no interviene en la generación de la clave principal ). De manera similar, si la base de datos no establece el incremento automático, un se lanzará una excepción ; si el desarrollador asigna manualmente el valor, entonces almacene directamente este valor.
Puede ver user
que la clave principal del objeto es el id
valor null
, pero el objeto se insertó correctamente en la base de datos porque la base de datos establece la política de incremento automático de la clave principal.
Una cosa a tener en cuenta: @TableId=(type = IdType.INPUT )
MyBatis-Plus no interfiere con la generación de claves primarias bajo la anotación.
4. ASSIGN_ID: MyBatis-Plus asigna automáticamente
ASSIGN_ID Si el usuario o desarrollador no asigna la clave principal, MyBatis-Plus utiliza el algoritmo de copo de nieve (también conocido como algoritmo de copo de nieve) para asignar un ID al campo de la clave principal, este ID puede ser de tipo Número (Largo) o Cadena escribe.
Algoritmo Snowflake : Snowflake es el algoritmo de generación de ID distribuido de código abierto de Twitter y el resultado es un ID largo. La idea central es: usar 41 bits como el número de milisegundos, 10 bits como la ID de la máquina (5 bits son el centro de datos, 5 bits son la ID de la máquina) y 12 bits como el número de serie en milisegundos (lo que significa que cada nodo puede generar 4096 IDs) y un bit de signo al final, que siempre es 0. Garantizado para ser casi el único en el mundo!
Si no @TableId
anota , el valor predeterminado es @TableId=(type = IdType.ID_WORKER)
, ya que este elemento de enumeración ha quedado obsoleto y se usa ASSIGN_ID
en su lugar . Si el usuario no asigna la clave principal en este momento, MP se asignará automáticamente y no es necesario que el campo de clave principal de la base de datos esté configurado para incrementarse automáticamente en este momento.
5. ASSIGN_UUID: MyBatis-Plus asigna UUID, que debe ser de tipo String
El uso de ASSIGN_UUID es similar a ASSIGN_ID, que puede representar una ID única más larga, pero el tipo de datos de su clave principal debe ser String, y MyBatis-Plus genera automáticamente UUID para la asignación;
6. Resumen
Dado que el campo de clave principal de la tabla de datos no puede estar vacío, las reglas generales de la estrategia de generación de clave principal son las siguientes:
Si el usuario o desarrollador asigna la clave principal, el valor se almacena directamente; si el usuario no asigna la clave principal, el MP (abreviatura de MyBatis-Plus) asigna la clave principal; si ni el usuario ni el MP asignan un valor a la clave principal, entonces El autoincremento de la clave principal lo establece la tabla de datos de la base de datos para completar la operación de asignación; si ni el usuario, MyBatis-Plus ni la base de datos asignan la clave principal, el programa lanzará una excepción .