Adiciones, eliminaciones, modificaciones y funciones de MybatisPlus

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á

Supongo que te gusta

Origin blog.csdn.net/kiligggggggg/article/details/109349585
Recomendado
Clasificación