比如对于用户增加和修改操作,数据库通常需要记录修改时间,更新时间等字段。
-
在Spring IOC容器放入组件 AutoFillHandler, 该组件需要实现MetaObjectHandler并增对数据表中需要填充的字段做设置
@Component public class AutoFillHandler implements MetaObjectHandler { /** * 插入元对象字段填充(用于插入时对公共字段的填充) * 新增数据时要添加的为: * 1 创建人 * 2 创建时间 * 3 lastupdatetime * * @param metaObject 元对象 */ @Override public void insertFill(MetaObject metaObject) { Long userId = getCurrentUserId(); this.strictInsertFill(metaObject, "createBy", Long.class, userId); // 创建人 this.strictInsertFill(metaObject, "created", Date.class, new Date()); // 创建时间 this.strictInsertFill(metaObject, "lastUpdateTime", Date.class, new Date()); // 修改时间 } /** * 更新元对象字段填充(用于更新时对公共字段的填充) * //1 修改人 * // 2 修改时间 * * @param metaObject 元对象 */ @Override public void updateFill(MetaObject metaObject) { Long userId = getCurrentUserId(); this.strictUpdateFill(metaObject, "modifyBy", Long.class, userId); // 修改人 this.strictUpdateFill(metaObject, "lastUpdateTime", Date.class, new Date()); // 修改时间 } /** * 获取当前操作的用户对象 * @return */ private Long getCurrentUserId() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); // 从安全的上下文里面获取用户的ud if(authentication!=null){ String s = authentication.getPrincipal().toString(); // userId ->Long anonymousUser if("anonymousUser".equals(s)){ //是因为用户没有登录访问时,就是这个用户 return null ; } return Long.valueOf(s) ; } return null ; } }
-
找到JaveBean与数据库表的映射类,在需要填充的字段的TableField注解中增加fill属性
@Data @AllArgsConstructor @NoArgsConstructor @TableName(value = "sys_privilege") public class SysPrivilege { /** * 主键 */ @TableId(value = "id", type = IdType.AUTO) @ApiModelProperty(value="主键") private Long id; /** * 所属菜单Id */ @TableField(value = "menu_id") @ApiModelProperty(value="所属菜单Id") @NotNull private Long menuId; /** * 功能点名称 */ @TableField(value = "name") @ApiModelProperty(value="功能点名称") @NotNull private String name; /** * 功能描述 */ @TableField(value = "description") @ApiModelProperty(value="功能描述") private String description; @TableField(value = "url") @ApiModelProperty(value="") private String url; @TableField(value = "method") @ApiModelProperty(value="") private String method; /** * 创建人 */ @TableField(value = "create_by",fill=FieldFill.INSERT) @ApiModelProperty(value="创建人") private Long createBy; /** * 修改人 */ @TableField(value = "modify_by",fill = FieldFill.UPDATE) @ApiModelProperty(value="修改人") private Long modifyBy; /** * 创建时间 */ @TableField(value = "created",fill = FieldFill.INSERT) @ApiModelProperty(value="创建时间") private Date created; /** * 修改时间 */ @TableField(value = "last_update_time",fill = FieldFill.INSERT_UPDATE) @ApiModelProperty(value="修改时间") private Date lastUpdateTime; }
-
在对 sys_privilege 表做增加,修改操作时,可以忽略对自动填充字段的操作。系统会自动赋值。
自动填充的注意事项:
- 主键不填充,因此不要设置主键的自动填充。
- 根据名称找不到对应的字段,不填充。
- 字段类型与填充值类型不匹配,不填充。
- 填充的字段,需要设置@TableField注解中的fill属性。