MyBatisPlus-常用注解

前端之家收集整理的这篇文章主要介绍了MyBatisPlus-常用注解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、@TableName

映射数据库的表名

  1. package com.md.entity;
  2. import com.baomidou.mybatisplus.annotation.*;
  3. import com.md.enums.StatusEnum;
  4. import lombok.Data;
  5. import java.util.Date;
  6. /**
  7. * @author md
  8. * @Desc
  9. * @date 2020/10/26 15:38
  10. */
  11. @Data
  12. @TableName(value = "student")
  13. public class Student {
  14. private Integer id;
  15. private String name;
  16. private Integer age;
  17. }

二、@TableId

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

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

  1. AUTO(0),NONE(1),INPUT(2),ASSIGN_ID(3),ASSIGN_UUID(4),/** @deprecated */
  2. @Deprecated
  3. ID_WORKER(3),/** @deprecated */
  4. @Deprecated
  5. ID_WORKER_STR(3),/** @deprecated */
  6. @Deprecated
  7. 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 进行赋值

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

测试

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

三、@TableField

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

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

select 表示是否查询该字段

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

自动填充

1、给表添加 create_time、update_time 字段

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

  1. package com.md.entity;
  2. import com.baomidou.mybatisplus.annotation.*;
  3. import com.md.enums.StatusEnum;
  4. import lombok.Data;
  5. import java.util.Date;
  6. @Data
  7. @TableName(value = "student")
  8. public class Student {
  9. @TableId
  10. private Long id;
  11. // 当该字段名称数据库名字不一致
  12. @TableField(value = "name")
  13. private String name;
  14. // 不查询该字段
  15. @TableField(select = false)
  16. private Integer age;
  17. // 当数据库中没有该字段,就忽略
  18. @TableField(exist = false)
  19. private String gender;
  20. // 第一次添加填充
  21. @TableField(fill = FieldFill.INSERT)
  22. private Date createTime;
  23. // 第一次添加的时候填充,但之后每次更新也会进行填充
  24. @TableField(fill = FieldFill.INSERT_UPDATE)
  25. private Date updateTime;
  26. }

3、创建自动填充处理器

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

  1. package com.md.handler;
  2. import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
  3. import org.apache.ibatis.reflection.MetaObject;
  4. import org.springframework.stereotype.Component;
  5. import java.util.Date;
  6. /**
  7. * @author md
  8. * @Desc 对实体类中使用的自动填充注解进行编写
  9. * @date 2020/10/26 17:29
  10. */
  11. // 加入注解才能生效
  12. @Component
  13. public class MyMetaObjectHandler implements MetaObjectHandler {
  14. @Override
  15. public void insertFill(MetaObject MetaObject) {
  16. this.setFieldValByName("createTime",new Date(),MetaObject);
  17. this.setFieldValByName("updateTime",MetaObject);
  18. }
  19. @Override
  20. public void updateFill(MetaObject MetaObject) {
  21. this.setFieldValByName("updateTime",MetaObject);
  22. }
  23. }

4、测试

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

5、更新

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

  1. @Test
  2. void update(){
  3. Student student = mapper.selectById(1001);
  4. student.setName("韩信");
  5. mapper.updateById(student);
  6. }

四、@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

  1. package com.md.entity;
  2. import com.baomidou.mybatisplus.annotation.*;
  3. import com.md.enums.StatusEnum;
  4. import lombok.Data;
  5. import java.util.Date;
  6. @Data
  7. @TableName(value = "student")
  8. public class Student {
  9. @TableId
  10. private Long id;
  11. @TableField(value = "name")
  12. private String name;
  13. @TableField(select = false)
  14. private Integer age;
  15. @TableField(exist = false)
  16. private String gender;
  17. @TableField(fill = FieldFill.INSERT)
  18. private Date createTime;
  19. @TableField(fill = FieldFill.INSERT_UPDATE)
  20. private Date updateTime;
  21. @Version
  22. private Integer version; //版本号
  23. }

3、注册配置类

在 MybatisPlusConfig 中注册 Bean

  1. package com.md.config;
  2. import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
  3. import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. /**
  7. * @author md
  8. * @Desc
  9. * @date 2020/10/26 20:42
  10. */
  11. @Configuration
  12. public class MyBatisPlusConfig {
  13. /**
  14. * 乐观锁
  15. */
  16. @Bean
  17. public OptimisticLockerInterceptor optimisticLockerInterceptor(){
  18. return new OptimisticLockerInterceptor();
  19. }
  20. }

五、@EnumValue

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

  1. package com.southwind.mybatisplus.enums;
  2. import com.baomidou.mybatisplus.annotation.EnumValue;
  3. public enum StatusEnum {
  4. WORK(1,"上班"),REST(0,"休息");
  5. StatusEnum(Integer code,String msg) {
  6. this.code = code;
  7. this.msg = msg;
  8. }
  9. @EnumValue
  10. private Integer code;
  11. private String msg;
  12. }
  1. package com.md.entity;
  2. import com.baomidou.mybatisplus.annotation.*;
  3. import com.md.enums.StatusEnum;
  4. import lombok.Data;
  5. import java.util.Date;
  6. @Data
  7. @TableName(value = "student")
  8. public class Student {
  9. @TableId
  10. private Long id;
  11. @TableField(value = "name")
  12. private String name;
  13. @TableField(select = false)
  14. private Integer age;
  15. @TableField(exist = false)
  16. private String gender;
  17. @TableField(fill = FieldFill.INSERT)
  18. private Date createTime;
  19. @TableField(fill = FieldFill.INSERT_UPDATE)
  20. private Date updateTime;
  21. @Version
  22. private Integer version;
  23. private StatusEnum status;
  24. }

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

2、在主配置文件

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

六、@TableLogic

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

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

2、实体类添加注解

  1. package com.md.entity;
  2. import com.baomidou.mybatisplus.annotation.*;
  3. import com.md.enums.StatusEnum;
  4. import lombok.Data;
  5. import java.util.Date;
  6. @Data
  7. @TableName(value = "student")
  8. public class Student {
  9. @TableId
  10. private Long id;
  11. @TableField(value = "name")
  12. private String name;
  13. @TableField(select = false)
  14. private Integer age;
  15. @TableField(exist = false)
  16. private String gender;
  17. @TableField(fill = FieldFill.INSERT)
  18. private Date createTime;
  19. @TableField(fill = FieldFill.INSERT_UPDATE)
  20. private Date updateTime;
  21. @Version
  22. private Integer version;
  23. private StatusEnum status;
  24. @TableLogic
  25. private Integer deleted;
  26. }

3、主配置文件添加配置

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

4、在 MybatisPlusConfig 中注册 Bean

配置类

  1. @Configuration
  2. public class MyBatisPlusConfig {
  3. /**
  4. * 乐观锁
  5. */
  6. @Bean
  7. public OptimisticLockerInterceptor optimisticLockerInterceptor(){
  8. return new OptimisticLockerInterceptor();
  9. }
  10. /**
  11. * 逻辑删除
  12. */
  13. @Bean
  14. public IsqlInjector sqlInjector() {
  15. return new LogicsqlInjector();
  16. }
  17. }

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

猜你在找的Mybatis相关文章