欢迎关注方志朋的博客,回复”666“获面试宝典

作者 | 一起随缘
来源 | https://juejin.cn/post/6984555714752561183

背景

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

  • 如果您正在学习Spring Boot,推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/

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

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

由于才疏学浅,能力有限,对于文章中描述不准确或不恰当的地方,希望大家能够及时指出和纠正,在编码的路上一起努力前行。如果这篇文章对你有帮助的话,也希望能够给点赞加关注哦,你的认可和喜欢是我持续输出的最大动力。

热门内容:
  • 抖音的服务器究竟有多大?

  • 重磅消息:Spring 6 和Spring Boot 3

  • 有个程序员老公有多爽???

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

如何轻松搞定 CRUD 的创建人、修改人、时间等字段的赋值相关推荐

  1. 如何轻松搞定CRUD的创建人、修改人、时间等字段的赋值

    作者 | 一起随缘 来源 | https://juejin.cn/post/6984555714752561183 背景 数据库设计过程中,我们往往会给数据库表添加一些通用字段,比如创建人.创建时间. ...

  2. PDF怎么编辑修改内容?教你一招轻松搞定

    怎么编辑修改PDF文件中的内容呢?大家在日常中使用PDF文件的时候,如果发现文件中出现错误的内容时,想要编辑修改里面的文字,怎么才能做到呢?大家都知道PDF文件不能直接在里面编辑,所以有很多小伙伴想知 ...

  3. 用Python轻松搞定Excel中的20个常用操作

    来源 |早起Python(ID: zaoqi-python) Excel与Python都是数据分析中常用的工具,本文将使用动态图(Excel)+代码(Python)的方式来演示这两种工具是如何实现数据 ...

  4. 子查询引用外表_轻松搞定慢查询?这一文就够了(内附大量实例助你看懂Explain)...

    原文:https://mp.weixin.qq.com/s/p5UKuh1yY3P4zrOzVBmY1w (复制链接至浏览器,即可查看) 大量实例助你看懂Explain的输出内容,轻松搞定慢查询 EX ...

  5. [JavaScript]只需一行代码,轻松搞定快捷留言-V2升级版

    前天熬了大半宿发了一篇[一行代码轻松搞定快捷留言功能],同时发布了V1.0beta版的快捷留言功能和源代码,之所以是beta版,就是当时感觉虽然基本功能有了,但是还不够完善,特性也不一定合理,今天不知 ...

  6. [译] 12步轻松搞定python装饰器 - 简书

    [译] 12步轻松搞定python装饰器 - 简书 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编 ...

  7. 轻松搞定javascript变量(闭包,预解析机制,变量在内存的分配 )

    变量:  存储数据的容器 1.声明        var 2.作用域全局变量. 局部变量. 闭包(相对的全局变量): 3.类型a.基本类型(undefined, null, boolean, numb ...

  8. Python高级特性: 12步轻松搞定Python装饰器

    12步轻松搞定Python装饰器 通过 Python 装饰器实现DRY(不重复代码)原则:  http://python.jobbole.com/84151/ 基本上一开始很难搞定python的装饰器 ...

  9. excel去重_Python 轻松搞定 Excel 常用的 20 个操作

    点击上方"编程派",选择设为"设为星标" 优质文章,第一时间送达! 前言 Excel与Python都是数据分析中常用的工具,本文将使用动态图(Excel)+代码 ...

最新文章

  1. Mysql游标循环遍历_MySQL数据库中,使用游标循环遍历
  2. Android攻城狮SurfaceView
  3. 【Servlet】Filter过滤器详解、使用示例
  4. linux压缩与解压缩 tar命令
  5. 二叉查找树-优化版,使用了指针引用
  6. 结合JSP与HTML做一个九九乘法表
  7. SpringBoot+Redis缓存概念介绍
  8. 华为带动涨价?二季度中国市场智能手机均价涨了13%
  9. jsp调试,异常行数不匹配
  10. 使用python开发网页游戏_四大游戏编程网站,边玩游戏,边学Python,拒绝枯燥快乐编程...
  11. 良好的开端是成功的第一步———构建程序
  12. pytorch学习笔记(三十七):RMSProp
  13. SQL Server索引 (原理、存储)聚集索引、非聚集索引、堆 第一篇
  14. display: flex自我理解
  15. jquery 源码分析系列1
  16. 西电计算机考研历年分数线,西安电子科技大学研究生,西电历年考研分数线?...
  17. HTML常用标签、文本格式化标签:加粗、倾斜、删除线、下划线等
  18. 【19调剂】北京语言大学 智能语音习得技术实验室 -调剂信息
  19. /etc/profile 和~/.bash_profile区别
  20. Xshell提示更新并且已经是最新版

热门文章

  1. Google Glog使用
  2. 【转】ASP.NET Page事件的执行顺序
  3. “cyl projection cannot cross pole” 解决方法
  4. 树莓派Android Things物联网开发:创建一个Things项目
  5. windowsclient开发--为你的client进行国际化
  6. SQL同时删除两张表中的数据
  7. 倍增LCA NOIP2013 货车运输
  8. php中this,self,parent三个关键字
  9. Java学习笔记(二一)——Java 泛型
  10. iOS 的本地化使用和创建过程