sql中还在傻傻的手动添加建立人、建立时间?高级开发工程师不得不知的一个通用技巧!

 背景

数据库设计过程当中,咱们每每会给数据库表添加一些通用字段,好比建立人、建立时间、修改人、修改时间,在一些公司的设计过程当中有时会强制要求每一个表都要包含这些基础信息,以便记录数据操做时的一些基本日志记录。按照日常的操做来讲,通用作法是输写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目录下的对应文件目标方法完成先后作加强处理。面试

2b563f0110b21725310006971ae94189.png

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开头的方法spring

最后

最近我整理了整套《JAVA核心知识点总结》,说实话 ,做为一名Java程序员,不论你需不须要面试都应该好好看下这份资料。拿到手老是不亏的~个人很多粉丝也所以拿到腾讯字节快手等公司的Offersql

Java进阶之路群,找管理员获取哦-!数据库

46cceac3a56b55f68885644acbf671c3.png

5e45b0594b5b31e896cf62426b480c65.png

相关文章
相关标签/搜索