提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
使用步骤
1.给实体类需要自动填充的字段添加注解
代码如下(示例):
注解中的fill属性表示字段填充标记,配合自动填充使用。
fill对应的值:
DEFAULT :默认不处理
INSERT : 插入操作时进行填充字段
UPDATE :更新操作时填充字段
INSERT_UPDATE :插入和更新操作时填充字段
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
2.自定义实现类实现MetaObjectHandler接口
代码如下(示例):
当需要执行新增或者修改操作的时候,业务层对实体类属性赋值,但是,createTime、updateTime、createUser、updateUser这四个属性除外,因为它们统一由当前类的metaObject对象进行赋值,值的来源根据实际情况而定,比如createTime和updateTime获取的当前系统时间。
BaseContext是基于Threadlocal自定义的工具类,用来获取当前登录对象id
@Component //需要将当前类交给spring容器保管
public class MyMetaObjecthandler implements MetaObjectHandler {
/**
* 插入操作,自动填充。所有执行insert语句的时候执行该方法
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
System.out.println("metaObject-insert = " + metaObject);
metaObject.setValue("createTime", LocalDateTime.now()); // 添加用户时间
metaObject.setValue("updateTime", LocalDateTime.now()); // 修改用户时间
metaObject.setValue("createUser", BaseContext.getCurrentId()); // 添加人的id
metaObject.setValue("updateUser", BaseContext.getCurrentId()); // 更新人的id
}
/**
* 更新操作,自动填充。所有执行update语句的时候执行该方法
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
System.out.println("metaObject-update = " + metaObject);
long id = Thread.currentThread().getId();
log.info("线程id = " + id);
metaObject.setValue("updateTime", LocalDateTime.now()); // 修改用户时间
metaObject.setValue("updateUser", BaseContext.getCurrentId()); // 更新人的id
}
3.BaseContext工具类
代码如下(示例):
ThreadLocal:在同一个线程中开辟一块作用域空间存放数据。且作用域仅在同一个线程中,与别的线程具有隔离性。
此处setCurrentId可以理解为,创建了一个id的变量并且赋值。 getCurrentId可以理解为,获取id的值。
/**
* 基于ThreadLocal封装工具类,用户保存和获取当前登录用户id
*/
public class BaseContext {
private static ThreadLocal<Long> threadLocal = new ThreadLocal<Long>();
/**
* 添加Id值
* @param id
*/
public static void setCurrentId(Long id) {
threadLocal.set(id);
}
/**
* 获取Id值
* @return
*/
public static Long getCurrentId() {
return threadLocal.get();
}
}