使用的是springboot+mybatis-plus框架
①@DateTimeFormat和@JsonFormat注解干什么用?有什么区别?
@DateTimeFormat注解
出处:org.springframework.format.annotation.DateTimeFormat
作用:主要对Date、Calendar、Long及Joda时间类型的属性进行格式化处理,主要处理前端时间类型与后端pojo对象中的成员变量进行数据绑定,所约束的时间格式并不会影响后端返回前端的时间类型数据格式;
前端入参数据的时间格式必须与注解中定义的时间格式相同,不然会报错,如:@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”) 则入参的格式必须为"2023-5-11 10:53:43";
单使用@DateTimeFormat只能约束前端传回的时间格式,同时不会改变原来数据的响应格式,同时传给前端的时间(中国内)会比实际时间晚8个小时
@JsonFormat注解
出处: com.fasterxml.jackson.annotation.JsonFormat;
作用:将日期类型数据在JSON格式和java.util.Date对象之间转换。约束时间的接收格式和响应格式 (接收和响应的都是JSON字符串) .与传输方向没有关系(前端到后端or后端到前端都可以使用)
@JsonFormat
既可以约束前端传入的时间类型参数格式,也可以约束后端响应前端的时间类型格式(格式为json字符串),即更改原数据响应格式,日期类型数据在JSON格式和java.util.Date对象之间转换,同时添加‘time=“GMT+8”’来使得其使用北京时间。
使用前要求:单独使用@JsonFormat注解时需要先通过@RequestBody将入参参数映射到实体后,@JsonFormat注解才能去对时间格式进行约束;
②@TableId注解是什么
@TableId
出处:com.baomidou.mybatisplus.annotation.TableId;
是专门用在主键上的注解,如果数据库中的主键字段名和实体中的属性名,不一样且不是驼峰之类的对应关系,可以在实体中表示主键的属性上加@Tableid注解,并指定@Tableid注解的value属性值为表中主键的字段名既可以对应上。
string类型的id可使用assign_uuid,要求主键类型必须是String类型,会自动生成UUID进行赋值,需要考虑数据库的字段设计,数据库中的int类型的,所以存不进去,但因为主键自增,如果要修改int类型为varchar类型的话,需要去除主键自增。
③Serializable接口是什么,为什么经常用到
private static final long serialVersionUID = 1L;
在程序中为了能直接以 Java 对象的形式进行保存,然后再重新得到该 Java 对象,这就需要序列化能力。序列化其实可以看成是一种机制,按照一定的格式将 Java 对象的某状态转成介质可接受的形式,以方便存储或传输。其实想想就大致清楚基本流程,序列化时将 Java 对象相关的类信息、属性及属性值等等保存起来,反序列化时再根据这些信息构建出 Java 对象。而过程可能涉及到其他对象的引用,所以这里引用的对象的相关信息也要参与序列化。
序列化id (serialVersionUID)
序列化ID,相当于身份认证,主要用于程序的版本控制,保持不同版本的兼容性,在程序版本升级时避免程序报出版本不一致的错误。
如果定义了private static final long serialVersionUID = 1L,那么如果你忘记修改这个信息,而且你对这个类进行修改的话,这个类也能被进行反序列化,而且不会报错。一个简单的概括就是,如果你忘记修改,那么它是会版本向上兼容的。
如果没有定义一个名为serialVersionUID,类型为long的变量,Java序列化机制会根据编译的class自动生成一个serialVersionUID,即隐式声明。这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。此时如果对某个类进行修改的话,那么版本上面是不兼容的,就会出现反序列化报错的情况。
详细解释:Java对象为啥要实现Serializable接口?
④@EqualsAndHashCode和@Data
暂放
⑤@Transactional