【Mybatis-Plus进阶学习(三)】自动填充

摘要:
CharacterEncoding=UTF-8自动填充的简单使用步骤1:向字段@TableFieldprivateLocalDateTimecreateTime@TableFieldprivateLocalDateTimeupdateTime添加注释;步骤2:填写处理器@ComponentpublicclassMyMetaObjectHandlerimplementsMetaObjectHandler{@OverridepublicvoidinsertField{setInsertFieldValByName;}@覆盖publicvoidupdateFill{setUpdateFieldValByName;}}注意:setInsertFieldValByName和setUpdateFieldValByName方法不能放错位置,否则它们不会生效。setFieldValByName()可以随意放置,以实现自动填充优化,如上面的示例所示。尽管可以实现自动填充,但无论数据库是否具有createTime字段,都会填充,这是对资源的浪费。因此,我需要优化它,以便在有createTime字段时自动填充,而在没有createTime字段的情况下不填充。

我们在实际开发中有些字段的值使用手动输入十分的不方便,例如创建时间,更改时间等。有的朋友说可以使用默认值,这是可以的,但同时具有局限性。这时候就需要使用MP的自动填充功能。

在本篇博客中,如果你遇到了乱码问题,可以在数据库连接池参数中添加如下属性,或者直接在数据库中更改编码方式。

characterEncoding=UTF-8
自动填充的简单使用

第一步:字段添加注释

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;

第二步:填充处理器

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
            setInsertFieldValByName("createTime", LocalDateTime.now(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
            setUpdateFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }
}

注意:

  1. creatTime和updateTime是User类的属性不是数据库的字段
  2. setInsertFieldValByName和setUpdateFieldValByName方法不能放错位置,不然不生效。setFieldValByName()可以在随意放置
自动填充优化

如上例,虽然可以实现自动填充,但是无论数据库是否有createTime字段都会被填充,是对资源的浪费,所以我需要进行优化,让其在有createTime字段的时候进行自动填充,没有的时候不填充。同样更新也做了相应的修改。update时,变量中如果有updateTime相应的值,就使用输入的变量的值,如果没有,就是用LocalDateTime.now()生成并填入,具体代码如下:

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        //数据库是否有这个字段,有就填充,没有就不填充
//        boolean hasSetter = metaObject.hasSetter("createTime1");
        boolean hasSetter = metaObject.hasSetter("createTime");
        if (hasSetter) {
            setInsertFieldValByName("createTime", LocalDateTime.now(), metaObject);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        //updateTime
        Object updateTime = getFieldValByName("updateTime", metaObject);
        if (updateTime == null) {
            setUpdateFieldValByName("updateTime", LocalDateTime.now(), metaObject);
        }
    }
}

MetaObject是元对象,这里可以初步理解为被操作的数据源的对象,里面包括数据元的各种参数。

免责声明:文章转载自《【Mybatis-Plus进阶学习(三)】自动填充》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Nodejs学习(一)-Nodejs和express的安装和配置vue mitt 解决多次触发问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

【资料】2021年最网红的FPGA开发板之一——DE10-Nano (SOC FPGA入门推荐!)

DE10 Nano开发板是2021最受欢迎的FPGA开发板之一。除了广泛应用于物联网、边缘计算、硬件加速、AI和EDA教育课程之外,许多爱好者还在网络上日益流行的开源复古游戏项目Mister中使用它。让我们来看看DE10 Nano提供的材料:Youjing官方网站上的材料(中文手册可用!!!23~课程培训材料2018产学合作培训材料基于2018产学协作培训材...

boost的下载和安装(windows版)

1 Introduction boost是一个准C++标准库,相当于STL的延续和扩展。它的设计理念类似于STL,它使用泛型来最大化重用。对于2boost的下载和安装,我们可以在官方boost网站上下载最新的boost版本。因为boost库可以像标准库一样在多个平台上运行,所以它只以源代码的形式正式提供。这是因为boost windows的安装版本不仅与处理...

Python-正则

,三:量词*重复0次或多次{0,}+重复一次或多次{1,}?重复0或1次{1,0}{n}重复n次{n}{n,}重复n次,或更多次{n,m}将n次重复到m次Escape:如果字符串中有特殊字符要匹配,请在常规字符和字符串前面添加r。如果特殊字符在字符组中,则它们是匹配的特殊字符,但为了记忆,匹配时会转义所有特殊字符。...

mac下vscode插件位置

1、 位置:Mac:User/(您的用户名)/vscode/extensions II下vscode插件的存储位置。搜索步骤:以我的mac为例,打开查找器,单击远程CD,单击转到上面的文件夹,单击macintosh HD,单击用户(或用户),单击mymac,单击。vscode(.vscode是一个隐藏文件。如果默认情况下不显示,请按住ctrl+shift+....

海康、大华网络摄像机RTSP URL格式组成及参数配置

1.海康相机在IE浏览器中输入网络摄像头的IP地址,输入配置的用户名和密码,然后登录:视频:1。比特率类型:主流和子流,主流支持的分辨率相对较高;2.视频类型:如果需要音频和视频,则选择“复合流”;如果只需要视频,则选择“视频流”;3.分辨率设置不重复;4.码率类型:代码更改率!!!...

Win10阻止电脑关机时弹出正在关闭应用的方法及恢复

当计算机上安装了Windows 10时,当我们在未完成所有运行程序的情况下关闭计算机时,将弹出n个应用程序正在关闭并关闭的提示。第一步是创建一个自动关闭应用程序并将其添加到注册表的注册表文件。这可以解决在Windows 10系统计算机关闭时弹出提示关闭n个应用程序并关闭的问题。...