公共字段自动填充

ops/2024/10/15 22:28:55/

因为在后端开发中需要用到很多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);}


http://www.ppmy.cn/ops/126144.html

相关文章

Go语言Gin框架的常规配置和查询数据返回json示例

文章目录 路由文件分组查询数据库并返回jsonservice层controller路由运行效果 启动多个服务 在 上一篇文章《使用Go语言的gorm框架查询数据库并分页导出到Excel实例》 中主要给大家分享了较多数据的时候如何使用go分页导出多个Excel文件并合并的实现方案,这一篇文章…

git pull

# git reset --hard # git clean -f #git pull git pull origin master

MySQL事务、存储引擎

目录 一、事务 1.1 事务的概念 1.2 事务的ACID特点 1.2.1 原子性 1.2.2 一致性 1.2.3 隔离性 1.2.4 持久性 1.3 事务控制语句 1.4 使用 set 设置控制事务 二、存储引擎 2.1 存储引擎的定义 2.2 常用的存储引擎 2.3 存储引擎的管理操作 三、死锁 3.1 定义 3.2 死…

【git】本地玩坏了不必重新clone

#没错,事情发生的起因就是我把本地玩坏了……然后傻乎乎地打算rm掉重新再clone,巨慢真的,然后我就又被涨知识了,分享一下,如果已经知道的就笑笑路过吧哈哈哈# 场景 需要重新clone的,恢复到与远端仓库一致…

站在用户视角审视:以太彩光与PON之争

作者:科技作家-郑凯 园区,是企业数字化转型的“中心战场”。 云计算、大数据、人工智能等数智化技术在园区里“战火交织”;高清视频、协同办公,智慧安防等大量创新应用产生的海量数据在园区内“纵横驰骋”;加上大量的IOT和智能化设备涌入“战场”,让园区网络面对着难以抵御的…

【Java 问题】集合——List

List 1.说说有哪些常见集合?2.ArrayList和LinkedList有什么区别?3.ArrayList的扩容机制了解吗?4.ArrayList怎么序列化的知道吗? 为什么用transient修饰数组?5.快速失败(fail-fast)和安全失败(fail-safe)了解吗&#xf…

代码随想录算法训练营第三十五天|452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间

452. 用最少数量的箭引爆气球 在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结…

Java 包装器一口气讲完!(≧∇≦)ノ

目录 Java 数据类型包装器 Java数据类型教程 - Java数据类型包装器 方法 例子 valueOf() Java 数字数据类型 Java数据类型教程 - Java数字数据类型 例子 方法 值 Java 字符数据类型 Java数据类型教程 - Java字符数据类型 例子 Java Boolean包装类 Java数据类型教程…