首页 > 其他分享 >实现 公共字段自动填充【创建时间/创建人/修改id/修改id】

实现 公共字段自动填充【创建时间/创建人/修改id/修改id】

时间:2024-08-23 15:07:05浏览次数:11  
标签:SET class id 修改 AutoFill 公共 创建人 entity public

实现 公共字段自动填充【创建时间/创建人/修改id/修改id】

技术栈

  1. 枚举
  2. 自定义注解
  3. AOP
  4. 反射

实现思路

  1. 编写枚举,用于标识数据库操作类型
  2. 自定义注解AutoFill,用于标识需要进行公共字段自动填充的方法
  3. 将Mapper的方法名写成常量类,提高代码规范
  4. 自定义切面类AutoFillAspect,统一拦截加入了AutoFill注解的方法,通过反射为公共字段赋值
  5. 在Mapper的方法上加入AutoFill注解

代码实现

  1. 编写枚举,用于标识数据库操作类型

    public enum OperationType {
    
        //更新操作
        UPDATE,
    
        //插入操作
        INSERT
    
    }
    
  2. 自定义注解AutoFill,用于标识需要进行公共字段自动填充的方法

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface AutoFill {
    
        //数据库操作类型
        OperationType value();
    }
    
  3. 将Mapper的方法名写成常量类,提高代码规范

    //公共字段自动填充相关常量
    public class AutoFillConstant {
    
        //实体类中的方法名称
        public static final String SET_CREATE_TIME = "setCreateTime";
        public static final String SET_UPDATE_TIME = "setUpdateTime";
        public static final String SET_CREATE_USER = "setCreateUser";
        public static final String SET_UPDATE_USER = "setUpdateUser";
    }
    
  4. 自定义切面类AutoFillAspect

    /**
     * 自定义切面,实现公共字段自动填充
     */
    @Aspect
    @Component
    @Slf4j
    public class AutoFillAspect {
    
        /**
         * 切入点
         */
        @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.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];//拿到实体对象
    
            //准备数据 实体对象的公共属性【时间和登录id】
            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();
                }
            }
        }
    }
    
  5. 在Mapper的方法上加入AutoFill注解

    @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);
    

实现了表格公共字段自动填充后,在service层编写插入或者修改实体的时候就不需要重复设置 修改时间、修改id等

  //设置修改时间、修改人
//        category.setUpdateTime(LocalDateTime.now());
//        category.setUpdateUser(BaseContext.getCurrentId());这些不再需要重复设置

标签:SET,class,id,修改,AutoFill,公共,创建人,entity,public
From: https://www.cnblogs.com/zydevelop/p/18376011/zy_autofill

相关文章

  • centos单网卡配置VLAN,ubuntu当网卡配置VLAN,vlanid=1000
    root@ubuntu:~#cat/etc/netplan/01-netcfg.yaml#Thisfiledescribesthenetworkinterfacesavailableonyoursystem#Formoreinformation,seenetplan(5).network:version:2renderer:networkdethernets:enp9s0:dhcp4:novlans:......
  • Android Qcom USB Driver学习(八)
    因为要看usbcharging的问题,所以需要补充一下battery的相关知识,算是入门吧BATSCH(1)VBATT_VSNS_P(2)BAT_THERM(3)I2C_SDA(4)I2C_SCL(5)VBATT_VSNS_Msbl1_hw_pre_ddr_init:(1)pm_device_init(2)pm_driver_init(3)pm_sbl_chg_init(1)pm_device_init没有研究过,也是......
  • Android Qcom USB Driver学习(七)
    最近遇到了USB插拔后,系统重启的问题,抓取串口log发现如下问题,log中查看trace分析就是空指针造成的panicUnabletohandlekernelreadfromunreadablememoryatvirtualaddress0000000000000000Memabortinfo:ESR=0x96000005Exceptionclass=DABT(currentEL),......
  • VirGL与NVIDIA GPU一起运行 - 2024(QEMU)
    安装Nvidia驱动程序550和下一版本(如果需要检查,请将550更改为555等)。sudoadd-apt-repositoryppa:graphics-drivers/ppasudoaptupdatesudoaptinstallnvidia-driver-550禁用集成GPU第1步(只能通过英伟达™(NVIDIA®(英伟达™))GPU运行,不能使用其他GPU)(如果无法......
  • 重置MySQL表中自增字段的起始id
    导言在进行项目开发的时候,往往会自己编辑一些测试用例,但是这些用例会影响我们自增字段的起始id,虽然对我们项目没有多大影响,但是对于强迫症来说,不是从1顺着一个一个开始,感觉很不适应,所以特意搜了一下方法,然后记录一下处理方法mysql给我们提供了强大的函数功能,其中ALTERTABLE......
  • Jenkins: 重置管理员密码,如何修改用户的登录密码
    修改用户密码1.打开前台首页,依次进入系统管理 -> 安全 -> 全局安全配置,在“认证(Authentication)”->安全域->选择“Jenkins专有用户数据库”,取消勾选“允许用户注册”,在授权策略->选择“登录用户可以做任何事”,取消“匿名用户具有可读权限”,完成后点“保存”如下图 2.......
  • Android Qcom USB Driver学习(六)
    眼图基础知识与详解10分钟教会你看眼图USB2.0HUB眼图调试经验总结一篇文章教你如何全面了解眼图测试!预加重与去加重对眼图的影响关于USB通信阻抗匹配的问题硬件调试——眼图几个经典案例眼图常见问题分析包含双眼皮的情况PHYTunningdevicetree:qusb_phy0:qusb@1613......
  • burpsuite xssValidator插件(xss插件)
    安装1.商城安装插件2.安装环境DownloadPhantomJShttps://phantomjs.org/download.htmlGitHub-NetSPI/xssValidator:ThisisaburpintruderextenderthatisdesignedforautomationandvalidationofXSS......
  • 【Android笔记】Android APK编译打包流程
    前言本文将介绍Android从一个项目打包成APK的过程,其中涉及AndroidJava和Kotlin文件、资源文件、清单文件、依赖jar包和so库等在打包过程中处理。步骤总体的打包流程如下图,下面就介绍下详细的打包步骤。1、将aidl文件编译成java文件在构建过程中,Gradle会调用AIDL编......
  • Oseltamivir acid (GS 4071) 是 Oseltamivir phosphate 的活性代谢物 |MedChemExpress
    中文名:奥斯他伟酸CAS:187227-45-8品牌:MedChemExpress(MCE)存储条件:4°C,storedundernitrogen生物活性:Oseltamiviracid(GS4071)是Oseltamivirphosphate的活性代谢物,是一种具有口服生物利用度的强效选择性流感病毒神经氨酸酶抑制剂(IC50=2nM) 对甲型和乙型流......