最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis-Plus實(shí)現(xiàn)公共字段自動(dòng)填充的項(xiàng)目實(shí)踐

 更新時(shí)間:2023年07月18日 14:53:08   作者:我愛(ài)布朗熊  
本文主要介紹了Mybatis-Plus實(shí)現(xiàn)公共字段自動(dòng)填充的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、公共字段自動(dòng)填充

1.1 問(wèn)題分析

比如說(shuō)在新增用戶需要指定創(chuàng)建時(shí)間、創(chuàng)建人等字段,

修改用戶時(shí)需要指定修改時(shí)間、修改人等字段

這些字段屬于公共字段,也就是很多表中都有這些字段

這樣我們?cè)谝院髮?xiě)起來(lái)非常的麻煩, 每次做操作都需要自己手動(dòng)寫(xiě)。但是對(duì)于Mybatis plus來(lái)說(shuō)這些是小意思,它為我們提供了公共字段自動(dòng)填充功能

1.2 實(shí)現(xiàn)思路及代碼編寫(xiě)

Mybatis plus 公共字段自動(dòng)填充,也就是在插入或者更新的時(shí)候?yàn)橹付ㄗ侄钨x予指定的值,使用它的好處就是統(tǒng)一對(duì)這些字段進(jìn)行處理,避免了代碼重復(fù)。

實(shí)現(xiàn)步驟:

1. 在實(shí)體類的屬性上加入@TableField注解,指定自動(dòng)填充的策略

    @TableField(value ="create_time",fill = FieldFill.INSERT)    //插入時(shí)填充字段
    private LocalDateTime createTime;
    @TableField(value ="update_time",fill = FieldFill.INSERT_UPDATE)//插入和更新時(shí)填充字段
    private LocalDateTime updateTime;
    @TableField(value = "create_user",fill = FieldFill.INSERT)//插入時(shí)填充字段
    private Long createUser;
    @TableField(value = "update_user",fill = FieldFill.INSERT_UPDATE)//插入和更新時(shí)填充字段
    private Long updateUser;

其中FieldFill是一個(gè)枚舉類,如下所示:

2. 按照框架要求編寫(xiě)元數(shù)據(jù)對(duì)象處理器,在此類中統(tǒng)一為公共字段賦值,此類需要實(shí)現(xiàn)MetaObjectHandler接口

package com.reggie_take_out.common;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
 * 元數(shù)據(jù)對(duì)象處理器
 */
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 執(zhí)行insert語(yǔ)句的時(shí)候執(zhí)行
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("公共字段自動(dòng)填充——insertFill");
//      自動(dòng)填充
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
//      獲取session對(duì)象
        metaObject.setValue("createUser", BaseContext.getCurrentId());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());
    }
    /**
     * 執(zhí)行update語(yǔ)句的時(shí)候執(zhí)行
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("公共字段自動(dòng)填充——updateFill");
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());
    }
}

二、 知識(shí)補(bǔ)充: ThreadLocal

2.1  使用背景

為什么要使用這個(gè)類?

比如我們要給updateUser與createUser字段設(shè)置值的時(shí)候,我們是通過(guò)HttpServletRequest對(duì)象獲取

 request.getSession().getAttribute("employee");

但是我們?cè)?strong>寫(xiě)公共字段自動(dòng)填充的時(shí)候發(fā)現(xiàn)不能使用HttpServletRequest。

除此之外,將用戶id放入到HttpSession中也是獲取不到的,MyMetaObjectHandler類中是不能獲取HttpSession對(duì)象的所以我們需要其他方式來(lái)進(jìn)行獲取。

客戶端發(fā)送的每次Http請(qǐng)求,對(duì)應(yīng)的服務(wù)端都會(huì)分配一個(gè)新的線程來(lái)處理,在處理過(guò)程中涉及到下面類中的方法都屬于同一個(gè)線程

1.LoginCheckFilter 的doFilter方法

2.EmployeeController的update方法

3.MyMetaObjectHandler的updateFill方法  

解決思路:

我們可以在LoginCheckFilter的doFilter方法中獲取當(dāng)前登錄用戶id,并調(diào)用ThreadLocal的set方法來(lái)設(shè)置當(dāng)前線程的線程局部變量的值(用戶id),然后再M(fèi)yMetaObjectHandler的updateFill方法中調(diào)用ThreadLocal的get方法來(lái)獲取當(dāng)前線程所對(duì)應(yīng)的線程局部變量的值(用戶id)

2.2 ThreadLocal介紹

  • ThreadLocal并不是一個(gè)Thread,而是Thread的局部變量。
  • 當(dāng)使用ThreadLocal維護(hù)變量時(shí),ThreadLocal為每個(gè)使用該變量的線程提供獨(dú)立的變量副本,所以每一個(gè)線程都可以獨(dú)立地改變自己副本,而不會(huì)影響其他線程所對(duì)應(yīng)的副本。
  • ThreadLocal為每個(gè)線程提供單獨(dú)一份存儲(chǔ)空間,具有線程隔離的效果,只有在線程內(nèi)才能獲取到對(duì)應(yīng)的值,線程外則不能訪問(wèn)。

2.2.1  設(shè)置當(dāng)前線程的線程局部變量的值   public void set(T value)

具體代碼查看2.3.1 

2.2.2  返回當(dāng)前線程所對(duì)應(yīng)的線程  局部變量的值 public T get()

具體代碼查看2.3.1 

2.3  實(shí)現(xiàn)功能

2.3.1 基于ThreadLocal封裝BaseContext工具類

/**
 * 基于ThreadLocal封裝工具類,用戶保存和獲取當(dāng)前登錄用戶id
 */
public class BaseContext {
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
    public static void setCurrentId(Long id){
        threadLocal.set(id);
    }
    public static Long getCurrentId(){
        return threadLocal.get();
    }
}

2.3.2 在過(guò)濾器方法中調(diào)用BaseContext工具類設(shè)置當(dāng)前登錄用戶id

/**
 * 檢查用戶是否已經(jīng)完成登錄
 * 過(guò)濾器與攔截器的區(qū)別:Filter對(duì)所有訪問(wèn)進(jìn)行增強(qiáng)(在Tomcat服務(wù)器進(jìn)行配置),Interceptor僅針對(duì)SpringMVC的訪問(wèn)進(jìn)行增強(qiáng)
 */
@Slf4j
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")  //urlPatterns指定攔截哪些路徑
public class LoginCheckFilter implements Filter {
    //  此對(duì)象的作用:路徑匹配器,  匹配路徑時(shí)支持通配符
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//      servletRequest向下強(qiáng)制類型轉(zhuǎn)換
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //1. 獲取本次請(qǐng)求的URI( URI:請(qǐng)求的資源路徑)
        String requestURI = request.getRequestURI();
        log.info("攔截到請(qǐng)求:{}", request.getRequestURI());
        // 定義不用處理的請(qǐng)求路徑
        String[] urls = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };
        //2. 判斷本次請(qǐng)求是否需要處理(因?yàn)橛行┱?qǐng)求并不需要用戶登錄)
        boolean check = check(requestURI, urls);
        //3.如果不需要處理,則直接放行
        if (check) {
            log.info("本次請(qǐng)求{}不需要處理", request.getRequestURI());
            filterChain.doFilter(request, response);
            return;
        }
        //4.判斷登錄狀態(tài),如果已登錄,則直接放行.從session中獲取用戶,如果獲取到說(shuō)明已經(jīng)登錄
        if (request.getSession().getAttribute("employee") != null) {
            log.info("用戶已登錄,用戶id為{}", request.getSession().getAttribute("employee"));
            Long empId = (Long) request.getSession().getAttribute("employee");
            BaseContext.setCurrentId(empId);
            filterChain.doFilter(request, response);
            return;
        }
        //5.如果未登錄則返回未登錄結(jié)果
        log.info("資源路徑路徑:{},用戶未登錄{}", request.getRequestURI(), request.getSession().getAttribute("employee"));
//           通過(guò)輸出流的方式向客戶端響應(yīng)數(shù)據(jù)   (為什么要返回這個(gè)NOTLOGIN?  因?yàn)榍岸诵枰@個(gè)來(lái)進(jìn)行判定是否登錄)
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
//        filterChain.doFilter(request, response);  加上這個(gè)就無(wú)法實(shí)現(xiàn)
    }
    /**
     * 檢查本次請(qǐng)求是否需要放行
     *
     * @param requestURI 請(qǐng)求的資源路徑
     * @param urls       放過(guò)的路徑
     * @return true 放行
     */
    public boolean check(String requestURI, String[] urls) {
        for (String url : urls) {
            boolean match = PATH_MATCHER.match(url, requestURI);
            if (match) {
//           放行
                return true;
            }
        }
        return false;
    }
}

2.3.3 在MyMetaObjectHandler的方法中調(diào)用BaseContext工具類獲取登錄用戶id

package com.reggie_take_out.common;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
 * 元數(shù)據(jù)對(duì)象處理器
 */
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 執(zhí)行insert語(yǔ)句的時(shí)候執(zhí)行
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("公共字段自動(dòng)填充——insertFill");
//      自動(dòng)填充
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
//      獲取session對(duì)象
        metaObject.setValue("createUser", BaseContext.getCurrentId());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());
    }
    /**
     * 執(zhí)行update語(yǔ)句的時(shí)候執(zhí)行
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("公共字段自動(dòng)填充——updateFill");
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());
    }
}

到此這篇關(guān)于Mybatis-Plus實(shí)現(xiàn)公共字段自動(dòng)填充的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)Mybatis-Plus 公共字段自動(dòng)填充內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中給指定接口加上權(quán)限校驗(yàn)的實(shí)現(xiàn)

    SpringBoot中給指定接口加上權(quán)限校驗(yàn)的實(shí)現(xiàn)

    本文介紹了使用SpringSecurity為接口添加權(quán)限校驗(yàn),以防止外部訪問(wèn)并確保安全性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Java如何限制IP訪問(wèn)頁(yè)面

    Java如何限制IP訪問(wèn)頁(yè)面

    這篇文章主要介紹了Java如何限制IP訪問(wèn)頁(yè)面,幫助大家完成需求,實(shí)現(xiàn)白名單,感興趣的朋友可以了解下
    2020-09-09
  • Java如何實(shí)現(xiàn)密碼加密

    Java如何實(shí)現(xiàn)密碼加密

    這篇文章主要介紹了Java如何實(shí)現(xiàn)密碼加密,幫助大家更好的理解和學(xué)習(xí)java,感興趣的朋友可以了解下
    2020-08-08
  • 利用java操作Excel文件的方法

    利用java操作Excel文件的方法

    以下是對(duì)利用java操作Excel文件的方法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • 聊聊Redis二進(jìn)制數(shù)組Bitmap

    聊聊Redis二進(jìn)制數(shù)組Bitmap

    這篇文章主要介紹了Redis二進(jìn)制數(shù)組Bitmap,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • JAVA讀取PDF、WORD文檔實(shí)例代碼

    JAVA讀取PDF、WORD文檔實(shí)例代碼

    本篇文章主要通過(guò)實(shí)例代碼介紹了JAVA讀取PDF、WORD文檔,需要的朋友可以參考下
    2017-04-04
  • Java SpringMVC實(shí)現(xiàn)國(guó)際化整合案例分析(i18n)

    Java SpringMVC實(shí)現(xiàn)國(guó)際化整合案例分析(i18n)

    本篇文章主要介紹了Java SpringMVC實(shí)現(xiàn)國(guó)際化整合案例分析(i18n),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java中如何將json字符串轉(zhuǎn)換成map/list

    Java中如何將json字符串轉(zhuǎn)換成map/list

    這篇文章主要介紹了Java中如何將json字符串轉(zhuǎn)換成map/list,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java實(shí)現(xiàn)轉(zhuǎn)換圖片格式的示例代碼

    Java實(shí)現(xiàn)轉(zhuǎn)換圖片格式的示例代碼

    在日常的軟件開(kāi)發(fā)中,處理圖像文件是一項(xiàng)常見(jiàn)任務(wù),這篇文章將實(shí)現(xiàn)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Java程序,用于將一種圖片格式轉(zhuǎn)換為另一種格式,需要的可以了解下
    2025-02-02
  • java實(shí)現(xiàn)讀寫(xiě)json文件的示例詳解

    java實(shí)現(xiàn)讀寫(xiě)json文件的示例詳解

    隨著現(xiàn)代應(yīng)用對(duì)數(shù)據(jù)交換和配置管理需求的增加,JSON(JavaScript Object Notation)已成為最流行的數(shù)據(jù)格式之一,本文將為大家全面展示 Java 讀寫(xiě) JSON 文件的端到端流程,需要的小伙伴可以了解下
    2025-05-05

最新評(píng)論

兴文县| 东阳市| 福海县| 柳江县| 洛隆县| 石阡县| 合川市| 景泰县| 新疆| 五台县| 尼勒克县| 西充县| 公安县| 垫江县| 娱乐| 炉霍县| 卢氏县| 鹰潭市| 定州市| 临潭县| 上思县| 安溪县| 历史| 四川省| 宁安市| 砚山县| 上虞市| 天水市| 青州市| 渭源县| 白城市| 临武县| 台中市| 嵊州市| 中方县| 措勤县| 托克托县| 长武县| 桦甸市| 连平县| 兴海县|