一个工具类搞定 CRUD 的创建人、修改人、时间等字段赋值!

简介: 数据库设计过程中,我们往往会给数据库表添加一些通用字段,比如创建人、创建时间、修改人、修改时间,在一些公司的设计过程中有时会强制要求每个表都要包含这些基础信息,以便记录数据操作时的一些基本日志记录。

背景

数据库设计过程中,我们往往会给数据库表添加一些通用字段,比如创建人、创建时间、修改人、修改时间,在一些公司的设计过程中有时会强制要求每个表都要包含这些基础信息,以便记录数据操作时的一些基本日志记录。


按照平常的操作来说,通用做法是输写sql时,将这些信息和对象的基本属性信息一起写入数据库,当然,这也是大家习以为常的操作,这种写法无可厚非,但是对于一个高级开发人员来说,如果所有的表都进行如此操作,未免显得有点啰嗦,而且数据表多的话,这样写就有点得不偿失了。


其实还有一种更简便的做法,spring框架大家应该是比较熟悉的,几乎每个公司都会用到,其中aop思想(切面编程)的经典应用场景之一就是日志记录,本文结合aop思想,着重介绍下springboot框架下如何利用切面编程思想实现将创建人、创建时间、更新人、更新时间等基础信息写入数据库。


核心代码

@Aspect
@Component
@Configuration
public class CommonDaoAspect {
    private static final String creater = "creater";
    private static final String createTime = "createTime";
    private static final String updater = "updater";
    private static final String updateTime = "updateTime";
    @Pointcut("execution(* com.xx.xxxx.*.dao.*.update*(..))")
    public void daoUpdate() {
    }
    @Pointcut("execution(* com.xx.xxxx.*.dao.*.insert*(..))")
    public void daoCreate() {
    }
    @Around("daoUpdate()")
    public Object doDaoUpdate(ProceedingJoinPoint pjp) throws Throwable {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes == null) {
            return pjp.proceed();
        }
        HttpServletRequest request = attributes.getRequest();
        String token = request.getHeader("token");
        String username = getUserName();
        if (token != null && username != null) {
            Object[] objects = pjp.getArgs();
            if (objects != null && objects.length > 0) {
                for (Object arg : objects) {
                    BeanUtils.setProperty(arg, updater, username);
                    BeanUtils.setProperty(arg, updateTime, new Date());
                }
            }
        }
        Object object = pjp.proceed();
        return object;
    }
    @Around("daoCreate()")
    public Object doDaoCreate(ProceedingJoinPoint pjp) throws Throwable {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes == null) {
            return pjp.proceed();
        }
        Object[] objects = pjp.getArgs();
        if (objects != null && objects.length > 0) {
            for (Object arg : objects) {
                String username = getUserName();
                if (username != null) {
                    if (StringUtils.isBlank(BeanUtils.getProperty(arg, creater))) {
                        BeanUtils.setProperty(arg, creater, username);
                    }
                    if (StringUtils.isBlank(BeanUtils.getProperty(arg, createTime))) {
                        BeanUtils.setProperty(arg, createTime, new Date());
                    }
                }
            }
        }
        Object object = pjp.proceed();
        return object;
    }
    private String getUserName() {
        return UserUtils.getUsername();
    }
}
复制代码

代码介绍及注解说明

1.代码介绍

核心代码声明了一个CommonDaoAspect切面类,实体类中声明了4个核心方法和一个获取用户名信息的方法,UserUtils是项目中声明的工具类,包含获取用户id、姓名等一些基础信息,大家可以根据自己的实际情况去定义,不要照部就搬。


4个核心方法中,daoUpdate和daoCreate上添加了@Pointcut注解,该注解通过声明正则表达式来确定项目包中dao目录下哪些方法执行该切面方法。doDaoUpdate和doDaoCreate方法上添加了@Around注解,注解中引入了上述两个方法,表示环绕通知,在我们自己dao目录下的对应文件目标方法完成前后做增强处理。



2.注解说明

@Aspect:声明切面类,里面可以定义切入点和通知

@Component:表明该类是spring管理的一个对象

@Pointcut:切入点,通过正则表达式声明切入的时机,本文中是在目标方法(即项目中dao目录下实体类中包含insert或update字符串的方法)执行时加入切入信息,即执行新增或更新时加入创建人和更新人等信息。

@Around:环绕通知,在目标方法完成前后做增强处理,本案例中表示在doCreate和doUpdate方法执行时添加参数信息

注:execution(* com.xx.xxxx..dao..update*(..)) 表示在dao目录下的任何文件中的以update开头的方法


execution(* com.xx.xxxx..dao..insert*(..)) 表示在dao目录下的任何文件中的以insert开头的方法

相关文章
|
缓存 运维 容灾
入行5年,谈谈我在阿里做测试开发的经验
作者在阿里一直从事测试开发相关工作,这几年学习很多、收获很多,作者希望给还在该方向摸爬滚打的同学一些启发和方向。
|
前端开发 JavaScript API
基于Vue+ELement实现增删改查案例与表单验证
基于Vue+ELement实现增删改查案例与表单验证
1534 0
BeanUtils的忽略字段工具类
BeanUtils的忽略字段工具类
832 0
|
2月前
|
存储 弹性计算 运维
阿里云轻量应用服务器38元1年和云服务器99元1年性能、适用场景区别及选择参考
阿里云特价服务器中,38元/年轻量应用服务器与99元/年云服务器ECS受入门用户关注。两者在定位、架构、场景及规则上差异显著:轻量应用服务器简化运维,提供高带宽,适合个人站长等;云服务器ECS则灵活可扩展,具备企业级稳定性,适合长期成本敏感型用户及技术开发者。
|
数据格式
Layui中table数据表格使用方法渲染 返回的数据不符合规范,正确的成功状态码应为:“code“: 0异常处理
Layui中table数据表格使用方法渲染 返回的数据不符合规范,正确的成功状态码应为:“code“: 0异常处理
1974 0
|
运维 安全 数据建模
阿里云SSL证书收费版和免费版SSL有什么区别?全方位对比
阿里云提供免费和个人测试(Pro)及正式版SSL证书。免费版有效期仅3个月,适合个人网站或测试使用;个人测试(Pro)版68元/年,有效期12个月;正式版价格数百至数千元不等,有效期至少1年,支持DV、OV、EV证书类型,具有高安全等级、良好兼容性、稳定OCSP验证、SLA保障及安全保险赔付等优势,并提供最长3年的服务周期与人工客服支持。详情与报价参见SSL官方页面。
2994 126
|
Java 程序员 数据库
SpringBoot实现固定、动态定时任务 | 三种实现方式
SpringBoot实现固定、动态定时任务 | 三种实现方式
697 0
|
JavaScript 前端开发 IDE
[译] 以和为贵!让 ESlint、Prettier 和 EditorConfig 互不冲突
[译] 以和为贵!让 ESlint、Prettier 和 EditorConfig 互不冲突
[译] 以和为贵!让 ESlint、Prettier 和 EditorConfig 互不冲突
|
JavaScript 前端开发 测试技术
[新手入门]todolist增删改查:vue3+ts版本!
【10月更文挑战第15天】[新手入门]todolist增删改查:vue3+ts版本!
|
Java
Java Exception打印及输出到日志
有时候如果打印出异常的错误,并记录下来,这里记录一下
1180 5

热门文章

最新文章