公共字段填充
- 1、mybatis-plus
 - 2、mybatis 使用注解加aop
 - 2.1 自定义注解
 - 2.2 自定义切面类
 - 2.3 在mapper上添加上自定义的注解
 
1、mybatis-plus
通过在类上使用如下的注解
@TableField(fill = FieldFill.INSERT) 是 MyBatis-Plus 中的注解,用于自动填充字段的值。MyBatis-Plus 是基于 MyBatis 的一个增强工具,所以这种注解和功能是属于 MyBatis-Plus 的特性。
在 MyBatis-Plus 中,你可以使用 @TableField(fill = FieldFill.INSERT) 注解来自动填充字段值,比如在插入数据时自动设置创建时间或更新时间。为了使用这个功能,你需要定义一个处理器来填充这些字段。
package com.cky.pojo;
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.Data;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * 分类
 */
@Data
public class Category implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    //类型 1 菜品分类 2 套餐分类
    private Integer type;
    //分类名称
    private String name;
    //顺序
    private Integer sort;
    //创建时间
    @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;
    //是否删除
    @TableField(select = false)
    private Integer isDeleted;
}
 
之后再定义一个元数据处理器
package com.cky.common;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * @ClassName MyMetaObjectHandler
 * @Description TODO
 * @Author lukcy
 * @Date 2024/6/25 9:12
 * @Version 1.0
 */
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
      metaObject.setValue("createTime", LocalDateTime.now());
      metaObject.setValue("updateTime", LocalDateTime.now());
      metaObject.setValue("createUser", MythreadLocal.getCurrendId());
      metaObject.setValue("updateUser",MythreadLocal.getCurrendId() );
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        long id = Thread.currentThread().getId();
        log.info("当前线程id{}",id);
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("updateUser",MythreadLocal.getCurrendId());
    }
}
 
2、mybatis 使用注解加aop

2.1 自定义注解
package com.sky.annotation;
import com.sky.enumeration.OperationType;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * @ClassName AutoFilled
 * @Description 自定义填充注解
 * @Author lukcy
 * @Date 2024/7/7 8:58
 * @Version 1.0
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFilled {
    OperationType value();
}
 
2.2 自定义切面类
package com.sky.aspect;
import com.sky.annotation.AutoFilled;
import com.sky.constant.AutoFillConstant;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
/**
 * @ClassName AutoFilledAspect
 * @Description 自定义填充切面类
 * @Author lukcy
 * @Date 2024/7/7 8:59
 * @Version 1.0
 */
@Component
@Slf4j
@Aspect
public class AutoFilledAspect {
   //切入点  定义了只有在哪些包下 以及有哪些注解才其效果
    @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFilled)")
    public void AutoFilledPointCut(){}
    //通知 前置通知 因为要在执行之前给字段赋值
    @Before("AutoFilledPointCut()")
    public void autoFilled(JoinPoint joinPoint){
        log.info("前置通知....");
        //获取方法上的注解确定是insert还是update
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//获得签名
        AutoFilled annotation = signature.getMethod().getAnnotation(AutoFilled.class); //获得注解
        OperationType operationType = annotation.value();
        //获得参数 获得实体
        Object[] args = joinPoint.getArgs();
        if(args.length==0 || args==null){
            return;
        }
        Object entity = args[0];//约定第一个参数为实体
        //获取要赋值的内容
        LocalDateTime now = LocalDateTime.now();
        Long currentId = BaseContext.getCurrentId();
        //通过反射给属性赋值
        if(operationType==OperationType.INSERT){
            //赋值4个
            try {
                Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
                Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
                Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
                setCreateTime.invoke(entity,now);
                setCreateUser.invoke(entity,currentId);
                setUpdateTime.invoke(entity,now);
                setUpdateUser.invoke(entity,currentId);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        else if(operationType==OperationType.UPDATE){
            Method setUpdateTime = null;
            try {
                setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
                setUpdateTime.invoke(entity,now);
                setUpdateUser.invoke(entity,currentId);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
 
2.3 在mapper上添加上自定义的注解
比如:
package com.sky.mapper;
import com.github.pagehelper.Page;
import com.sky.annotation.AutoFilled;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.enumeration.OperationType;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
/**
 * @ClassName CategoryMapper
 * @Description TODO
 * @Author lukcy
 * @Date 2024/7/6 11:06
 * @Version 1.0
 */
@Mapper
public interface CategoryMapper {
    @AutoFilled(value = OperationType.INSERT)
    void insert(Category category);
    Page<Category> page(CategoryPageQueryDTO categoryPageQueryDTO);
    @AutoFilled(value = OperationType.UPDATE)
    void editstatus(Category category);
    /**
     * 根据id删除分类
     * @param id
     */
    @Delete("delete from category where id = #{id}")
    void deletebyId(Long id);
}
                

















