目录
1.在实体类属性上加入@TableField注解,在注解中设置属性,指定自动填充的策略
2.按照mybatis plus框架要求编写元数据对象处理器(一个类)
1.ThreadLocal并不是一个线程(Thread),而是线程(Thread)的局部变量
四、通过ThreadLocal获取创建用户和更新用户的实现步骤
1.编写BaseContext工具类,基于ThreadLocal封装的工具类
3.在MyMetaobjectHandler的方法中调用BaseContext获取登录用户的id
4.代码:元数据对象处理器(MyMetaObjecthandler)
一、问题分析
1.多次编写相同的字段赋值代码,会让代码杂糅
当我们进行系统的某些管理功能时,比如员工管理中的新增员工,虽然前台页面没有显示某些字段,但数据库表中存在的一些不为空字段仍然需要我们赋值。因此就需要我们在controller中设置创建时间、创建人、修改时间、修改人等字段;员工管理中的编辑员工,需要设置修改时间和修改人等字段。这些字段属于公共字段,也就是很多数据库表中都有这些字段,很多功能中都会用到这些字段。如果功能太多,然后又在每个功能中都编写相同的赋值代码,会让代码杂糅。
2.考虑将公共字段放在某个地方统一处理,来简化开发
使用Mybatis Plus提供的公共字段自动填充功能,在插入或更新的时候为指定字段赋予指定的值,统一对这些字段进行处理。
controller中新增员工的代码:
/**
* 新增员工
*
* @param employee 新增的员工信息
* @return 结果信息
*/
@PostMapping
//@RequestBody:将json格式的数据封装到Employee对象中
public R<String> save(HttpServletRequest request, @RequestBody Employee employee) {
log.info("新增员工,员工信息:{}", employee.toString());
//设置初始密码123456,需要进行md5加密处理
employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
//LocalDateTime.now()获取当前系统时间
employee.setCreateTime(LocalDateTime.now()); //设置创建时间
employee.setUpdateTime(LocalDateTime.now()); //设置更新时间
//获取当前登录用户
Long empId = (Long) request.getSession().getAttribute("employee");
//获取登录用户的id
employee.setCreateUser(empId); //设置创建人
employee.setUpdateUser(empId); //设置更新人
employeeService.save(employee);
return R.success("新增员工成功");
}
二、实现步骤
1.在实体类属性上加入@TableField注解,在注解中设置属性,指定自动填充的策略
(1)哪些属性是公共字段,就在哪些属性上加上该注解,
(2)填充的策略:FieldFill(java提供的api,是一个枚举)
(3)代码:员工实体类
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 员工实体类
*/
@Data
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private Long id; //主键
private String username; //用户名
private String name; //姓名
private String pass