mybatis 插入创建人和创建时间
时间: 2023-05-03 15:07:48 浏览: 156
在MyBatis中插入创建人和创建时间,一般采用以下方法:
1.在数据库中添加创建人和创建时间所对应的字段,这两个字段一般为timestamp类型。
2.修改业务实体类,增加对应的创建人和创建时间属性,并在对应的setter方法内设置值。
3.在Mapper.xml文件的insert语句中添加对应的创建人和创建时间字段,并使用#{属性名}方式引用业务实体类中对应的属性。
例如:insert into table_name (field1, field2, create_by, create_time) values (#{field1}, #{field2}, #{createBy}, #{createTime})
4.修改数据源配置文件,添加插件配置。插件的作用是在执行sql语句前后拦截执行的操作,并进行一些处理。其中,可以使用Interceptor接口实现新增操作时自动填充创建人和创建时间的功能。具体实现如下:
a.实现Interceptor接口,并重写intercept方法。
b.在intercept方法内获取SqlCommandType.CREATE类型的sql语句,判断是否为新增操作。
c.如果是新增操作,则获取参数中的业务实体类对象,并对应设置创建人和创建时间属性的值。
d.最后,通过invocation.proceed()执行sql语句。
此方法可以在不修改业务代码的情况下,实现自动化插入创建人和创建时间的功能。
相关问题
mybatis-plus自动填充创建人id
可以通过实现 `MetaObjectHandler` 接口来实现自动填充创建人id。具体步骤如下:
1. 创建一个类实现 `MetaObjectHandler` 接口,实现 `insertFill` 方法:
```java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createUserId", String.class, getCurrentUserId());
}
@Override
public void updateFill(MetaObject metaObject) {
// 更新时不需要填充
}
private String getCurrentUserId() {
// 获取当前登录用户的id,可以从ThreadLocal等地方获取
return "123";
}
}
```
2. 在需要自动填充的实体类中,添加 `@TableField` 注解,设置 `fill = FieldFill.INSERT`:
```java
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
@TableField(fill = FieldFill.INSERT)
private String createUserId;
}
```
这样,在插入数据时,`createUserId` 字段就会自动填充为当前登录用户的id。
异步线程的mybatisplus自动填充创建人
在Mybatis-Plus中,可以使用ThreadLocal来实现异步线程的自动填充创建人。ThreadLocal是一个线程局部变量,它为每个线程提供独立的变量副本,因此可以在异步线程中获取到当前登录用户的id。
下面是一个示例代码,演示了如何使用ThreadLocal来实现异步线程的Mybatis-Plus自动填充创建人:
```java
// 定义一个ThreadLocal变量,用于存储当前登录用户的id
private static ThreadLocal<Long> userIdThreadLocal = new ThreadLocal<>();
// 在登录时将当前用户的id存入ThreadLocal
public void login(Long userId) {
userIdThreadLocal.set(userId);
}
// 在注销时清除ThreadLocal中的数据
public void logout() {
userIdThreadLocal.remove();
}
// 自定义Mybatis-Plus的MetaObjectHandler
@Component
public class MyMetaObjectHandler extends MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
// 获取当前登录用户的id
Long userId = userIdThreadLocal.get();
if (userId != null) {
// 自动填充创建人字段
this.strictInsertFill(metaObject, "createUser", Long.class, userId);
}
}
@Override
public void updateFill(MetaObject metaObject) {
// 获取当前登录用户的id
Long userId = userIdThreadLocal.get();
if (userId != null) {
// 自动填充更新人字段
this.strictUpdateFill(metaObject, "updateUser", Long.class, userId);
}
}
}
```
在登录时,调用`login`方法将当前用户的id存入ThreadLocal中。在注销时,调用`logout`方法清除ThreadLocal中的数据。
然后,自定义一个继承自`MetaObjectHandler`的类,并将其注入为Spring的组件。在该类中,重写`insertFill`和`updateFill`方法,在这两个方法中获取ThreadLocal中存储的当前登录用户的id,并使用`strictInsertFill`和`strictUpdateFill`方法自动填充创建人和更新人字段。
这样,当进行插入或更新操作时,Mybatis-Plus会自动调用`insertFill`和`updateFill`方法,从ThreadLocal中获取当前登录用户的id,并自动填充到对应的字段中。