如何使用MyBatis-Plus实现字段的自动填充?(下篇)

514 阅读6分钟

👨‍🎓作者:bug菌
✏️博客:CSDN掘金infoQ51CTO
🎉简介:CSDN博客专家,C站历届博客之星Top50,掘金/InfoQ/51CTO等社区优质创作者,全网合计8w粉+,对一切技术感兴趣,重心偏Java方向;硬核公众号「 猿圈奇妙屋」,欢迎小伙伴们的加入,一起秃头,一起变强。
..
✍️温馨提醒:本文字数:1999字, 阅读完需:约 5 分钟

       嗨,家人们,我是bug菌呀,我又来啦。今天我们来聊点什么咧,OK,接着为大家更《springboot零基础入门教学》系列文章吧。希望能帮助更多的初学者们快速入门!

        小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐+关注👨‍🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️

一、前言🔥

环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE

二、背景🔥

       续上篇,我是讲到项目中集成了mybtis-plus及配属了公共属性对吧。大家都还记得吧,若是不记得了,现在立马点击下方链接去瞅一眼,好吧,要不然该脱节啦。

如何使用MyBatis-Plus实现字段的自动填充?(上篇)

三、添加填充器🔥

       上期我是忘了把这个属性填充器讲了,这个为什么要添加呢?这也是mp通过aop实现的,但是使用起来比你手动实现一个aop赋值方便的多。

       其实就是在你需要自动填充的字段加上注解。我这里是已经将众多表中共同字段抽离到了一个公共实体类中,而这也是解决我上方提出的第一步。而你也可以只加到你需要自动填充的字段上,加上该注解即可。后续也可以单独在某个字段上添加,因为一定要数据库自带这些字段才行,否则直接配置肯定是会映射不上而报错的。

package com.example.review.handlers;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.example.review.util.UserUtil;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 自动补充插入或更新时的值
 * @author luoYong
 * @date 2022年3月28日12:35:45
 */
@Component
public class MpMetaObjectHandler implements MetaObjectHandler {

    /**
     * 插入时的填充策略
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createBy", UserUtil.getUsername(),metaObject);
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateBy", UserUtil.getUsername(),metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

    /**
     * 更新时的填充策略
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateBy", UserUtil.getUsername(),metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

       如上我是又封装了一个获取当前登录用户的方法,UserUtil.getUserName(),直接获取登入系统人的账号人姓名,然后设置当前时间,切记一点,数据库字段和填充器字段必须对应上,否则无效啊。比如' createBy ' 对应数据库字段为 ' create_by ';命名规律是根据驼峰命名。这样讲大家可曾明白?

四:接口测试🔥

       这里咱们写两个接口,一个新增接口,一个修改接口。

具体接口如下:

    /**
     * 插入用户
     */
    @GetMapping("/insert")
    @ApiOperation(value = "插入用户",notes = "插入用户")
    public String insert(){

        UserEntity userEntity = new UserEntity();
        userEntity.setName("我是bug菌");
        userMapper.insert(userEntity);

        //返回插入的id
        return userEntity.getId();
    }

         然后将上方插入接口返回的uuid手动给到下边,我图省事,直接就在代码中给大家演示啦,讲道理实现逻辑不会写到控制层的。

    /**
     * 修改用户
     */
    @GetMapping("/update")
    @ApiOperation(value = "修改用户",notes = "修改用户")
    public void update(){
        UserEntity userEntity = new UserEntity();
        userEntity.setName("我是bug菌No.1");
        userEntity.setId("b6ef69a870966502dcaa595deea00435");
        userMapper.updateById(userEntity);
    }

        然后重启项目,我们 swagger 调用一下:我们查看一下控制台输出打印:

Preparing: INSERT INTO user ( id, create_by, create_time, update_by, name, update_time ) VALUES ( ?, ?, ?, ?, ?, ? ) 
Parameters: ad7a97a8ca1533423d5d06f653c43e79(String), xxx(String), 2022-03-29 00:23:09.355(Timestamp), xxx(String), 我是bug菌(String), 2022-03-29 00:23:09.355(Timestamp)

        ok,眼瞅这执行sql,证明这条数据新增成功了,而且,我们想看到的自动填充的字段内容也设置上了,这证明新增时手动实现的填充器方法insertFill()中为这create_time、create_by、update_by、update_time这4个字段赋值是准确有效的。

       接下来我们将返回的uuid进行查验修改接口,看是否update()方法设置update_by、update_time这两个字段是否也能自动填充对应数据?

       项目再接着重启一波,然后swagger调用修改接口试试,看看控制台打印内容吧。

Preparing: UPDATE user SET update_by=?, name=?, update_time=? WHERE id=? 
Parameters: xxx(String), 我是bug菌No.1(String), 2022-03-29 00:29:59.889(Timestamp), ad7a97a8ca1533423d5d06f653c43e79(String)

        很控制台执行sql打印,这两个字段具体数据也被设置上了。很完美,直接证实了我给出的解决方案是完美的。看这种实现方式是不是优雅、简洁多了,相比不封装而言?

... ...

       ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~

五、往期推荐🔥

文末🔥

如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《springboot零基础入门教学》,从无到有,从零到一!希望能帮助到更多小伙伴们。

我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

感谢认真读完我博客的铁子萌,在这里呢送给大家一句话,不管你是在职还是在读,绝对终身受用。
时刻警醒自己:
抱怨没有用,一切靠自己;
想要过更好的生活,那就要逼着自己变的更强,生活加油!!!