问题:当你有个对象User时,这个User对象的属性还有类似createTime ,updateTime的属性,每次创建这个对象都要设置createTime ,updateTime,对这个对象User进行操作又要来更新它的updateTime,是不是很麻烦???【O(≧口≦)O每次都要多写几行代码 或者 忘记写了 】
首先,先创建 “自定义元数据对象处理器”
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {HashMap<String, Object> map = ThreadLocalUtil.get();Long id = (Long) map.get("id");//获得当前用户的idmetaObject.setValue("createTime", LocalDateTime.now());metaObject.setValue("updateTime", LocalDateTime.now());metaObject.setValue("createUser", id);metaObject.setValue("updateUser", id);}@Overridepublic void updateFill(MetaObject metaObject) {HashMap<String, Object> map = ThreadLocalUtil.get();Long id = (Long) map.get("id");metaObject.setValue("updateUser", id);metaObject.setValue("updateTime", LocalDateTime.now());}
}
使用@TableField注解
public class User {private Long id;private String username;private String nickname;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT)private LocalDateTime createUser;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateUser;
}
@TableField
是MyBatis Plus提供的一个注解,用于标识实体类中的字段与数据库表中的字段之间的映射关系。以下是
@TableField
注解的一些常用属性及其说明:
- value:指定字段在数据库表中的列名。当实体类中的字段名与数据库表的列名不一致时,可以通过这个属性来映射。
- exist:指定字段是否为数据库表中的字段,默认值为 true,表示存在对应的数据库字段。
- fill:指定字段为自动填充字段,可选值有
FieldFill.DEFAULT
、FieldFill.INSERT
、FieldFill.UPDATE
等,用于控制字段在插入或更新时的自动填充策略。- select:指定字段在查询时是否进行查询,默认为 true,即默认情况下会查询该字段。
- condition:指定字段在更新操作时的条件,默认为空字符串,即不指定特定条件。
- update:用于预处理 set 字段自定义注入,可以定义更新时字段的计算表达式。例如,如果设置了
update="%s+1"
,那么在更新时会将字段值加1。使用
@TableField
注解可以灵活地控制实体类与数据库表之间的映射关系,以及字段的各种操作行为,使得ORM(对象关系映射)更加符合业务需求。