作用:
可以在数据对数据库做插入或更新操作的时候,自动赋值数据操作人、操作时间、默认值等属性。
示例:
以文章发布为例,在发布Artice的时候,我们无需再去关心过多的与业务无关的字段值,最终只需要关心title、content两个核心数据即可,其他的数据均会被框架处理。
其中分别涉及了数据插入数据更新数据插入及更新三个处理时机,其中每个时机均可以插入系统时间及自定义用户信息。
@Data@Table(comment = "文章")public class Article {// 字符串类型的ID,默认也是雪花算法的一串数字(MP的默认功能)@ColumnComment("主键")private String id;@ColumnComment("标题")private String title;@ColumnComment("内容")private String content;// 默认值用法:文章默认激活状态,ACTIVE为ActicleStatusEnum[ACTIVE, INACTIVE]的枚举名称字符串@DefaultValue("ACTIVE")@ColumnComment("内容")private ActicleStatusEnum status;@ColumnComment("发布时间")// 【插入】数据时候会自动获取系统当前时间赋值,支持多种数据类型,具体可参考@OptionDate注解详细介绍(注意,这里的时间是MP执行insert的操作的时候的时间,并不是对象构建时候的时间)@InsertOptionDateprivate Date publishedTime;@ColumnComment("发布人")// 【插入】的时候,自动填充用户id,UserIdAutoFillHandler看下面代码@InsertOptionUser(UserIdAutoFillHandler.class)private String publishedUserId;@ColumnComment("发布人名字")// 【插入】的时候,自动填充用户名字,UsernameAutoFillHandler看下面代码@InsertOptionUser(UsernameAutoFillHandler.class)private String publishedUsername;@ColumnComment("最后更新时间")// 【插入和更新】数据时候会自动获取系统当前时间赋值,支持多种数据类型,具体可参考@OptionDate注解详细介绍@InsertUpdateOptionDateprivate Date publishedTime;@ColumnComment("最后更新人")// 【更新】的时候,自动填充用户id,UserIdAutoFillHandler看下面代码// @UpdateOptionUser(UserIdAutoFillHandler.class)// 【插入和更新】的时候,自动填充用户id,UserIdAutoFillHandler看下面代码@InsertUpdateOptionUser(UserIdAutoFillHandler.class)private String publishedUserId;@ColumnComment("最后更新人名字")// 【更新】的时候,自动填充用户名字,UsernameAutoFillHandler看下面代码// @UpdateOptionUser(UsernameAutoFillHandler.class)// 【插入和更新】的时候,自动填充用户名字,UsernameAutoFillHandler看下面代码@InsertUpdateOptionUser(UsernameAutoFillHandler.class)private String publishedUsername;}
/*** 全局获取用户ID* 此处实现IOptionByAutoFillHandler接口和AutoFillHandler接口均可,建议实现IOptionByAutoFillHandler接口,* 因为框架内的BaseEntity默认需要IOptionByAutoFillHandler的实现。后面会讲到BaseEntity的使用。*/@Componentpublic class UserIdAutoFillHandler implements IOptionByAutoFillHandler<String> {/*** @param object 当前操作的数据对象* @param clazz 当前操作的数据对象的class* @param field 当前操作的数据对象上的字段* @retur*/@Overridepublic String getVal(Object object, Class<?> clazz, Field field) {RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();// 配合网关或者过滤器,token校验成功后就把用户信息塞到header中return request.getHeader("user-id");}}
/*** 全局获取用户名*/@Componentpublic class UsernameAutoFillHandler implements AutoFillHandler<String> {/*** @param object 当前操作的数据对象* @param clazz 当前操作的数据对象的class* @param field 当前操作的数据对象上的字段* @return 当前登录用户id*/@Overridepublic String getVal(Object object, Class<?> clazz, Field field) {RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();// 配合网关或者过滤器,token校验成功后就把用户信息塞到header中return request.getHeader("user-name");}}
