首页 > 其他分享 >MetaObjectHandler:实体对象的属性自动赋值

MetaObjectHandler:实体对象的属性自动赋值

时间:2023-10-11 16:13:04浏览次数:40  
标签:metaObject String getFieldName MetaObjectHandler import 属性 LAST 赋值

1.MetaObjectHandler接口方法

Mybatis中的MetaObjectHandler是一个接口,用于为实体对象的属性自动赋值。它有以下几个方法:

  1. insertFill(MetaObject metaObject):在执行插入操作时自动填充实体对象的属性值。

  2. updateFill(MetaObject metaObject):在执行更新操作时自动填充实体对象的属性值。

  3. strictInsertFill(MetaObject metaObject, String propertyName, Class<?> propertyType, Object propertyValue):在执行插入操作时强制填充实体对象的属性值。

  4. strictUpdateFill(MetaObject metaObject, String propertyName, Class<?> propertyType, Object propertyValue):在执行更新操作时强制填充实体对象的属性值。

  5. setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject):手动设置实体对象的属性值。

  6. getFieldValByName(String fieldName, MetaObject metaObject):获取实体对象的属性值。

  7. getSetterNames():获取实体对象所有setter方法的名称。

  8. getGetterNames():获取实体对象所有getter方法的名称。

  9. getSetterType(String name):获取实体对象指定setter方法的参数类型。

  10. getGetterType(String name):获取实体对象指定getter方法的返回类型。

以上就是Mybatis中MetaObjectHandler的所有方法。通过实现MetaObjectHandler接口并重写这些方法,我们可以为实体对象自动填充属性值,从而简化开发。

 

2.strictInsertFill方法和setFieldValByName方法的主要区别

MetaObjectHandler是Mybatis-Plus提供的一个接口,用于实现自定义的元对象处理器。其中,strictInsertFill方法和setFieldValByName方法的主要区别在于:

  1. strictInsertFill方法用于在执行插入操作时,自动填充指定的字段值。这个方法会先判断实体类中是否存在指定的字段,如果存在则将指定的字段值填充到实体类中,如果不存在则不进行任何操作。

  2. setFieldValByName方法用于设置实体类中指定字段的值。这个方法不会进行任何判断,只要实体类中存在指定的字段,就会将指定的值设置到这个字段中。

因此,strictInsertFill方法更加适合在插入操作时自动填充字段值,而setFieldValByName方法更加灵活,可以用于设置实体类中任意字段的值。

 

3.在实体类中使用 @TableField 注解来标注需要自动填充的字段


@Data
@TableName("user")
public class User {

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

    /**
     * 创建人名称
     */
    @TableField(fill = FieldFill.INSERT)
    private String createdBy;

    /**
     * 最后更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime lastUpdateDate;

    /**
     * 最后更新人名称
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String lastUpdatedBy;

}

在这个实体类中,我们通过 @TableField 注解来标注需要自动填充的字段。这样,当我们插入或更新数据时,MyBatis 就会自动调用 MyMetaObjectHandler 中的 insertFill 和 updateFill 方法,来填充对应字段。

需要注意的是,MetaObjectHandler 只能对实体类中的属性进行填充,它无法对数据库中的字段进行操作。如果需要对数据库字段进行操作,可以使用 MyBatis 提供的 SQL 函数来实现。

4.自定义类DbFieldFillHandler实现接口MetaObjectHandler 

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.midea.fap.aic.common.constant.DbConstant;
import com.midea.logging.Logger;
import com.midea.logging.LoggerFactory;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Objects;

import static *.enums.SpecialFieldEnum.CREATED_BY;
import static *.enums.SpecialFieldEnum.CREATION_DATE;
import static *.enums.SpecialFieldEnum.DATA_VERSION;
import static *.enums.SpecialFieldEnum.DELETE_FLAG;
import static *.enums.SpecialFieldEnum.LAST_UPDATED_BY;
import static *.enums.SpecialFieldEnum.LAST_UPDATE_DATE;

/**
 * @version 1.0
 * @date 2023-04-28 14:26
 */
@Slf4j
@Component
public class DbFieldFillHandler implements MetaObjectHandler {

    private static final Logger LOG = LoggerFactory.getLogger(DbFieldFillHandler.class);

    @Override
    public void insertFill(MetaObject metaObject) {
        LocalDateTime now = LocalDateTime.now();
        if (Objects.isNull(metaObject.getValue(CREATION_DATE.getFieldName()))) {
            this.strictInsertFill(metaObject, CREATION_DATE.getFieldName(), LocalDateTime.class, now);
        }
        if (hasNoText(metaObject.getValue(CREATED_BY.getFieldName()))) {
            this.strictInsertFill(metaObject, CREATED_BY.getFieldName(), String.class, DbConstant.FAP_ADMIN);
        }
        if (Objects.isNull(metaObject.getValue(LAST_UPDATE_DATE.getFieldName()))) {
            this.strictInsertFill(metaObject, LAST_UPDATE_DATE.getFieldName(), LocalDateTime.class, now);
        }
        if (hasNoText(metaObject.getValue(LAST_UPDATED_BY.getFieldName()))) {
            this.strictInsertFill(metaObject, LAST_UPDATED_BY.getFieldName(), String.class, DbConstant.FAP_ADMIN);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        LocalDateTime now = LocalDateTime.now();
        if (Objects.isNull(metaObject.getValue(LAST_UPDATE_DATE.getFieldName()))) {
            this.strictInsertFill(metaObject, LAST_UPDATE_DATE.getFieldName(), LocalDateTime.class, now);
        }
        if (hasNoText(metaObject.getValue(LAST_UPDATED_BY.getFieldName()))) {
            this.strictInsertFill(metaObject, LAST_UPDATED_BY.getFieldName(), String.class, DbConstant.FAP_ADMIN);
        }
    }

    private boolean hasNoText(Object obj) {
        return null == obj || !StrUtil.isNotBlank(obj.toString());
    }
}


/**
 * 审计字段
 *
 */
public enum SpecialFieldEnum {

    /**
     * 创建时间
     */
    CREATION_DATE("creation_date", "creationDate"),
    /**
     * 创建人
     */
    CREATED_BY("created_by", "createdBy"),
    /**
     * 更新人
     */
    LAST_UPDATED_BY("last_updated_by", "lastUpdatedBy"),
    /**
     * 更新时间
     */
    LAST_UPDATE_DATE("last_update_date", "lastUpdateDate"),
    /**
     * 逻辑删除标识
     */
    DELETE_FLAG("delete_flag", "deleteFlag"),
    /**
     * 版本
     */
    DATA_VERSION("data_version", "dataVersion");

    private String columnName;
    private String fieldName;

    private SpecialFieldEnum(String columnName, String fieldName) {
        this.columnName = columnName;
        this.fieldName = fieldName;
    }

    public String getColumnName() {
        return this.columnName;
    }

    public String getFieldName() {
        return this.fieldName;
    }
}

 5.配置文件加入DbFieldFillHandler

 


import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.midea.fap.aic.infra.handler.DbFieldFillHandler;
import org.springframework.context.annotation.Bean;

/**
 * Mybatis 配置
 */
public class MybatisConfig {

    @Bean
    public MetaObjectHandler dbFieldFillHandler() {
        return new DbFieldFillHandler();
    }
}

 

标签:metaObject,String,getFieldName,MetaObjectHandler,import,属性,LAST,赋值
From: https://www.cnblogs.com/huangdh/p/17757422.html

相关文章

  • 无涯教程-ASP.NET Core - 属性路由
    在本章中,无涯教程将学习另一种路由方法,即基于属性的路由,通过基于属性的路由,可以在控制器类和这些类内部的方法上使用C#属性,这些属性具有告诉ASP.NETCore何时调用特定控制器的元数据。它是基于约定的路由的替代方法。按照出现的顺序,注册的顺序对路由进行判断,但是映射多个路由是......
  • Flex布局的三个属性要深刻理解!
    在我们日常开发中,flex布局可以说是家常便饭,对于很多的我们来说(你懂得^_^),可能我们用的比较多的应该就是垂直居中里,也就是下面这段代码:.flex-box{display:flex;justify-content:center;align-items:center;}写的非常好(^_^)!然后我们都知道这个是定义在父元素的,布局效果是......
  • Asp.net core中HttpResponse常用属性及Status code
    在ASP.NETCore中,HttpResponse表示HTTP响应,其中包括一些常用的属性和方法,用于设置HTTP响应的各种属性。HTTP响应通常由一个HTTP状态码,HTTP头(headers),和HTTP主体(body)组成。以下是一些常用的HttpResponse属性和一些常见的HTTP状态码及其含义:HttpResponse常用属性:StatusCode:用......
  • 图扑 HT for Web 风格属性手册教程
    图扑软件明星产品HTforWeb是一套纯国产化独立自主研发的2D和3D图形界面可视化引擎。HTforWeb(以下简称HT)图元的样式由其Style属性控制,并且不同类型图元的Style属性各不相同。为了方便查询和理解图元的Style属性,以及更加便捷地应用和理解每个属性的作用,图扑HT提......
  • 表单元素的enctype属性
    表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1)application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。2)multipart/form-data:这种编码方式的表......
  • 数据库的字段属性
    Unsigned:无符号的整数声明了该列不能声明为负数zerofill:0填充的不足的位数使用0来填充 int(3)  ,5=005自增:通常理解为自增,自动在上一条的基础上+1(默认)通常用来设计唯一的主键~index,必须是整数类型可以自定义设计主键自增的起始值......
  • 在ts时使用axios请求类型定义增加属性
    1.需求在后台请求中有一些请求数据量比较大无法一下返回,需要增加loading动画,为了方便控制想在请求的时候增加一个参数isLoading,默认关闭,传真值时开启动画。这便需要拓展axios中增加个性化参数配置。但是如何进行类型的定义呢?2.操作 如上,在做左边增加了isLoading参数,代码......
  • 总结selenium 中 js 更改隐藏属性
    第一种多个元素被隐藏时通过js修改对比照片这个是没隐藏的 对比照片 这个是隐藏的 driver=webdriver.Chrome()#urlurl=r"http://127.0.0.1:5000/"driver.get(url)print("已打开网页")#执行js脚本,将元素的display属性设置为block,......
  • python实现同时给多个变量赋值的方法 Simultaneous Assignments
    SimultaneousAssignmentsx,y=y,x这个赋值的执行流程是什么?python的多元赋值原理是tuple的元组封装(tuplepacking)和序列拆封(sequenceunpacking)。t=12345,54321,'hello!'这是元组封装(tuplepacking)的例子,将多个值放进tuple里。x,y,z=t元组封装(tuplepacking)的......
  • 浮动属性 清浮动
    浮动效果:1.见缝插针,第一行位置不够时,并不会另起一行,哪有位置补在哪2.文字不会因为盒子进行浮动被覆盖3.谁先进行浮动,谁在最旁边浮动的作用:1.定义网页中其他文本如何围绕该元素显示2.让竖着拍的东西横着来<style>.red{......