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<Integer> {
    
    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

Tags: