Tabla de contenido
Introducción a la estrategia de generación de claves primarias
Introducción a la estrategia de generación de claves primarias
El papel de la clave principal es identificar de forma única, y podemos usar esta identificación única para localizar este dato. Por supuesto, para la clave principal en los datos de la tabla, podemos diseñar las reglas de generación nosotros mismos para generar la clave principal. Pero en más escenarios, si no hay requisitos especiales, es problemático para nosotros generar manualmente cada vez.Podemos usar el marco para proporcionar una buena estrategia de generación de clave principal para generar la clave principal. Esto es más conveniente y rápido.
Se proporciona una anotación en MybatisPlus, que es @TableId, que proporciona varias estrategias de generación de claves principales. Podemos usar esta anotación para especificar la estrategia de generación de claves principales para nuevos datos. Luego, cuando se agreguen nuevos datos en el futuro, los datos generarán la clave principal correspondiente de acuerdo con la estrategia de generación de clave principal que especificamos.
@TableName("sys_user")
public class User {
@TableId
private Long id;
private String name;
private Integer age;
private String email;
}
Atributos | tipo | debe especificar | valores predeterminados | describir |
---|---|---|---|---|
valor | Cadena | No | "" | nombre de campo de clave principal |
tipo | enumeración | No | IdType.NONE | Especificar el tipo de clave principal |
El tipo de tipo es el siguiente
valor | describir |
---|---|
AUTO | Incremento automático de ID de base de datos |
NINGUNO | Sin estado, este tipo es el tipo que no tiene una clave principal establecida (en la anotación, es igual a seguir el global, y el Rio global es igual a INPUT) |
APORTE | Establecer el valor de la clave principal antes de insertar |
ASSIGN_ID | Asignar ID (el tipo de clave principal es Número (largo y entero) o Cadena) (desde 3.3.0), usar el IdentifierGenerator método de interfaz nextId (la clase de implementación predeterminada es DefaultIdentifierGenerator el algoritmo de copo de nieve) |
ASSIGN_UUID | Asigne UUID, el tipo de clave principal es Cadena (desde 3.3.0), use IdentifierGenerator el método de interfaz nextUUID (método predeterminado predeterminado) |
Tipo de número entero largo de ID único global distribuido (utilice ASSIGN_ID ) |
|
Cadena UUID de 32 bits (utilice ASSIGN_UUID ) |
|
Tipo de cadena de ID única distribuida globalmente (utilice ASSIGN_ID ) |
estrategia AUTO
Esta estrategia sigue la estrategia de incremento de clave principal de la tabla de la base de datos, siempre que la clave principal de la tabla de la base de datos esté configurada para incrementar automáticamente
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
@Test
void primaryKey(){
User user = new User();
user.setName("Mary");
user.setAge(35);
user.setEmail("[email protected]");
userMapper.insert(user);
}
estrategia de entrada
Esta estrategia indica que debemos insertar manualmente el id, de lo contrario no se pueden agregar los datos
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.INPUT)
private Long id;
private String name;
private Integer age;
private String email;
}
Si omitimos la identificación aquí, encontraremos que los datos no se pueden insertar
@Test
void primaryKey(){
User user = new User();
user.setName("Jerry");
user.setAge(38);
user.setEmail("[email protected]");
userMapper.insert(user);
}
Pero especificamos la identificación nosotros mismos y descubrimos que se puede agregar con éxito
Estrategia ASSIGN_ID
Pensemos en ello, ¿qué tiene de malo el método de incremento automático como antes?
Si tenemos una gran cantidad de datos en una tabla en el futuro, debemos dividir la tabla.
Hay dos estrategias comunes de división de tablas
【1】División horizontal
La división horizontal consiste en dividir una tabla grande según la cantidad de datos
【2】División vertical
La división vertical es dividir una tabla grande por campo
De hecho, tenemos tres requisitos para los datos divididos, como la división horizontal:
[1] La clave principal de la tabla anterior está en orden y sigue en orden después de la división
[2] Aunque la tabla se ha dividido, cada dato debe garantizar la unicidad de la clave principal
[3] Es mejor no exponer directamente la cantidad de datos en la clave principal, para que el mundo exterior pueda conocer fácilmente la información clave.
Entonces tiene que haber un algoritmo que pueda cumplir con estos tres requisitos.Este algoritmo es el algoritmo del copo de nieve.
El algoritmo de copo de nieve se compone de un binario de 64 bits, que en última instancia es un valor de tipo Long. Principalmente dividido en cuatro partes de almacenamiento
[1] Bit de signo de 1 bit, el valor fijo es 0
[2] marca de tiempo de 41 bits
[3] Código de máquina de 10 dígitos, incluida la identificación de máquina de 5 dígitos y la identificación de servicio de 5 dígitos
【4】Número de serie de 12 dígitos
Utilice el algoritmo del copo de nieve para lograr números únicos y ordenados que no expongan directamente la ordenación.
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String name;
private Integer age;
private String email;
}
NINGUNA estrategia
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.NONE)
private Long id;
private String name;
private Integer age;
private String email;
}
La estrategia NINGUNA significa que la estrategia de generación de clave principal no está especificada. Cuando no especificamos la estrategia de generación de clave principal o la estrategia de clave principal es NINGUNA, sigue la estrategia global. El tipo de identificación en la configuración global se usa para configurar la estrategia de generación de clave principal Podemos echar un vistazo Valor predeterminado para tipo de identificación
Al ver el código fuente, se encuentra que el valor predeterminado de id-type es el algoritmo de copo de nieve
ASSIGN_UUID estrategia
UUID ( Universally Unique Identifier ) es un identificador único a nivel mundial, definido como una clave primaria de cadena, compuesta por 32 dígitos, codificada en hexadecimal , y define la información del sistema que es completamente única en el tiempo y el espacio.
Reglas de codificación para UUID:
[1] 1 ~ 8 dígitos adoptan la hora del sistema, y la hora del sistema tiene una precisión de milisegundos para garantizar la singularidad de la hora;
[2] 9~16 dígitos utilizan la dirección IP subyacente, que es única en el clúster de servidores;
[3] Los 17~24 bits adoptan el valor HashCode del objeto actual, que es único en un objeto interno;
[4] Los 25~32 dígitos utilizan un número aleatorio para llamar al método, que es único en el nivel de milisegundos dentro de un objeto.
La singularidad se puede garantizar a través de las cuatro estrategias anteriores . Cuando se necesitan números aleatorios en el sistema, se puede considerar el algoritmo UUID .
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.ASSIGN_UUID)
private String id;
private String name;
private Integer age;
private String email;
}