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

相關文章
相關標籤/搜索