mybatis-plus 实体类初步解析

该博客介绍了MyBatis Plus中如何实现实体类的自动填充功能,包括创建时间和更新时间,并展示了逻辑删除的使用,通过@TableLogic注解实现数据的逻辑删除,而非物理删除。同时,提供了测试案例展示删除操作如何更新逻辑删除字段。
摘要由CSDN通过智能技术生成

直接代码···实体类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语句的时候,会自动默认去寻找此逻辑删除字段的值为未删除状态的数据!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laughing_Xie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值