Adiciones, eliminaciones, modificaciones y funciones de MybatisPlus
1. Esquema de generación de ID únicos para sistemas distribuidos
La identificación única del sistema es un problema que encontramos a menudo al diseñar un sistema, y a menudo luchamos con este problema. Hay muchas formas de generar ID, que se adaptan a diferentes escenarios, necesidades y requisitos de desempeño. Por lo tanto, algunos sistemas más complejos tienen múltiples estrategias de generación de ID. El siguiente enlace es una introducción muy completa a la solución, resolvemos el problema de la unicidad de id de múltiples bases de datos
https://www.cnblogs.com/haoxinyue/p/5208136.html
2. Estrategia de incremento automático de clave principal de MP
2.1 ASSIGN_ID
La estrategia de clave primaria predeterminada de MyBatis-Plus es: ASSIGN_ID (usando el algoritmo de copo de nieve)
@TableId(type = IdType.ASSIGN_ID)
private String id;
2.2 Estrategia de autoincremento automático
(1) Es necesario establecer el incremento automático de la clave principal al crear la tabla de datos
(2) Configurar @TableId (escriba = IdType.AUTO en el campo de la entidad)
@TableId(type = IdType.AUTO)
private Long id;
Para afectar la configuración de todas las entidades, puede establecer la configuración de clave primaria global
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
2.3 Ver código fuente para otros tipos
/*
* Copyright (c) 2011-2020, hubin ([email protected]).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baomidou.mybatisplus.annotation;
import lombok.Getter;
/**
* <p>
* 生成ID类型枚举类
* </p>
*
* @author hubin
* @since 2015-11-10
*/
@Getter
public enum IdType {
/**
* 数据库ID自增
*/
AUTO(0),
/**
* 该类型为未设置主键类型
*/
NONE(1),
/**
* 用户输入ID
* 该类型可以通过自己注册自动填充插件进行填充
*/
INPUT(2),
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
/**
* 全局唯一ID (idWorker)
*/
ID_WORKER(3),
/**
* 全局唯一ID (UUID)
*/
UUID(4),
/**
* 字符串全局唯一ID (idWorker 的字符串表示)
*/
ID_WORKER_STR(5);
private int key;
IdType(int key) {
this.key = key;
}
}
3. Autocompletar
Descripción del requisito:
Algunos datos se encuentran a menudo en el proyecto y se completan de la misma manera cada vez, como la hora de creación del registro, la hora de actualización, etc. Podemos utilizar la función de autocompletar de MyBatis Plus para completar la asignación de estos campos.
3.1, modificación de la base de datos
En la tabla Usuario, agregue nuevos campos de tipo fecha y hora, hora de creación create_time y hora de modificación update_time
3.2 Modificación de clases de entidad
Necesitamos agregar anotaciones a las propiedades de javabean
El código como se muestra a continuación
package com.atguigu.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.util.Date;
/**
* @Author Kilig Zong
* @Date 2020/10/27 20:17
* @Version 1.0
*/
@Data
public class User {
//。。。。其他属性
@TableField(fill = FieldFill.INSERT)//实体上增加字段并添加自动填充注解,在创建的时候会创建这个时间
private Date createTime;//创建时间
@TableField(fill=FieldFill.INSERT_UPDATE)//实体上增加字段并添加自动填充注解,在创建和修改的时候会修改这个时间
private Date updateTime;//修改的时间
}
3.3 Implementar la interfaz del procesador de metaobjetos
Nota: No olvide agregar la anotación @Component
package com.atguigu.mybatisplus.handler;
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTme", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.setFieldValByName("updateTme", new Date(), metaObject);
}
}
3.4 prueba
Generamos un dato en la clase de prueba y luego lo modificamos nuevamente
4. Base de datos operativa segura para subprocesos
4.1, bloqueo optimista
** Escenario principal de la aplicación: ** Cuando desee actualizar un registro, espere que este registro no haya sido actualizado por otros, es decir, para lograr una actualización de datos segura para subprocesos.
Implementación de bloqueo optimista:
- Al buscar el registro, obtenga la versión actual
- Al actualizar, traiga esta versión
- Al realizar una actualización, establezca version = newVersion donde version = oldVersion
- Si la versión es incorrecta, la actualización falla.
(1) Agregue el campo de versión a la base de datos
ALTER TABLE `user` ADD COLUMN `version` INT
(2) Agregue el campo de versión a la clase de entidad
Y agregue la anotación @Version
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;//版本号,在我们修改数据库的时候需要对比
(3) Agregue el valor predeterminado de inserción de la versión a la interfaz del procesador de metaobjetos
@Override
public void insertFill(MetaObject metaObject) {
......
this.setFieldValByName("version", 1, metaObject);
}
(4) Registrar Bean en MpConfig
Crear clase de configuración
package com.atguigu.config;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author Kilig Zong
* @Date 2020/10/28 19:20
* @Version 1.0
*/
@Configuration
public class MyConfig {
/***
* @author Kilig Zong
* @date 2020/10/28 19:22
* @description 这个是乐观锁插件,当我们修改数据库的数据的时候,首先会查询数据的版本号,进行对比后再进行修改
* 如果修改成功的话也会修改我们的版本号,
* @param
* @return com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor
**/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
(5) El bloqueo optimista de prueba se puede modificar con éxito
Después de la prueba, analice la declaración sql impresa y agregue 1 al valor de la versión
//4.测试乐观锁
@Test
public void testOptimisticLocker() {
//a.添加一条有version的记录
//b.再根据用户id查询用户信息
User user = userMapper.selectById(1257493419485151233L);
user.setName("老zhang");
//c.更新用户信息
userMapper.updateById(user);
}
5. Operación de eliminación de la base de datos
5.1, eliminación lógica
- Eliminación física: la eliminación real, los datos correspondientes se eliminan de la base de datos y los datos eliminados no se pueden consultar posteriormente.
- Eliminación lógica: eliminación falsa, cambie el estado del campo en los datos correspondientes a "estado eliminado", y luego aún puede ver este registro de datos en la base de datos
(1) Agregue el campo eliminado a la base de datos
ALTER TABLE `user` ADD COLUMN `deleted` boolean
(2) Agregue el campo eliminado a la clase de entidad
Y agregue la anotación @TableLogic y la anotación @TableField (fill = FieldFill.INSERT)
@TableLogic//逻辑删除
@TableField(fill = FieldFill.INSERT)
private Integer deleted;//逻辑删除状态码
(3) Agregue el valor predeterminado de inserción eliminado a la interfaz del controlador de metaobjetos
@Override
public void insertFill(MetaObject metaObject) {
......
this.setFieldValByName("deleted", 0, metaObject);
}
(4) Configuración de unión de Application.properties
Este es el valor predeterminado, si su valor predeterminado es el mismo que el mp predeterminado, esta configuración no es necesaria
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
(5) Registrar Bean en MyConfig
/***
* @author Kilig Zong
* @date 2020/10/28 19:38
* @description 这个是逻辑删除的插件,在我们删除的时候会修改数据库的逻辑删除的状态码,本质上逻辑删除是update
* @param
* @return com.baomidou.mybatisplus.core.injector.ISqlInjector
**/
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
(6) Borrado de lógica de prueba
-
Después de la prueba, se encontró que los datos no se eliminaron y el valor del campo eliminado cambió de 0 a 1.
-
Analice la declaración sql impresa después de la prueba, es una actualización
-
** Nota: ** El valor del campo eliminado de los datos eliminados debe ser 0 antes de que pueda seleccionarse para la eliminación lógica
@Test public void testDeleteUser() { int result = userMapper.deleteById(1257499997827362817L); System.out.println(result); }
(7) Consulta después de probar la eliminación lógica
La operación de consulta en MyBatis Plus también agregará automáticamente el juicio del campo de eliminación lógica
/** * 测试 逻辑删除后的查询: * 不包括被逻辑删除的记录 */ @Test public void testLogicDeleteSelect() { User user = new User(); List<User> users = userMapper.selectList(null); users.forEach(System.out::println); }
Analice la declaración SQL impresa después de la prueba, incluido DONDE eliminado = 0
SELECCIONE ID, nombre, edad, correo electrónico, create_time, update_time, eliminado DEL usuario DONDE eliminado = 0
6. Consulta de paginación
6.1, complemento de paginación
MyBatis Plus viene con un complemento de búsqueda, y la función de búsqueda se puede realizar con una configuración simple
** (1) ** Agregar complemento de paginación
Agregue la configuración de @Bean a la clase de configuración
/***
* @author Kilig Zong
* @date 2020/10/28 20:18
* @description 这个是我们的分页工具,分页插件
* @param
* @return com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor
**/
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
(2) Probar paginación selectPage
** Prueba: ** Finalmente obtenga datos relevantes a través del objeto de la página
@Test
public void testPageQuery() {
//a.2代表第二页 b.3代表每页大小
Page<User> userPage = new Page<>(3, 3);
//a.分页包装类 b.查询分页条件
userMapper.selectPage(userPage, null);
long total = userPage.getTotal();
System.out.println(total);
List<User> userList = userPage.getRecords();
for (User user : userList) {
System.out.println(user);
}
}
7. Otras consultas
7.1 consulta de mapa
@Test
public void testQueryMap(){
HashMap<String, Object> mapParam = new HashMap<>();
mapParam.put("name","老zhang");
List<User> userList = userMapper.selectByMap(mapParam);
for (User user : userList) {
System.out.println(user);
}
7.2 consulta de contenedor
@Test
public void testQueryWrapper(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("email","baomidou.com");
wrapper.orderByDesc("age");
List<User> userList = userMapper.selectList(wrapper);
for (User user : userList) {
System.out.println(user);
}
}
Continuará