mp公共字段自动注入

目录

一 什么是公共字段自动注入

 二 使用mp实现公共字段自动注入

        1.实现步骤

①导入mp相关依赖

② 在实体类上给相关字段加上 @TableField()注解

③自定义元数据对象处理器   

        2.实现原理


一 什么是公共字段自动注入

        我们平时在执行更新或者是插入数据功能的时候,都需要给一些公共的字段赋值,比如创建时间,更新时间,创建人,更新人等。这些字段在执行插入或者更新功能的时候,都需要注入一遍这些字段,导致重复代码过多。所以为了解决这一问题,我们可以每次在执行更新或者插入功能的时候,都自动调用一个方法,把这些公共的字段自动注入,这样就省下很多时间。比如下面这些字段:

 二 使用mp实现公共字段自动注入

        因为本项目是基于springBoot整合mybatisPlus的,所以这次介绍的也是mybatisPlus实现公共字段注入。

        1.实现步骤

①导入mp相关依赖

             

<!--        mp-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-annotation</artifactId>
            <version>3.4.1</version>
        </dependency>

这里有时候加入mp的依赖后,项目会报错,因为mybatis和mybatisPlus依赖会有冲突,我就是一开始报错,后面使用上面这个版本的之后才没有报错。

                

② 在实体类上给相关字段加上 @TableField()注解

       

public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    private String username;

    private String name;

    private String password;

    private String phone;

    private String sex;

    private String idNumber;

    private Integer status;

    @TableField(fill = FieldFill.INSERT) //执行插入操作时自动填充
//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") //该注解的作用是:让返回给前端的日期格式按照我指定的格式,否则返回的是一个数组
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)//执行插入和更新操作时自动填充
    //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)//执行插入操作自动填充
    private Long createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)//执行插入和更新时自动填充
    private Long updateUser;

}
@TableField(fill = FieldFill.INSERT):执行插入操作时自动注入该字段
@TableField(fill = FieldFill.INSERT_UPDATE): 执行插入更新操作时注入该字段

还有其他的属性,根据业务需求可以自己去查。

     ③自定义元数据对象处理器   

     需要再定义一个类,需要实现 MetaObjectHandler,然后实现里面的 insertFill() 和 updateFill() 方法,分别代表在执行插入操作和更新操作时执行对应的方法,而方法内部去实现你需要注入的字段的值,代码如下:

@Component
@Slf4j
public class MyMetaObjectHandle implements MetaObjectHandler {
//    插入操作的时候执行该方法
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("insert公共字段自动填充...{}",metaObject.getOriginalObject());
        metaObject.setValue("createTime", LocalDateTime.now());// 给createTime属性自动填充值
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("createUser", BaseContext.getCurrentId());//获取当前管理员id
        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("update公共字段自动填充... {}",metaObject.getOriginalObject());
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }
}
metaObject.setValue("createTime", LocalDateTime.now()) : createTime你需要注入的属性名;LocalDateTime.now()注入的属性值

这里一定要加上@Component注解把bean交给spring管理。

注意:如果你的项目并不是一开始就基于MybatisPlus创建,而是后面加上去的,在执行上面三个步骤之后,你的my公共字段注入是不生效的,因为你还忘记了mapper成需要实现BaseMapper接口,这是实现mp必须要的。 

 2.实现原理

        这里简单来说,就是使用了aop+反射+注解+枚举。如果你不是使用my来实现的,就需要自己去写这个过程,mp是帮我们封装好了。大致就是,你使用aop的前置处理,在执行插入和更新操作之前做切面处理,至于怎么识别,可以在插入和更新方法上面加上注解标记,然后用反射得到注解类型进行判断,最后用反射实现对象对应属性的注入操作.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值