记录一下写代码解决到的问题。用的是mybatisPlus。本来想的是用切点,后面写着发现写不出来了,只好找别方案,这个可能不是最优方案,但是目前阶段对我来时是好点的
1创建一个 MetaAutoFillConfig类,(名字自己随便起),去实现MetaObjectHandler接口。重写 insertFill和updateFill 方法
核心代码如下:
@Component
public class MetaAutoFillConfig implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
// 在插入操作时自动填充的字段
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "createUser", Long.class, getCurrentUserId()); // 替换为获取当前用户ID的逻辑
this.strictInsertFill(metaObject, "updateUser", Long.class, getCurrentUserId()); // 替换为获取当前用户ID的逻辑
}
@Override
public void updateFill(MetaObject metaObject) {
// 在更新操作时自动填充的字段
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateUser", Long.class, getCurrentUserId()); // 替换为获取当前用户ID的逻辑
}
private Long getCurrentUserId() {
// 这里应该根据你的业务逻辑获取当前用户的ID
// 这一部分我是从我登录的时候在线程存放了登录用户的id,然后在这里来拿到登录用户的id的
// 你们这里需要根据自己的方法得到自己登录用户的id或者你们想加入的数据
Long currentId = BaseContext.getCurrentId();
return currentId;
}
}
我简单说明一下,我也怕过几天我自己也忘了
这个部分的createTime 是映射到数据库的字段。
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
这个是我的实体类,采用但是驼峰命名方式
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String username;
private String name;
private String password;
private String phone;
private String sex;
private String idNumber;
private Integer status;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
private LocalDateTime updateTime;
private Long createUser;
private Long updateUser;
}
我数据库里面的表字段不是驼峰的,是这样的
我使用的是mybatsiPlus,我们在yml文件配置中,开启驼峰命名转换就好了
mybatis-plus:
global-config:
db-config:
id-type: auto
#mapper配置文件
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.sky.entity
configuration:
#开启驼峰命名
map-underscore-to-camel-case: true
然后这样还是不可以自动填充上创建人时间等数据的。我也想让它们自动装配上,可是我没搞出来,这时候,还需要手动在对应的实体位置上加上
@TableField(fill = FieldFill.INSERT) 。然后实体就成立这样的。
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String username;
private String name;
private String password;
private String phone;
private String sex;
private String idNumber;
private Integer status;
//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@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;
}
记得要加,虽然还是有点麻烦,但是我不会更好的方法了😭😭
然后,我们运行就会发现在updat语句或者insert语句的时候,这些字段就被加上去了。
你们看我的这个updat操作,里面的参数只有id 和 statsus。并没有设置updatTime,updateUser。然后使用mybaitsPlus的 updateById() 方法进行操作时,公共的字段就被加上去了
/**
* 启动禁用员工账号
*
* @param id
* @param status
* @return
*/
@Override
public Result startOrStop(Long id, Integer status) {
// 调用方法isAdmin() 判断当前登录用户是否是管理员
String isAdmin = isAdmin();
if (AdminConstant.IS_ADMIN.equals(isAdmin)) {
// 是管理员 可以对账号进行启用或者禁用
employeeMapper.updateById(Employee.builder().id(id).status(status).build());
return Result.success("账号状态更改成功!");
} else {
// 不是管理员 提示 无权限
return Result.error(AdminConstant.NO_PERMIT);
}
}
运行后的Mybatis Log
-- 598 -- 2023-09-14 16:51:58.217 DEBUG 6976 --- [nio-8080-exec-1] c.sky.mapper.EmployeeMapper.updateById : ==>
UPDATE
employee
SET
status=0,
update_time='2023-09-14T16:51:58.214',
update_user=-1
WHERE
id=10