直接代码···实体类user
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "t_user") //映射表名
public class User implements Person {
//MP 默认雪花算法 也可以设置
// @TableId(type= IdType.ASSIGN_ID) private String id; 也可以在配置文件设置全局设置 如果用uuid 主键必须为varchar类型
@TableId(value = "uid", type = IdType.AUTO) //这个属性必须叫做id MP才能识别为主键, 如果直接修改为uid 则需要加上@TableId注解告诉MP
private Long id;
// @TableField(value = "username")
private String name;
@TableField(fill = FieldFill.INSERT)
private Integer age;
private String email;
//代码层面实现自动更新时间数据的功能,就可以兼容很多数据库,mysql oracle等各类数据库的解决方案是不一样的,所以放代码层面注解处理会兼容一点
//自动填充 自动填充的内容 需要自定义一个实现类 MetaObjectHandler 元数据,重写insert update方法
@TableField(fill =FieldFill.INSERT )
private LocalDateTime createTime; //驼峰命名自动映射数据库的 create_time 字段
@TableField(fill = FieldFill.INSERT_UPDATE) //数据增加的时候自动填充,修改的时候自动填充
private LocalDateTime updateTime;
// 逻辑删除字段 默认 0表示false 1表示true 配置文件可全局配置
@TableLogic
@TableField(value = "is_deleted") //映射数据库的逻辑删除字段
private Boolean deleted;
/*自定义 1为未删除 -1为已删除 需要去配置
@TableLogic
@TableField(value = "is_deleted")
private Integer deleted;*/
数据库相关的信息可进行全局配置,可自行定义逻辑删除的字段(实体类中的字段名)如果不特别配置逻辑删除字段的值,数据库中 那么会默认 0表示没删,1表示已删除!实体类中如果用的是布尔类型,false 未删除,true删除,同数据库中的0 ,1对应
#设置全局主键自增
mybatis-plus.global-config.db-config.id-type=auto
#自定义逻辑删除字段 表达
mybatis-plus.global-config.db-config.logic-delete-field=deleted
mybatis-plus.global-config.db-config.logic-delete-value=-1
mybatis-plus.global-config.db-config.logic-not-delete-value=1
自定义填充属性实现,MetaObject 为当前被操作的元对象的所有信息,这里是User 的信息
Slf4j
//实现MetaObjectHandler 专门用于填充功能
@Component //spring自动管理 程序启动的时候会去检查是否有自动填充的注解 然后进行实现(fill =FieldFill.**)
public class MyMeatObjectHandler implements MetaObjectHandler {
//实现填充业务逻辑 元数据对象
@Override
public void insertFill(MetaObject metaObject) {
log.info("insert自动填充....");
//插入数据的时候 识别到注解 @TableField(fill = FieldFill.INSERT) 就会进入这个方法来执行
//元数据对象(包含的当前列名,类型之类的具体信息) | 属性名 | 填充的数据的类型 | 填充的具体内容
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
log.info("age 填充为18");
//如果业务层赋值了就不用去填充,如果没有赋值去进行填充 从元数据中去取 age这个属性,判断其是否有值
Object age = this.getFieldValByName("age", metaObject);
if (age == null) {
this.strictInsertFill(metaObject, "age", Integer.class, 18);
}
//假设另外的表、实体类 有author 属性 在对user数据对象进行数据填充的时候,会执行代码,所以需要进行判断识别是否执行填充操作
//判断当前对象自动填充属性是否包含 当前属性 并且有setter方法可以进行赋值
boolean hasAuthor = metaObject.hasSetter("author");
//如果 有setter的方法 有这个author字段 进行自动填充author
if (hasAuthor) {
log.info("insert author属性");
this.strictInsertFill(metaObject, "author", String.class, "石头");
}
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("update自动填充。。。");
//更新的时候
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
从MetaObject 中会取出tableInfo的信息, tableInfo 包含了User对象对应的数据库信息
tableInfo.isWithInsertFill() 判断当前被修改的列里面有没有这个 insert 或者update fill的注解,如果有这个方法就会返回true
一般是整个数据库中所有的表共有的字段,且需要填充,用自定义的填充功能去填充,否则一般在业务层进行实际情况进行赋值,否则耦合性过高
@TableLogic 逻辑删除注解
将对应数据中心代表是否被删除字段的状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录使用场景:可以进行数据恢复。
数据库中加is_deleted tinyint类型 (代表布尔),实体类中添加了 deleted字段(可用Boolean 或者Integer 类型都可以),实体类中不会带is前缀(因为某些框架读取is可能会产生歧义)。用@TableField注解进行映射。
测试:因为在properties文件中对逻辑删除的值进行了定义,如果删除就是-1,未删除就是1,执行MP自带的删除方法
@Test
public void testDelte(){
int res = userMapper.deleteById(1500133241527472130L);
System.out.println("结果"+res);
}
2022-07-27 23:10:46.375 INFO 12864 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2022-07-27 23:10:46.833 INFO 12864 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
JDBC Connection [HikariProxyConnection@846014380 wrapping com.mysql.cj.jdbc.ConnectionImpl@4d499d65] will not be managed by Spring
==> Preparing: UPDATE t_user SET is_deleted=-1 WHERE uid=? AND is_deleted=1
==> Parameters: 1500133241527472130(Long)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@71ad3d8a]
结果1
删除的时候并不是真的删除数据,而是将状态为1的数据,is_deleted字段值更新为-1。
逻辑删除字段不仅仅会影响删除功能,也会影响查询功能,在执行查询select语句的时候,会自动默认去寻找此逻辑删除字段的值为未删除状态的数据!