MybatisPlus自动填充

当数据类型出现updateuser,createuser等通用字段字段发生更改的时候,我们一般在service层对通用数据进行填充,在MybatisPlus的功能中可以对指定字段进行填充

实体类表明字段

实体类

package com.example.ruiji.Entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 地址簿
 */
@Data
public class AddressBook implements Serializable {

    private static final long serialVersionUID = 1L;

    private String id;


    //用户id
    private Long userId;


    //收货人
    private String consignee;


    //手机号
    private String phone;


    //性别 0 女 1 男
    private String sex;


    //省级区划编号
    private String provinceCode;


    //省级名称
    private String provinceName;


    //市级区划编号
    private String cityCode;


    //市级名称
    private String cityName;


    //区级区划编号
    private String districtCode;


    //区级名称
    private String districtName;


    //详细地址
    private String detail;


    //标签
    private String label;

    //是否默认 0 否 1是
    private Integer isDefault;

    //创建时间
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;


    //更新时间
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;


    //创建人
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;


    //修改人
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;


    //是否删除
    private Integer isDeleted;
}

mp中使用@TableField字段可以指定映射关系 同样也可以指定填充类型,

  • insert 数据执行插入操作,该字段自动填充
  • update 数据执行update操作时候,执行自动填充
  • INSERT_UPDATE 插入和更新时候执行自动填充
2.创建数据填充类型

实现MetaObjectHandler 类型重写该方法

@Component //注入ioc
@Slf4j
public class MetaObjectHandler implements com.baomidou.mybatisplus.core.handlers.MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        //  对于标记的数据的地方进行 标注
//        当数据发生对应操作以后 进行自动填充
//        字段名,字段值
        /**
         * 但是问题出现了,不是handler没办法获取到请求头中携带的id
         * 所以只能通过当线程来获取
         */
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
        String id = UserHolder.getUser().get("id").toString();
        if (id != null){
            metaObject.setValue("createUser", Long.parseLong(id));
//            当前修改用户id insert 的时候也要初始化
            metaObject.setValue("updateUser", Long.parseLong(id));

        }


    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("执行update自动填充");
        metaObject.setValue("updateTime", LocalDateTime.now());
        String id = UserHolder.getUser().get("id").toString();
        if (id != null){

            metaObject.setValue("updateUser", Long.parseLong(id));
        }
    }

}

metaObject.setValue(“createTime”, LocalDateTime.now());是一个kv形式,我登陆验证的时候将用户id储存到了本地线程

3 填充字段出现多个实体类重复字段名

  @Override
  public void insertFill(MetaObject metaObject) {
      Object entity = metaObject.getOriginalObject();
      String className = entity.getClass().getName(); // 获取当前实体类的类名字符串
      if (className.equals("com.example.demo.entity.A")) { // 判断当前实体类是否为 A
          setFieldValByName("createTime", new Date(), metaObject); // 对 A 的 createTime 字段进行自动填充
      } else if (className.equals("com.example.demo.entity.B")) { // 判断当前实体类是否为 B
         setFieldValByName("createTime", LocalDate.now(), metaObject); // 对 B 的 createTime 字段进行自动填充
      }
  }
 */

根数元数据判断当前实体类是什么,然后执行不同的填充策略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝胖子不是胖子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值