• MyBatisPlus-常用注解


    一、@TableName

    映射数据库的表名

    package com.md.entity;
    
    import com.baomidou.mybatisplus.annotation.*;
    import com.md.enums.StatusEnum;
    import lombok.Data;
    
    import java.util.Date;
    
    /**
     * @author md
     * @Desc
     * @date 2020/10/26 15:38
     */
    
    @Data
    @TableName(value = "student")
    public class Student {
        private Integer id;
        private String name;
        private Integer age;
    }
    

    二、@TableId

    设置主键映射,value 映射主键字段名

    type 设置主键类型,主键的生成策略

    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);
    
    描述
    AUTO 数据库自增
    NONE MP set 主键,雪花算法实现
    INPUT 需要开发者手动赋值
    ASSIGN_ID MP 分配 ID,Long、Integer、String
    ASSIGN_UUID 分配 UUID,Strinig

    INPUT 如果开发者没有手动赋值,则数据库通过自增的方式给主键赋值,如果开发者手动赋值,则存入该值。

    AUTO 默认就是数据库自增,开发者无需赋值。

    ASSIGN_ID MP 自动赋值,雪花算法。

    ASSIGN_UUID 主键的数据类型必须是 String,自动生成 UUID 进行赋值

    	// 自己赋值
        //@TableId(type = IdType.INPUT)
        // 默认使用的雪花算法,长度比较长,所以使用Long类型,不用自己赋值
        @TableId
        private Long id;
    

    测试

    @Test
        void save(){
            // 由于id加的有注解,这里就不用赋值了
            Student student = new Student();
            student.setName("天明");
            student.setAge(18);
            mapper.insert(student);
        }
    

    三、@TableField

    映射非主键字段,value 映射字段名

    exist 表示是否为数据库字段 false,如果实体类中的成员变量在数据库中没有对应的字段,则可以使用 exist,VO、DTO

    select 表示是否查询该字段

    fill 表示是否自动填充,将对象存入数据库的时候,由 MyBatis Plus 自动给某些字段赋值,create_time、update_time

    自动填充

    1、给表添加 create_time、update_time 字段

    2、实体类中添加成员变量

    package com.md.entity;
    
    import com.baomidou.mybatisplus.annotation.*;
    import com.md.enums.StatusEnum;
    import lombok.Data;
    import java.util.Date;
    
    @Data
    @TableName(value = "student")
    public class Student {
        @TableId
        private Long id;
    
        // 当该字段名称与数据库名字不一致
        @TableField(value = "name")
        private String name;
    
        // 不查询该字段
        @TableField(select = false)
        private Integer age;
    
        // 当数据库中没有该字段,就忽略
        @TableField(exist = false)
        private String gender;
    
        // 第一次添加填充
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
    
        // 第一次添加的时候填充,但之后每次更新也会进行填充
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date updateTime;
    
    }
    
    

    3、创建自动填充处理器

    注意:不要忘记添加 @Component 注解

    package com.md.handler;
    
    import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
    import org.apache.ibatis.reflection.MetaObject;
    import org.springframework.stereotype.Component;
    
    import java.util.Date;
    
    /**
     * @author md
     * @Desc 对实体类中使用的自动填充注解进行编写
     * @date 2020/10/26 17:29
     */
    // 加入注解才能生效
    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
    
    
        @Override
        public void insertFill(MetaObject metaObject) {
            this.setFieldValByName("createTime", new Date(), metaObject);
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    }
    
    

    4、测试

    @Test
        void save(){
            // 由于id加的有注解,这里就不用赋值了
            Student student = new Student();
            student.setName("韩立");
            student.setAge(11);
            // 时间自动填充
            mapper.insert(student);
        }
    

    5、更新

    当该字段发生变化的时候时间会自动更新

    @Test
        void update(){
            Student student = mapper.selectById(1001);
            student.setName("韩信");
            mapper.updateById(student);
        }
    

    四、@Version

    乐观锁

    标记乐观锁,通过 version 字段来保证数据的安全性,当修改数据的时候,会以 version 作为条件,当条件成立的时候才会修改成功。

    version = 2

    线程 1:update ... set version = 2 where version = 1

    线程2 :update ... set version = 2 where version = 1

    1、数据库表添加 version 字段,默认值为 1

    2、实体类添加 version 成员变量,并且添加 @Version

    package com.md.entity;
    
    import com.baomidou.mybatisplus.annotation.*;
    import com.md.enums.StatusEnum;
    import lombok.Data;
    import java.util.Date;
    
    @Data
    @TableName(value = "student")
    public class Student {
        @TableId
        private Long id;
        @TableField(value = "name")
        private String name;
        @TableField(select = false)
        private Integer age;
        @TableField(exist = false)
        private String gender;
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date updateTime;
        
        @Version
        private Integer version; //版本号
      
    }
    

    3、注册配置类

    在 MybatisPlusConfig 中注册 Bean

    package com.md.config;
    
    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 md
     * @Desc
     * @date 2020/10/26 20:42
     */
    @Configuration
    public class MyBatisPlusConfig {
    
        /**
        * 乐观锁
        */
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor(){
            return new OptimisticLockerInterceptor();
        }
    }
    
    

    五、@EnumValue

    1、通用枚举类注解,将数据库字段映射成实体类的枚举类型成员变量

    package com.southwind.mybatisplus.enums;
    
    import com.baomidou.mybatisplus.annotation.EnumValue;
    
    public enum StatusEnum {
        WORK(1,"上班"),
        REST(0,"休息");
    
        StatusEnum(Integer code, String msg) {
            this.code = code;
            this.msg = msg;
        }
    
        @EnumValue
        private Integer code;
        private String msg;
    }
    
    package com.md.entity;
    
    import com.baomidou.mybatisplus.annotation.*;
    import com.md.enums.StatusEnum;
    import lombok.Data;
    import java.util.Date;
    
    @Data
    @TableName(value = "student")
    public class Student {
        @TableId
        private Long id;
        @TableField(value = "name")
        private String name;
        @TableField(select = false)
        private Integer age;
        @TableField(exist = false)
        private String gender;
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date updateTime;
        @Version
        private Integer version;
      
        
        private StatusEnum status;
    }
    

    数据库中新增一个status字段,

    2、在主配置文件中

    # 枚举包扫描
    mybatis-plus.type-enums-package=com.md.enums
    

    六、@TableLogic

    映射逻辑删除,并不是真正的删除

    1、数据表添加 deleted 字段,默认是0

    2、实体类添加注解

    package com.md.entity;
    
    import com.baomidou.mybatisplus.annotation.*;
    import com.md.enums.StatusEnum;
    import lombok.Data;
    import java.util.Date;
    
    @Data
    @TableName(value = "student")
    public class Student {
        @TableId
        private Long id;
        @TableField(value = "name")
        private String name;
        @TableField(select = false)
        private Integer age;
        @TableField(exist = false)
        private String gender;
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date updateTime;
        @Version
        private Integer version;
        private StatusEnum status;
    
        @TableLogic
        private Integer deleted;
    }
    

    3、主配置文件中添加配置

    # 没有删除为0,删除了为1
    mybatis-plus.global-config.db-config.logic-not-delete-value=0
    mybatis-plus.global-config.db-config.logic-delete-value=1
    

    4、在 MybatisPlusConfig 中注册 Bean

    配置类

    @Configuration
    public class MyBatisPlusConfig {
    
        /**
        * 乐观锁
        */
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor(){
            return new OptimisticLockerInterceptor();
        }
        
        /**
        * 逻辑删除
        */
        @Bean
    	public ISqlInjector sqlInjector() {
    		return new LogicSqlInjector();
    	}
    }
    
    

    删除的时候不是真正的删除数据库表中的数据,而是改变delete字段的值,当然了查询的时候也是查询delete=0,这都是框架自动实现的

  • 相关阅读:
    ansible源码解读
    python标准模块(下)
    python学习之算法、自定义模块、系统标准模块(上)
    pathon 基础学习-集合(set),单双队列,深浅copy,内置函数
    python的map,filter,reduce学习
    python 列表
    python生成器、装饰器、正则
    python 模块学习
    python基础学习(一)--数据类型
    时间复杂度的计算
  • 原文地址:https://www.cnblogs.com/mengd/p/14161402.html
Copyright © 2020-2023  润新知