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 写的也无效