假设
表名是 book,实体类类名是 Book
MyBatisPlus会进行自动映射
但如果 表名是 tab_book,实体类类名是 Book
那么MyBatisPlus就无法进行自动映射,需要我们使用 @TableName注解 去指定实体类对应的表
如下
@TableName("tab_book")
@Data
public class Book {
private Integer id;
private String name;
private String type;
private String description;
}
查看@TableId 注解源码,如下
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface TableId {
String value() default "";
IdType type() default IdType.NONE;
}
我们发现有两个属性 value 和 type
其中的 type 用于指定Id的生成策略,我再另外一篇博客进行了非常详细的整理,地址如下:
MyBatisPlus之id生成策略
value的作用类似@TableName,当 实体类的 主键 属性名 与 数据表 中的 主键 字段名不同时,就通过value做映射,如下<表中的字段名为 uid >
@TableName("tab_book")
@Data
public class Book {
@TableId(value = "uid")
private Integer id;
private String name;
private String type;
private String description;
}
如果属性名为value,则value可以不显式指明
@TableId("uid")
private Integer id;
实体类的 主键 属性名 与 数据表 中的 主键 字段名不同时,通过 @TableId() 中的value属性做映射
那实体类的 非主键 属性名 与 数据表 中的 非主键 字段名不同时,就使用 @TableField
比如:实体类属性名为name,而表中字段名为book_name,那么就需要做如下映射
@TableName("tab_book")
@Data
public class Book {
@TableId(value = "uid")
private Integer id;
@TableField("book_name")
private String name;
private String type;
private String description;
}
但是 如果实体类属性名为bookName,而表中字段名为book_name,那么我们就无需再指定,MyBatisPlus 能自动处理这种映射
真实删除 – 使用 delete语句 将数据库中的记录直接删除,但是这种做法是十分危险的,因此开发中的删除一般是逻辑删除
逻辑删除 – 使用一个删除标记字段,如 is_deleted ,初始值为0,置为 1 为逻辑上删除
因此逻辑删除实际上是修改功能
那如何使用呢?
首先在表中添加 is_deleted 字段,类型为int ,长度为1,默认值为 0
在实体类中添加 isDeleted 属性,然后在该属性上添加 @TableLogic 注解,如下
@TableName("tab_book")
@Data
public class Book {
@TableId(value = "uid")
private Integer id;
@TableField("book_name")
private String name;
private String type;
private String description;
@TableLogic
private Integer isDeleted;
}
运行删除方法
@Test
void testGetById() {
bookService.removeById(1);
}
查看日志
JDBC Connection [HikariProxyConnection@1430358188 wrapping com.mysql.cj.jdbc.ConnectionImpl@1f43cab7] will not be managed by Spring
==> Preparing: UPDATE tab_book SET is_deleted=1 WHERE id=? AND is_deleted=0
==> Parameters: 1(Integer)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@21a9a705]
发现是update ,并且是将 is_deleted 字段由 0 变 1