MyBatis-Plus(二、常用注解)


1、@TableName

@TableName

用法:映射数据库的表名,如果数据库表名与实体类名不一致,用@TableName来映射。

package com.example.mybatisplus.entiy;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("mp")        //表名
public class User {
    private String id;
    private String name;
    private String age;
}

当数据库表名与实体类名不一致,报错如下:

2、@TableId

@TableId

设置主键映射

1)value

  • value 映射主键字段名

2)type

  • 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 进行赋值。

例如:

编写测试类

	@Test
    void save(){
        User user = new User();
        user.setName("张三");
        user.setAge(20);
        userMapper.insert(user);
    }

Id成功按策略插入成功

3、@TableField

@TableField

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

例如:

当字段名与数据库字段名不一致时,报错如下:

正确写法:

1)exist

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

当添加数据库没有的字段时,报错如下:

加上@TableField(exist = false),表示在数据库中没有对应的字段,即可查询成功。

2)select

  • select 表示是否查询该字段

3)fill

  • fill 表示是否自动填充,如create_time、update_time
1、增加字段

2、扩充实体类
	@TableField(fill = FieldFill.INSERT)        //填充字段
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)         //填充字段
    private Date updateTime;
3、MetaObjectHandler

创建MyMetaObjectHandler类 implements MetaObjectHandler,重写两个方法。

package com.example.mybatisplus.handle;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", System.currentTimeMillis(), metaObject);   // 创建时间 或者new Date()
        this.setFieldValByName("updateTime", System.currentTimeMillis(), metaObject);   // 更新时间
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", System.currentTimeMillis(), metaObject);   // 更新时间
    }
}
4、Test

4、@Version

@Version

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

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

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

  
    @Version
    private Integer version;                //乐观锁

3、配置类

package com.example.mybatisplus.config;

import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration      // 声明为配置类
public class MyConfig {

    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();                       // 创建一个 OptimisticLockerInterceptor 对象
    }

}

测试:version 1-->2

3、@EnumValue

@EnumValue

1)枚举类注解实现

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

1、设计表

2、实体类添加字段

private StatusEnum status;              //状态    枚举类型

3、创建枚举类

package com.example.mybatisplus.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;

public enum StatusEnum {        //枚举类   enum类型的类

    //奖励1  惩罚0
    reward(1,"奖励"),punishment(0,"惩罚");

    @EnumValue
    private Integer code;
    private String msg;

    StatusEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

4、application.yml

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl     # 日志实现类  -->打印sql

  type-enums-package:
    com.example.mybatisplus.enums        # 实现类所在的包		这里

5、测试

查询id为1、2,其对应status分别为1、0

2)接口实现

import com.baomidou.mybatisplus.core.enums.IEnum;

public enum SexEnum implements IEnum {
    
    ONE(1,"男"),
    TWO(0,"女"),

    private Integer code;
    private String msg;

    AgeEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    @Override
    public Integer getValue() {
        return this.code;
    }
}

6、@TableLogic

@TableLogic

映射逻辑删除

1、数据表添加 identification字段

2、实体类添加注解

	@TableLogic
    private Integer identification;         //是否删除标识

3、application.yml 添加配置

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl     # 日志实现类  -->打印sql

  type-enums-package:
    com.example.mybatisplus.enums        # 实现类所在的包
  global-config:
    db-config:
      logic-not-delete-value: 0     # 逻辑删除的值
      logic-delete-value: 1         # 逻辑删除的值

4、测试

删除id为2的User,identification标识 0-->1

再次查询数据库,查不到id为2的User,逻辑删除实现。

image-20220814150108889

xmp