一、@TableName
1.1 引出问题
若实体类类型的类名和要操作的表的表名不一致,会出现什么问题?
我们将表user
更名为t_user
,测试查询功能
程序抛出异常,Table ‘mybatis_plus.user’ doesn’t exist,因为现在的表名为t_user
,而默认操作的表名和实体类型的类名一致,即user
表
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:
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
4.2 实体类中添加逻辑删除属性
4.3 测试删除功能,真正执行的是修改
public void testDeleteById(){
int result = userMapper.deleteById(1527472864163348482L);
System.out.println(result > 0 ? "删除成功!" : "删除失败!");
System.out.println("受影响的行数为:" + result);
}
4.4 此时执行查询方法,查询的结果为自动添加条件
4.5 支持配置逻辑删除
未删除的值默认为0,已删除的值默认为1,如果使用默认,可以不用配置。
#配置逻辑删除
global-config:
db-config:
#逻辑删除字段名
logic-delete-field: deleted
#逻辑上已删除的值(默认1)
logic-delete-value: 1
#逻辑上未删除的值(默认0)
logic-not-delete-value: 0