欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot實現(xiàn)公共字段填充的示例詳解

 更新時間:2023年10月05日 11:24:33   作者:xyy123  
這篇文章主要為大家詳細(xì)介紹了Springboot實現(xiàn)公共字段填充的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們深入學(xué)習(xí)springboot有一定的幫助,感興趣的小伙伴可以了解下

問題分析

方式一:自定義注解AutoFill

創(chuàng)建注解

/**  
* 自定義注解,用于標(biāo)識某個方法需要進(jìn)行功能字段自動填充處理  
*/  
@Target(ElementType.METHOD)  // 只能加載方法上
@Retention(RetentionPolicy.RUNTIME)  // 固定寫法 
public @interface AutoFill {  
    //枚舉,數(shù)據(jù)庫操作類型:UPDATE INSERT  
    OperationType value();  
}

創(chuàng)建枚舉

/**  
* 數(shù)據(jù)庫操作類型  
*/  
public enum OperationType {  
    /**  
    * 更新操作  
    */  
    UPDATE,  
    /**  
    * 插入操作  
    */  
    INSERT  
}

創(chuàng)建切面類

/**  
* 自定義切面,實現(xiàn)公共字段自動填充處理邏輯  
*/  
@Aspect  
@Component  
@Slf4j  
public class AutoFillAspect {  
    /**  
    * 切入點,指定攔截mapper的下帶有autofill注解的方法
    */  
    @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")  
    public void autoFillPointCut(){
    }  
    /**  
    * 前置通知,在通知中進(jìn)行公共字段的賦值  
    */  
    @Before("autoFillPointCut()")  
    public void autoFill(JoinPoint joinPoint){  
        log.info("開始進(jìn)行公共字段自動填充...");  
        //獲取到當(dāng)前被攔截的方法上的數(shù)據(jù)庫操作類型  
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法簽名對象  
        AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//獲得方法上的注解對象  
        OperationType operationType = autoFill.value();//獲得數(shù)據(jù)庫操作類型  
        //獲取到當(dāng)前被攔截的方法的參數(shù)--實體對象  
        Object[] args = joinPoint.getArgs();  
        if(args == null || args.length == 0){  
        return;  
    }  
    Object entity = args[0];  
    //準(zhǔn)備賦值的數(shù)據(jù)  
    LocalDateTime now = LocalDateTime.now();  
    Long currentId = BaseContext.getCurrentId();  
    //根據(jù)當(dāng)前不同的操作類型,為對應(yīng)的屬性通過反射來賦值  
    if(operationType == OperationType.INSERT){  
        //為4個公共字段賦值  
        try {  
            Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);  
            Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);  
            Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);  
            Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);  
            //通過反射為對象屬性賦值  
            setCreateTime.invoke(entity,now);  
            setCreateUser.invoke(entity,currentId);  
            setUpdateTime.invoke(entity,now);  
            setUpdateUser.invoke(entity,currentId);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }else if(operationType == OperationType.UPDATE){  
        //為2個公共字段賦值  
        try {  
            Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);  
            Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);  
            //通過反射為對象屬性賦值  
            setUpdateTime.invoke(entity,now);  
            setUpdateUser.invoke(entity,currentId);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
 }  
}

mapper方法中添加注解

方式二:使用mybatis plus提供方法

實體類添加注解 @TableField(fill = FieldFill.XXX)

package com.example.demo.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * 員工信息
 * @TableName employee
 */
@TableName(value ="employee")
@Data
@Accessors(chain = true)
public class Employee implements Serializable {
    /**
     * 主鍵
     */
    @TableId
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 創(chuàng)建時間
     */
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @TableField(fill = FieldFill.INSERT)//插入時填充字段
    private LocalDateTime createTime;
    /**
     * 更新時間
     */
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @TableField(fill = FieldFill.INSERT_UPDATE)//插入、更新時填充字段,后面的是枚舉
    private LocalDateTime updateTime;
    /**
     * 創(chuàng)建人
     */
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    /**
     * 修改人
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
}

創(chuàng)建數(shù)據(jù)處理器

package com.example.demo.common;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.example.demo.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Autowired
    HttpServletRequest request;
    @Autowired
    RedisUtils redisUtils;
    @Override
    public void insertFill(MetaObject metaObject) {
        //填充創(chuàng)建時間
        metaObject.setValue("createTime", LocalDateTime.now());
        //填充 更新的時間
        metaObject.setValue("updateTime", LocalDateTime.now());
        Long result = BaseContext.get();
        //填充創(chuàng)建人信息
        metaObject.setValue("createUser",result);
        //填充更新人信息
        metaObject.setValue("updateUser",result);
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        //因為是更新,所以不用操作創(chuàng)建時間
        //更新 更新的時間
        metaObject.setValue("updateTime", LocalDateTime.now());
        Long result = BaseContext.get();;
        //填充更新人信息
        metaObject.setValue("updateUser",result);
    }
}

以上就是Springboot實現(xiàn)公共字段填充的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Springboot公共字段填充的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用JAVA8 filter對List多條件篩選的實現(xiàn)

    使用JAVA8 filter對List多條件篩選的實現(xiàn)

    這篇文章主要介紹了使用JAVA8 filter對List多條件篩選的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Eclipse常用快捷鍵總結(jié)(必看篇)

    Eclipse常用快捷鍵總結(jié)(必看篇)

    下面小編就為大家?guī)硪黄狤clipse常用快捷鍵總結(jié)(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • Java concurrency之集合_動力節(jié)點Java學(xué)院整理

    Java concurrency之集合_動力節(jié)點Java學(xué)院整理

    Java集合主體內(nèi)容包括Collection集合和Map類;而Collection集合又可以劃分為List(隊列)和Set(集合),有需要的小伙伴可以參考下
    2017-06-06
  • Spring cloud alibaba之Gateway網(wǎng)關(guān)功能特征詳解

    Spring cloud alibaba之Gateway網(wǎng)關(guān)功能特征詳解

    spring cloud gateway是spring cloud推出的第二代網(wǎng)關(guān),是由WebFlux+Netty+Reactor實現(xiàn)的響應(yīng)式的API網(wǎng)關(guān),它不能在傳統(tǒng)的servlet容器中工作,也不能構(gòu)建成war包,接下來通過本文給大家分享Spring cloud alibaba--Gateway網(wǎng)關(guān),需要的朋友可以參考下
    2021-08-08
  • 利用Thumbnailator輕松實現(xiàn)圖片縮放、旋轉(zhuǎn)與加水印

    利用Thumbnailator輕松實現(xiàn)圖片縮放、旋轉(zhuǎn)與加水印

    java開發(fā)中經(jīng)常遇到對圖片的處理,JDK中也提供了對應(yīng)的工具類,不過處理起來很麻煩,Thumbnailator是一個優(yōu)秀的圖片處理的開源Java類庫,處理效果遠(yuǎn)比Java API的好,這篇文章主要介紹了利用Thumbnailator如何輕松的實現(xiàn)圖片縮放、旋轉(zhuǎn)與加水印,需要的朋友可以參考下
    2017-01-01
  • 如何使用Maven管理項目?Maven管理項目實例

    如何使用Maven管理項目?Maven管理項目實例

    下面小編就為大家?guī)硪黄绾问褂肕aven管理項目?Maven管理項目實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • JavaScript不使用臨時變量交換兩個變量值的方法總結(jié)

    JavaScript不使用臨時變量交換兩個變量值的方法總結(jié)

    在?JavaScript?中交換兩個變量的值是一項基礎(chǔ)但重要的操作,傳統(tǒng)方法會使用一個臨時變量,但在某些情況下,我們可能需要不使用臨時變量來實現(xiàn)交換,本文將詳細(xì)介紹多種不使用臨時變量交換兩個變量值的方法,需要的朋友可以參考下
    2025-04-04
  • Java建造者設(shè)計模式詳解

    Java建造者設(shè)計模式詳解

    這篇文章主要為大家詳細(xì)介紹了Java建造者設(shè)計模式,對建造者設(shè)計模式進(jìn)行分析理解,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Springboot整合GuavaCache緩存過程解析

    Springboot整合GuavaCache緩存過程解析

    這篇文章主要介紹了springboot整合GuavaCache緩存過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • SpringBoot配置文件application.properties的使用

    SpringBoot配置文件application.properties的使用

    這篇文章主要介紹了SpringBoot配置文件application.properties的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評論