文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL中使用delete_at(时间戳)作为逻辑删除标记时如何使用MyBatis-Plus逻辑删除组件插入时间戳,以及如何解决自动填充失效的问题

2023-08-30 14:02

关注

MySQL中使用delete_at(时间戳)作为逻辑删除标记

在业务中,使用逻辑删除是普遍做法,通常会使用一个名为deleted(0/1)的字段表示删除状态。

但是如果遇到有唯一约束,且可能反复删除和重新插入的表(如用户表,注销用户使用逻辑删除,同时表中有用户名的唯一索引约束)时,如果唯一键约束的对象在逻辑删除后重新插入,会遭遇主键冲突。

这时候的其中一个合理的解决方案是:使用delete_at作为逻辑删除标记,0表示未删除,使用delete操作时的时间戳作为已被删除的标记

MyBatis-Plus的逻辑删除组件

官网组件地址:https://www.baomidou.com/pages/6b03c5/

MyBatis-Plus作为广泛使用的ORM组件,提供了方便好用的逻辑删除组件,但文档中给出的实例仅囊括了使用0/1作为逻辑删除标记的使用场景。

MyBatis-Plus的自动填充功能

官网组件地址:https://www.baomidou.com/pages/4c6bcf/

MyBatis-Plus提供了自动填充组件。在笔者的项目中,使用这个组件填充update_by(更新人)字段。但是在使用了逻辑删除组件后,调用delete()方法时,发现没有进行自动填充。

本文讨论在使用时间戳作为逻辑删除标记时,如何使用MyBatis-Plus的逻辑删除组件,同时如何解决自动填充功能失效的问题。

如何使用@TableLogic注解为delete_at字段自动填入时间戳?

笔者的项目中有些表使用deleted字段作为逻辑删除标记,有些表使用delete_at,所以不能直接使用官网上的步骤 1: 配置com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig。因此,笔者选择了@TableLogic注解。该注解源码如下:

@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})public @interface TableLogic {        String value() default "";        String delval() default "";}

其中,delval属性即为进行逻辑删除时对逻辑删除字段的填充值。而我们的需求是:填入当前时间戳,那么,直接使用MySQL中自带函数UNIX_TIMESTAMP()即可作为delval属性的值。完整代码如下;

        @TableField("delete_at")    @TableLogic(value = "0", delval = "UNIX_TIMESTAMP()")    private Long deleteAt;

执行效果如下图:
自动填充时间戳函数到detete_at字段

解决自动填充功能失效的问题

笔者项目的PO中,使用了@TableField(fill = FieldFill.INSERT_UPDATE)作为自动填充标记。代码如下:

        @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)    private String updateBy;

但是发现在调用int delete(@Param("ew") Wrapper queryWrapper)方法进行删除时,虽然触发了逻辑删除功能,执行了update语句,但并没有对updateBy自动填充。
查询文档后发现在“常见问题”中有“删除接口自动填充功能失效”一节。
常见问题:删除接口自动填充功能失效
根据其中的提示,笔者使用了deleteById()方法。但发现问题依旧。
后来,经过阅读源码,发现deleteById()有2个重载方法,源码如下:

    int deleteById(Serializable id);    int deleteById(T entity);

而笔者原来使用的是第一个重载方法。抱着试试看的心理,使用了第二个重载方法,后发现真的可以使用。见图:
update_by自动填充生效
至此,问题全部解决。

关于MyBatis-Plus版本

经过翻阅其它的一些技术文章,发现“删除接口自动填充功能失效”一节中提到的“使用 deleteById 方法(推荐)”是在2022/10/01更新的,而在之前的版本中并没有这句话。推测该功能应当是在2022/10/01之前的最后一个release版本增加上去的。根据github上的Releases日志,推荐大家将自己的版本更新到3.5.1及以上,来使用新特性。

来源地址:https://blog.csdn.net/weixin_42182797/article/details/130562228

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯