mybatis-plus 实现自动填充时间

1.引入pom依赖

     <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

 <!-- 时间格式化需要-->
	<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.17</version>
        </dependency>
	

2.编写基类,将时间放入基类,po继承基类

@Data
@FieldNameConstants
@EqualsAndHashCode(callSuper = false)
public class BaseEntity<T> extends Model {

    private static final long serialVersionUID = 1L;

    /**
     * 创建时间
     **/
    @TableField(fill = FieldFill.INSERT)
    //传给前端展示格式化后的时间
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
    protected LocalDateTime createTime;

    /**
     * 更新时间
     **/
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
    protected LocalDateTime updateTime;

FieldFill.INSERT:该字段在插入时填充。
FieldFill.INSERT_UPDATE:该字段在插入更新时填充。

日期格式化注解:

@DateTimeFormat(pattern=“yyyy-MM-dd”):反序列化生效
用于将前端传的字符串日期转为日期类型(入参格式化)
@DateTimeFormat 注解的 pattern 属性值指定的日期时间格式并不是将要转换成的日期格式,这个指定的格式是和传入的参数对应的
假如注解为:@DateTimeFormat(pattern=“yyyy/MM/dd HH:mm:ss”)则传入的参数应该是这样的:2022/06/02 12:01:22

** @JsonFormat(timezone = “GMT+8”,pattern = “yyyy-MM-dd”): 序列化生效**
用于将后端日期格式化后返回给前端(出参格式化),默认采用国际标准时间GMT进行格式化的,而在国内默认时区使用的是CST时区,两者相差8小时需要添加属性timezone = “GMT+8” 来同步。

@JsonSerialize(using = LocalDateTimeSerializer.class):使用LocalDateTimeSerializer组件序列化字段
此注解用于属性或者getter方法上,用于在序列化时嵌入开发者自定义的代码。

1)首先定义一个处理序列化的类继承JsonSerializer类并实现serialize方法。

public class MyDateSerialize extends JsonSerializer<Date> {

    //定义日期格式
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    @Override

    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
        jsonGenerator.writeString(sdf.format(date));
    }

}

2)在属性上使用注解标识

@JsonSerialize(using = MyDateSerialize .class)

@JsonDeserialize(using = LocalDateTimeDeserializer.class):使用LocalDateTimeDeserializer组件反序列化字段
此注解用于属性或者setter 方法上,用于在反序列化时嵌入开发者自定义的代码。

1)首先定义一个处理反序列化的类继承JsonDeserializer类并实现deserialize方法。

public class MyJsonDeserializer extends JsonDeserializer<Date>
{
    public static final SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @Override
    public Date deserialize(com.fasterxml.jackson.core.JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, com.fasterxml.jackson.core.JsonProcessingException {
        try
        {
            if(jsonParser!=null&&StringUtils.isNotEmpty(jsonParser.getText())){
                return format.parse(jsonParser.getText());
            }else {
                return null;
            }
 
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
            throw new RuntimeException(e);
        }
    }
}

2)使用

  @JsonDeserialize(using = MyJsonDeserializer .class)

这两种通常使用在客户端的入参和服务端出参不同时,如性别前端展示男或女,服务器一般1或2这样不相同但存在对应关系的可以使用这两个注解自动完成映射。

3.po实现该基类

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_dept")
@Builder
public class Dept extends BaseEntity<Dept> implements Serializable {

    private static final long serialVersionUID = 1L;

    /** 部门ID */
    @TableId(value="dept_id" ,type=IdType.INPUT)
    private Long deptId;

    /** 父部门ID */
    @TableField("parent_id")
    private Long parentId;

    /** 部门名称 */
    private String name;

    /** 显示顺序 越大代表在父级中排列越靠前*/
    private Integer orderNum;

    /** 负责人 department_leader*/
    @TableField("leader")
    private String departmentLeader;



}

4.编写填充时间数据

MetaObjectHandler 是mybatis-plus提供的插件,insertFill可实现在插入时对字段进行自定义填充,updateFill在更新时对字段进行自定义填充。

@Component
public class AutoFillMetaInfoHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
 	 //如果属性有值则不覆盖,如果填充值为null则不填充.
        this.strictInsertFill(metaObject, BaseEntity.Fields.createTime, LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, BaseEntity.Fields.updateTime, LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
     //无论属性是否有值都填充
        this.setFieldValByName(BaseEntity.Fields.updateTime, LocalDateTime.now(), metaObject);
    }
}

5.测试

5.1 新增

createTime和updateTime都填充了。
在这里插入图片描述

在这里插入代码片

5.2 更新

@Test
    public void testUpdate(){
        deptService.updateById(Dept.builder().deptId(1L).name("test").build());
    }

结果:

只有更新时间填充了。
在这里插入图片描述

6.生效与失效场景

填充生效场景:

updateById(T entity) updateBatchById(Collection<T> entityList)      
saveOrUpdate(T entity) save(T entity) update(T t,Wrapper      
updateWrapper),t不能为空,否则自动填充失效 LambdaQueryWrapper<User> wrapper= new  
LambdaQueryWrapper<>(new User()); LambdaUpdateWrapper<User> wrapper =
Wrappers.lambdaUpdate(new User());

填充不生效场景:

update(Wrapper updateWrapper)
检查字段有没有加上注解 @TableField(fill = FieldFill.INSERT_UPDATE)
有没有实现 MetaObjectHandler 接口 ,并且加入到 Spring 容器中
xml 写的也无效
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值