因为在后端开发中需要用到很多sql语句,公共字段填充可以很好的减轻代码量
枚举类型(为什么使用枚举类型,因为枚举可以可以用来进行标识):
/*** 数据库操作类型*/
public enum OperationType {/*** 更新操作*/UPDATE,/*** 插入操作*/INSERT}
自定义注解AutoFill,用于标识需要进行公共字段自动填充的方法(标识insert,update方法)
/*** 自定义注解AutoFill,用于标识需要进行公共字段自动填充的方法*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {//数据库操作类型:UPDATE INSERTOperationType value();
}
自定义切面,实现公共字段填充处理逻辑
/*** 自定义切面,实现公共字段填充处理逻辑*/
@Component
@Slf4j
@Aspect
public class AutoFillAspect {/*** 切入点*/@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")public void autoFillPointCut(){}/*** 前置通知,在通知中进行公共字段的赋值*/@Before("autoFillPointCut()")public void autoFill(JoinPoint joinPoint) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {log.info("开始进行公共字段自动填充");//获取到当前被拦截的方法上的数据库操作类型MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象AutoFill annotation = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象OperationType operationType = annotation.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个公共字段来赋值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);}else if(operationType==OperationType.UPDATE){//为2个公共字段赋值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);}}}
在Mapper中使用
@Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user) " +"values"+"(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser})")@AutoFill(value = OperationType.INSERT)void insert(Employee employee);@AutoFill(value = OperationType.UPDATE)void update(Employee employee);
@Insert("insert into category(id, type, name, sort, status, create_time, update_time, create_user, update_user) "+"values"+"(#{id},#{type},#{name},#{sort},#{status},#{createTime},#{updateTime},#{createUser},#{updateUser})")@AutoFill(value = OperationType.INSERT)void add(Category category);@AutoFill(value = OperationType.UPDATE)void update(Category category);
完成公共字段填充后则不再需要在service中的insert和update的公共方法进行赋值
/*** 新增员工* @param employeeDTO*/@Overridepublic void save(EmployeeDTO employeeDTO) {System.out.println("当前线程的id:"+Thread.currentThread().getId());Employee employee=new Employee();//对象属性拷贝BeanUtils.copyProperties(employeeDTO,employee);//设置账号的状态,默认正常状态1表示正常 0表示锁定employee.setStatus(StatusConstant.ENABLE);//设置密码,默认密码123456employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));//设置当前的创建时间和修改时间//employee.setCreateTime(LocalDateTime.now());//employee.setUpdateTime(LocalDateTime.now());//设置当前记录创建人id和修改人id//TODO 后期需要改为当前登录用户的id//employee.setCreateUser(BaseContext.getCurrentId());//employee.setUpdateUser(BaseContext.getCurrentId());employeeMapper.insert(employee);}/*** 编辑员工信息* @param employeeDTO* @return*/@Overridepublic void update(EmployeeDTO employeeDTO) {Employee employee = new Employee();BeanUtils.copyProperties(employeeDTO,employee);//employee.setUpdateTime(LocalDateTime.now());//employee.setUpdateUser(BaseContext.getCurrentId());employeeMapper.update(employee);}
/*** 修改分类* @param categoryDTO* @return*/@Overridepublic void update(CategoryDTO categoryDTO) {Category category = new Category();BeanUtils.copyProperties(categoryDTO,category);//category.setUpdateTime(LocalDateTime.now());//category.setUpdateUser(BaseContext.getCurrentId());categoryMapper.update(category);}/*** 启用、禁用分类* @param status* @param id*/@Overridepublic void startOrStop(Integer status, Long id) {Category category=Category.builder().id(id).status(status)//.updateTime(LocalDateTime.now())//.updateUser(BaseContext.getCurrentId()).build();categoryMapper.update(category);}