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

Posted 业余草

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个工具类搞定CRUD的创建人,修改人,时间等字段赋值相关的知识,希望对你有一定的参考价值。

你知道的越多,不知道的就越多,业余的像一棵小草!

成功路上并不拥挤,因为坚持的人不多。

编辑:业余草

juejin.cn/post/6984555714752561183

推荐:https://www.xttblog.com/?p=5242

背景

数据库设计过程中,我们往往会给数据库表添加一些通用字段,比如创建人、创建时间、修改人、修改时间,在一些公司的设计过程中有时会强制要求每个表都要包含这些基础信息,以便记录数据操作时的一些基本日志记录。按照平常的操作来说,通用做法是输写 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();
    }
}

下面就核心代码进行介绍和注解说明。

代码介绍

核心代码声明了一个 CommonDaoAspect 切面类,实体类中声明了 4 个核心方法和一个获取用户名信息的方法,UserUtils 是项目中声明的工具类,包含获取用户id、姓名等一些基础信息,大家可以根据自己的实际情况去定义,不要照部就搬。4 个核心方法中,daoUpdate 和 daoCreate 上添加了 @Pointcut 注解,该注解通过声明正则表达式来确定项目包中 dao 目录下哪些方法执行该切面方法。doDaoUpdate 和 doDaoCreate 方法上添加了 @Around 注解,注解中引入了上述两个方法,表示环绕通知,在我们自己 dao 目录下的对应文件目标方法完成前后做增强处理。

项目结构

注解说明

  • @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 开头的方法。

由于时间有限,对于文章中描述不准确或不恰当的地方,希望大家能够及时指出和纠正,在编码的路上一起努力前行。

以上是关于一个工具类搞定CRUD的创建人,修改人,时间等字段赋值的主要内容,如果未能解决你的问题,请参考以下文章

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

3-使用MyBatis实现CRUD

如何创建CRUD方法的多个重载? [关闭]

firebase cloud firestore中某个字段的CRUD子项的最佳方法是啥?

CRUD操作 create创建 read读取 update修改 delete删除

Django_ORM框架_关联字段_CRUD操作