1:@TableName
问题: 操作数据库表时,Mapper接口继承BaseMapper<>,泛型名和数据库表名对应,如果数据表名为t_users,而BaseMapper的泛型为实体类User,导致找不到数据库的表。
解决1: 实体类使用@TableName注解,value值为表名
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_users")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
解决2: 如果多张表的表名为 t_user/t_cat/t_xxx,不需要为每一个实体类添加@TableName注解,在MyBatis全局配置即可,为所有表名添加前缀
mybatis-plus: #mybatis-plus日志
global-config: #MyBatisPlus全局配置
db-config: #配置数据库
table-prefix: t_ #配置表名前缀为t_
2:@TableId
问题: MyBatisPlus在实现CRUD默认会将Id作为主键,在插入数据时,使用雪花算法生成Id,如果主键不叫Id则添加功能会失败
解决:@TableId注解标识属性,将此属性对应的字段指定为主键
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_users")
public class User {
@TableId //将当前属性所对应的字段作为主键
private Long id;
private String name;
private Integer age;
private String email;
}
2.1:@TableId的value属性
问题: 实体类中被标识为主键的属性名为id,而数据库的主键为uid,则id属性不会对应uid字段上
解决: 使用@TableId的value属性设置当前主键字段的字段名为uid
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_users")
public class User {
@TableId(value = "uid") //value指定当前作为主键的字段
private Long id;
private String name;
private Integer age;
private String email;
}
2.2:@TableId的type属性
type:主键生成策略(默认的主键生成策略为雪花算法)
设置自增主键:
-
数据库设置主键递增
-
使用@TableId注解的type属性为IdType.AUTO
@Data @AllArgsConstructor @NoArgsConstructor @TableName("t_users") public class User { @TableId(value = "id",type = IdType.AUTO) //将当前属性所对应的字段作为主键 private Long id; private String name; private Integer age; private String email; }
2.3:全局配置主键生成策略
mybatis-plus: #mybatis-plus日志
global-config: #MyBatisPlus全局配置
db-config: #配置数据库
id-type: auto #统一设置主键策略
3:@TableField
问题: 如果实体类的普通属性名,和数据库非主键的字段名不一致
解决:@TableField设置对应字段名
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_users")
public class User {
@TableId(value = "id",type = IdType.AUTO)
private Long id;
@TableField("user_name")
private String name;
@TableField("user_age")
private Integer age;
@TableField("user_email")
private String email;
}
4:@TableLogic
逻辑删除:表中设置字段为删除状态 比如删除为1 未删除为0 则查询时,只会查到状态为0的数据(可以进行数据恢复)。
物理删除:从表中删除。
int类型的is_deleted状态 默认为0表示未删除
@TableLogic //逻辑删除字段
@TableField("is_deleted")
private Integer Deleted;
@Test
public void testDelLogic(){
//修改删除状态 从0->1
userMapper.deleteById(1);//UPDATE t_users SET is_deleted=1 WHERE id=? AND is_deleted=0
List<User> users = userMapper.selectList(null);
//SELECT id,name,age,email,is_deleted FROM t_users WHERE is_deleted=0
}
}