公共字段填充
- 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);
}