MyBatis-Plus的常用注解

一、@TableName

在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表,只是在Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表,由此得出结论,MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决定,且默认操作的表名和实体类型的类名一致。

1.1 引出问题

若实体类类型的类名和要操作的表的表名不一致,会出现什么问题?

我们将表user更名为t_user,测试查询功能

MyBatis-Plus的常用注解_第1张图片

程序抛出异常,Table ‘mybatis_plus.user’ doesn’t exist,因为现在的表名为t_user,而默认操作的表名和实体类型的类名一致,即user

MyBatis-Plus的常用注解_第2张图片

1.2 解决问题

a、使用注解@TableName解决问题

@TableName注解是MyBatis-Plus框架提供的一个注解,用于标识实体类对应的数据库表名。

使用@TableName注解可以将实体类与数据库表进行映射,可以通过设置value属性来指定表名。

在实体类类型上添加@TableName("t_user"),标识实体类对应的表,即可成功执行SQL语句

@Data
@TableName("t_user")
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
b、使用全局配置解决问题

在开发的过程中,我们经常遇到以上的问题,即实体类所对应的表都有固定的前缀,例如 t_ 或 tbl_ 此时,可以使用MyBatis-Plus提供的全局配置,为实体类所对应的表名设置默认的前缀,那么就不需要在每个实体类上通过@TableName标识实体类对应的表

mybatis-plus:
  global-config:
    db-config:
      # 设置实体类所对应的表的统一前缀
      table-prefix: t_

二、@TableId

MyBatis-Plus框架提供了@TableId注解,用于标识实体类中作为主键的属性。

@TableId注解可以用于标识实体类中的主键字段,并且可以指定该字段的生成策略、主键类型等属性。常用的属性包括:

  • value:指定主键字段名,默认为"id"。如果主键字段名与数据库中的字段名不一致,可以通过该属性进行映射。

  • type:指定主键类型,常用的类型有IdType.AUTO、IdType.ASSIGN_ID、IdType.UUID等。默认为IdType.ASSIGN_ID,表示基于雪花算法的策略生成数据id.

常用的主键策略: 

描述
IdType.ASSIGN_ID(默认) 基于雪花算法的策略生成数据id,与数据库id是否设置自增无关
IdType.AUTO 使用数据库的自增策略,注意,该类型请确保数据库设置了id自增,否则无效

示例用法如下:

public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    //...
}

在上述示例中,User类中的id字段被标识为主键,并指定了主键生成策略为自动增长,默认使用数据库自增主键。

通过@TableId注解,您可以更方便地定义实体类的主键字段,并且可以配置主键生成策略和类型,框架会根据注解的配置进行相应的处理。

也可以配置全局主键生成策略:

MyBatis-Plus的常用注解_第3张图片

# 加入日志功能
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 设置MyBatis-Plus的全局配置
  global-config:
    db-config:
      # 设置实体类所对应的表的统一前缀
      table-prefix: t_
      # 设置统一的主键生成策略
      id-type: auto

三、@TableField

@TableField注解用于标识实体类字段与数据库表字段的映射关系。

@TableField注解主要有以下几个属性:

  • value:指定数据库表中的字段名,如果实体类字段名与数据库表字段名相同,可以省略不写。
  • exist:指定该字段是否为数据库表中的真实字段,如果设置为false,则在SQL语句生成时会忽略该字段,默认为true。

通过@TableField注解,我们可以更灵活地控制实体类字段与数据库表字段的映射关系。

例如实体类属性name,表中字段username

此时需要在实体类属性上使用@TableField("username")设置属性所对应的字段名

public class User {
    @TableId("uid")
    private Long id;
    @TableField("username")
    private String name;
    private Integer age;
    private String email;
}

 也可以用@TableField指定字段是否在数据库存在,@TableField(exist = false)

public class User {

    @TableId("uid")
    private Long id;

    @TableField("username")
    private String name;

    private Integer age;
    private String email;

    @TableField(exist = false)
    private List list;
}

四、@TableLogic

@TableLogic注解用于标识逻辑删除字段。逻辑删除是一种常见的数据删除方式,它并不直接从数据库中删除数据记录,而是通过修改一个特定的字段值来表示该数据记录已被删除。

4.1  数据库中创建逻辑删除状态列,设置默认值为0

MyBatis-Plus的常用注解_第4张图片

4.2  实体类中添加逻辑删除属性

MyBatis-Plus的常用注解_第5张图片

4.3  测试删除功能,真正执行的是修改

public void testDeleteById(){
    int result = userMapper.deleteById(1527472864163348482L);
    System.out.println(result > 0 ? "删除成功!" : "删除失败!");
    System.out.println("受影响的行数为:" + result);
}

MyBatis-Plus的常用注解_第6张图片

4.4  此时执行查询方法,查询的结果为自动添加条件 

MyBatis-Plus的常用注解_第7张图片 4.5  支持配置逻辑删除

未删除的值默认为0,已删除的值默认为1,如果使用默认,可以不用配置。

MyBatis-Plus的常用注解_第8张图片

#配置逻辑删除
global-config:
  db-config:
    #逻辑删除字段名
    logic-delete-field: deleted
    #逻辑上已删除的值(默认1)
    logic-delete-value: 1
    #逻辑上未删除的值(默认0)
    logic-not-delete-value: 0

你可能感兴趣的:(mybatis)