我个人的习惯,通常使用Entity类映射数据库中的表,用Model来映射系统中的一些数据模型。不知道别人都是怎么用的。
前边在MyBatisPlus FastAutoGeneretor中提到过一些。这里在总结一下。
一、Entity类中常用的注解
// 用来标注主键 value 是字段名 type 是主键类型 此处用的是MyBatisPlus自带的雪花算法
@TableId(value = "u_id", type = IdType.ASSIGN_ID)
// 日期时间序列化
@JsonSerialize(using = CustomLocalDateTimeSerializer.class)
// 将日期时间转为字符串
@JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)
// 将字符串转为日期时间
//自动填充
@TableField(fill = FieldFill.INSERT)
@TableField(fill = FieldFill.INSERT_UPDATE)
// 逻辑删除
@TableLogic(value = "0", delval = "1")
// 数据库中不存在的字段
@TableField(exist = false)
// 在生成JSON时需要忽略掉的字段 例如密码
@JsonIgnore
二、序列化方法 将日期时间转为字符串
public class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (null != value){
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
gen.writeString(value.format(dateTimeFormatter));
}else{
gen.writeNull();
}
}
}
三、反序列化方法 将字符串转为日期时间
public class CustomLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {
String text = p.getText();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return LocalDateTime.parse(text, dateTimeFormatter);
}
}
四、自动填充日期时间
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
//this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
//this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
// 或者
//this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
// 或者
//this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
// 或者
//this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
// 或者
//this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
}
}
五、逻辑删除
在Application.propertice中增加逻辑删除的Flag值 也可以在 注解中增加
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
在实体类中增加注解
// 逻辑删除的值配置了porpertice就可以直接用下边的 @TableLogic(delval = "1" , value = "0") //每个实体类中可以定义逻辑删除配置
@TableLogic
@TableField(value = "discard")
六、总结
上述很多注解基本上都是基于MyBatisPlus的能力实现的。除了序列化和反序列化之外。