当前位置: 首页 > 后端技术 > Java

一个工具类处理CRUD的creator、modifier、time等字段的赋值!

时间:2023-04-01 20:13:53 Java

来源:juejin.cn/post/6984555714752561183背景在数据库设计过程中,我们经常会在数据库表中添加一些常用的字段,比如创建者、创建时间、修改人、修改时间。在一些公司的设计过程中,有时会强制要求每个表都包含这些基本信息,以便在数据操作时记录一些基本的日志记录。按照平时的操作,一般的做法是在输入和编写SQL时,将这些信息和对象的基本属性信息一起写入数据库。当然,这也是大家习以为常的操作。也就是说,如果所有的表都这样操作,可能显得有点啰嗦,而且如果数据表很多,这样写也是得不偿失。其实还有更简单的方法。大家对spring框架应该不陌生。几乎每个公司都会用到它。aop思想(切面编程)的一个经典应用场景就是日志记录。本文结合aop思想,重点介绍在springboot框架下,如何利用切面编程的思想,将creator、creationtime、updater、updatetime等基本信息写入数据库。核心代码@Aspect@Component@ConfigurationpublicclassCommonDaoAspect{privatestaticfinalStringcreater="creater";privatestaticfinalStringcreateTime="createTime";私人静态最终字符串更新器=“更新器”;私人静态最终字符串更新时间=“更新时间”;@Pointcut("执行(*com.xx.xxxx.*.dao.*.update*(..))")publicvoiddaoUpdate(){}@Pointcut("执行(*com.xx.xxxx.*.dao.*.insert*(..))")publicvoiddaoCreate(){}@Around("daoUpdate()")publicObjectdoDaoUpdate(ProceedingJoinPointpjp)throwsThrowable{ServletRequestAttributes属性=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();如果(属性==null){返回pjp.proceed();}HttpServletRequest请求=attributes.getRequest();Stringtoken=request.getHeader("token");字符串用户名=getUserName();如果(令牌!=空&&我们ername!=null){Object[]objects=pjp.getArgs();if(objects!=null&&objects.length>0){for(Objectarg:objects){BeanUtils.setProperty(arg,updater,username);BeanUtils.setProperty(arg,updateTime,newDate());}}}对象对象=pjp.proceed();返回对象;}@Around("daoCreate()")publicObjectdoDaoCreate(ProceedingJoinPointpjp)throwsThrowable{ServletRequestAttributes属性=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();如果(属性==null){返回pjp.proceed();}对象[]对象=pjp.getArgs();if(objects!=null&&objects.length>0){for(Objectarg:objects){Stringusername=getUserName();如果(用户名!=null){如果(StringUtils.isBlank(BeanUtils.getProperty(arg,creater))){BeanUtils.setProperty(arg,creater,用户名);}if(StringUtils.isBlank(BeanUtils.getProperty(arg,createTime))){BeanUtils.setProperty(arg,createTime,newDate());}}}}对象对象=pjp.proceed();返回对象;}privateStringgetUserName(){returnUserUtils.getUsername();介绍核心代码声明了一个CommonDaoAspect切面类。实体类声明了4个核心方法和一个获取用户名信息的方法。UserUtils是在项目中声明的一个工具类,包括获取用户id、用户名等一些基本信息。大家可以根据自己的实际情况Define,不要只照搬四个核心方法,daoUpdate和daoCreate加上@Pointcut注解,通过声明正则表达式的方式来决定项目包中dao目录下哪些方法执行切面方法。@Around注解被添加到doDaoUpdate和doDaoCreate方法中。在注解中引入了以上两个方法来表示环绕通知,在target方法完成前后增强了我们自己dao目录下对应的文件target方法。2、注解说明@Aspect:声明一个切面类,可以定义入口点和通知@Component:表示该类是spring管理的对象@Pointcut:入口点,通过正则表达式声明入口的时机,本文为在target方法(即项目中dao目录下实体类中包含insert或update字符串的方法)在添加切入信息时执行,即添加creator和updater执行新的或更新的时。@Around:围绕通知,在目标方法完成前后做增强处理。在这种情况下,它意味着在执行doCreate和doUpdate方法时添加参数信息。注:execution(com.xx.xxxx..dao..update(..))表示dao下任意文件中以update开始的方法execution(com.xx.xxxx..dao..insert(..))directory是指在dao目录下的任意文件中以insert开头的方法推荐:1.1000+Java面试题及答案(2021最新版)2.别再满脑子if/else了,试试策略模式,就是这样可口的!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!