目录
事前说明:原视频教程中使用的是mybaits,我想试试能不能通过mybatis-plus做一下这个项目。由于日常工作外加上我的私人生活,视频一天的课,我可能得一周甚至更多时间才能敲完。文章中插入的代码是实现上一个功能的基础上加上新的功能,所以想看这个模块的完整代码,直接看最后一个标题的内容或者通过我的gitee地址看就行。
苍穹外卖mybatis-plus版https://gitee.com/xxyzc/sky-take-out
一、自动填充功能的实现
创建人、创建时间、修改人、修改时间在很多实体类中都存在,如果每做一个增加和修改的功能,就都需要重新做这四个操作:
setCreateTime(LocalDateTime.now()); setUpdateTime(LocalDateTime.now()); setCreateUser(BaseContext.getCurrentId()); setUpdateUser(BaseContext.getCurrentId());,后期维护也不方便。所以为了解决这个问题,设置自动填充功能。
1、在每一个存在这四个属性的类中添加注解
这里以Employee类为例,其他的实体类都需要做如下修改:注解为:@TableField(value = "***", fill = FieldFill.INSERT)和@TableField(value = "***", fill = FieldFill.INSERT_UPDATE)。
其中,value中设置的是数据库中的列名,fill=...是需要进行的操作,有新增,和修改
package com.sky.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
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(value = "create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
//更新时间,新增和修改时都需要自动填充
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
//创建人,新增时需要自动填充
@TableField(value = "create_user", fill = FieldFill.INSERT)
private Long createUser;
//修改人,新增和修改时都需要自动填充
@TableField(value = "update_user", fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
}
2、创建AutoFillAspect类
真正实现自动填充功能的类
package com.sky.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.sky.context.BaseContext;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* 实现了创建时间、创建人、修改时间、修改人自动填充的功能
*/
@Component
@Slf4j
public class AutoFillAspect implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("新增时的自动填充");
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "createUser", Long.class, BaseContext.getCurrentId());
this.strictInsertFill(metaObject, "updateUser", Long.class, BaseContext.getCurrentId());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("修改时的自动填充");
// this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
// this.strictUpdateFill(metaObject, "updateUser", Long.class, BaseContext.getCurrentId());
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("updateUser", BaseContext.getCurrentId());
}
}
完成1、2即可完成这四个属性自动填充功能。