MyBatisPlus-经常使用注解

1、@TableName

映射数据库的表名java

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;
}

2、@TableId

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

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

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 若是开发者没有手动赋值,则数据库经过自增的方式给主键赋值,若是开发者手动赋值,则存入该值。sql

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

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

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

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

测试mybatis

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

3、@TableField

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

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

select 表示是否查询该字段

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

自动填充

一、给表添加 create_time、update_time 字段

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

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;

}

三、建立自动填充处理器

注意:不要忘记添加 @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);
    }
}

四、测试

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

五、更新

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

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

4、@Version

乐观锁

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

version = 2

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

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

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

二、实体类添加 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; //版本号
  
}

三、注册配置类

在 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();
    }
}

5、@EnumValue

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

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字段,

二、在主配置文件中

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

6、@TableLogic

映射逻辑删除,并非真正的删除

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

二、实体类添加注解

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;
}

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

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

四、在 MybatisPlusConfig 中注册 Bean

配置类

@Configuration
public class MyBatisPlusConfig {

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

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

相关文章
相关标签/搜索