springboot3公共字段自动填充,创建时间、创建人、修改时间、修改人等
序号 字段名 含义 数据类型
1create_time创建时间datetime
2create_user创建人idbigint
3update_time修改时间datetime
4update_user修改人idbigint1,新增自定义注解
- package com.zidiu.anno;
-
- import com.zidiu.enumeration.OperationType;
-
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
-
- /**
- * 自定义注解,用于标识某个方法需要进行功能字段自动填充处理
- */
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- public @interface AutoFill {
- //数据库操作类型:UPDATE INSERT
- OperationType value();
- }
复制代码 2,自定义切面,实现公共字段自动填充处理逻辑
- package com.zidiu.aspect;
-
- import com.zidiu.anno.AutoFill;
- import com.zidiu.constant.AutoFillConstant;
- import com.zidiu.context.BaseContext;
- import com.zidiu.enumeration.OperationType;
- import lombok.extern.slf4j.Slf4j;
- import org.aspectj.lang.JoinPoint;
- 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;
-
- /**
- * 自定义切面,实现公共字段自动填充处理逻辑
- */
- @Aspect
- @Component
- @Slf4j
- public class AutoFillAspect {
-
- /**
- * 切入点
- */
- @Pointcut("execution(* com.zidiu.mapper.*.*(..)) && @annotation(com.zidiu.anno.AutoFill)")
- public void autoFillPointCut(){}
-
- /**
- * 前置通知,在通知中进行公共字段的赋值
- */
- @Before("autoFillPointCut()")
- public void autoFill(JoinPoint joinPoint){
- log.info("开始进行公共字段自动填充...");
-
- //获取到当前被拦截的方法上的数据库操作类型
- MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象
- AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象
- OperationType operationType = autoFill.value();//获得数据库操作类型
-
- //获取到当前被拦截的方法的参数--实体对象,实体放第一个位置
- Object[] args = joinPoint.getArgs();
- if(args == null || args.length == 0){
- 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){
- //为2个公共字段赋值
- try {
- Method 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();
- }
- }
- }
-
- }
复制代码 3,枚举
- package com.zidiu.enumeration;
-
- /**
- * 数据库操作类型
- */
- public enum OperationType {
-
- /**
- * 更新操作
- */
- UPDATE,
-
- /**
- * 插入操作
- */
- INSERT
-
- }
复制代码 M层使用:
- package com.zidiu.mapper;
-
- import com.github.pagehelper.Page;
- import com.zidiu.anno.AutoFill;
- import com.zidiu.dto.CategoryPageQueryDTO;
- import com.zidiu.entity.Category;
- import com.zidiu.enumeration.OperationType;
- import org.apache.ibatis.annotations.Delete;
- import org.apache.ibatis.annotations.Insert;
- import org.apache.ibatis.annotations.Mapper;
-
- import java.util.List;
-
- @Mapper
- public interface CategoryMapper {
- /**
- * 新增分类
- * @param category
- */
- @AutoFill(value = OperationType.INSERT)
- @Insert("insert into category(type, name, sort, status, create_time, update_time, create_user, update_user)" +
- " VALUES" +
- " (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")
- void insert(Category category);
-
- /**
- * 分类分页查询
- * @param categoryPageQueryDTO
- * @return
- */
- Page<Category> pageQuery(CategoryPageQueryDTO categoryPageQueryDTO);
-
- /**
- * 根据id删除分类
- * @param id
- */
- @Delete("delete from category where id = #{id}")
- void deleteById(Long id);
-
- /**
- * 修改分类
- * @param category
- */
- @AutoFill(value = OperationType.UPDATE)
- void update(Category category);
-
- /**
- * 查询分类
- * @param type
- * @return
- */
- List<Category> list(Integer type);
- }
复制代码
jinhei-waimai.zip
(433.47 KB, 下载次数: 0, 售价: 50 金币)
SpringBoot3+SSM的企业级Java项目实战之外卖小程序
|