mybatis-plus添加數(shù)據(jù)和修改數(shù)據(jù)的時(shí)候自動(dòng)填充數(shù)據(jù)

我們?cè)趯?shí)際開(kāi)發(fā)中往數(shù)據(jù)庫(kù)中存放數(shù)據(jù)的時(shí)候會(huì)有一些默認(rèn)值叽掘,比如創(chuàng)建時(shí)間飒货,更新時(shí)間之類(lèi)的,這里給大家安利兩種方法

1,如果使用的是創(chuàng)建時(shí)間和更新時(shí)間這種字段我們可以使用數(shù)據(jù)庫(kù)的工具操作

image

數(shù)據(jù)庫(kù)中勾選這個(gè)在你每次更新數(shù)據(jù)庫(kù)中這個(gè)表的字段的時(shí)候都會(huì)獲取當(dāng)前的時(shí)間做為這個(gè)字段的值谎柄,CURRENT_TIMESTAMP:將默認(rèn)值設(shè)置為這個(gè)參數(shù)則會(huì)在創(chuàng)建的時(shí)候獲取當(dāng)前時(shí)間作為這個(gè)參數(shù)的值,這是基于數(shù)據(jù)庫(kù)完成對(duì)這些字段的維護(hù)操作惯雳,適用于簡(jiǎn)單的可以直接拿到值,不需要從請(qǐng)求獲取參數(shù)的場(chǎng)景鸿摇,如果是我在創(chuàng)建對(duì)象的時(shí)候需要記錄創(chuàng)建對(duì)象的人是誰(shuí)石景,更新的時(shí)候需要知道更新的人是誰(shuí),這種方法就沒(méi)有辦法滿(mǎn)足了

2拙吉,基于mybatis-plus的注解的方式完成新建和更改的時(shí)候給參數(shù)賦值

2.1簡(jiǎn)單的賦值潮孽,如1中所說(shuō)的給創(chuàng)建時(shí)間,更改時(shí)間賦值

/**
 * 創(chuàng)建時(shí)間
 */
@TableField(value = "create_time",fill = FieldFill.INSERT)
private LocalDateTime createTime;

/**
 * 更新時(shí)間
 */
@TableField(value = "modify_time",fill = FieldFill.INSERT_UPDATE)
private LocalDateTime modifyTime;

這里我們使用create_time和modify_time字段表示創(chuàng)建時(shí)間和更新時(shí)間筷黔,我們?cè)诩由蟃ableField的fill 屬性的時(shí)候就是說(shuō)當(dāng)前這個(gè)字段的字段填充策略是什么

  public enum FieldFill {
    /**
     * 默認(rèn)不處理
     */
    DEFAULT,
    /**
     * 插入時(shí)填充字段
     */
    INSERT,
    /**
     * 更新時(shí)填充字段
     */
    UPDATE,
    /**
     * 插入和更新時(shí)填充字段
     */
    INSERT_UPDATE
}

這就是fill 的枚舉往史,我們?cè)趯?shí)體類(lèi)中添加了注解之后再寫(xiě)個(gè)類(lèi)來(lái)實(shí)現(xiàn)MetaObjectHandler

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "modifyTime", LocalDateTime.class, LocalDateTime.now());
    }

}

這里的兩個(gè)方法就是新建和更新的時(shí)候執(zhí)行的方法,如果在實(shí)體類(lèi)中有使用了FieldFill.INSERT或者FieldFill.INSERT_UPDATE的屬性就會(huì)執(zhí)行這兩個(gè)方法 strictInsertFill的方法就會(huì)把當(dāng)前的時(shí)間賦值給createTime(這里如果是modifyTime這個(gè)字段不存在則不會(huì)跟新:注意這里的字段是使用的我們實(shí)體類(lèi)中的字段而不是數(shù)據(jù)庫(kù)中的字段)

2.2當(dāng)我們賦值之后就不需要通過(guò)這個(gè)方式賦值佛舱,如果我們沒(méi)有設(shè)置值則自動(dòng)來(lái)設(shè)置值

我們只需要在上面這個(gè)方法中獲取你參數(shù)的值的時(shí)候使用Object createTime1 = getFieldValByName("createTime", metaObject);方法來(lái)獲取是否賦值給這個(gè)參數(shù)

 @Override
    public void insertFill(MetaObject metaObject) {

        //判斷添加/更新的時(shí)候是否給他賦值
        Object createTime1 = getFieldValByName("createTime", metaObject);
        if (createTime1 != null) {
            this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        //判斷添加/更新的時(shí)候是否給他賦值
        Object modifyTime1 = getFieldValByName("modifyTime", metaObject);
        if (modifyTime1 != null) {
            this.strictUpdateFill(metaObject, "modifyTime", LocalDateTime.class, LocalDateTime.now());     

2.3當(dāng)我們賦值的參數(shù)的值需要從請(qǐng)求中獲取值的時(shí)候(比如我更新的時(shí)候需要設(shè)置更新用戶(hù)的值)

@Component
public class MyMetaObjectHandler extends HttpFilter implements MetaObjectHandler {

    private HttpServletRequest request;


    @Override
    public void insertFill(MetaObject metaObject) {

        //判斷添加/更新的時(shí)候是否給他賦值
        Object createTime1 = getFieldValByName("createTime", metaObject);
        if (createTime1 != null) {
            this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        //判斷添加/更新的時(shí)候是否給他賦值
        Object modifyTime1 = getFieldValByName("modifyTime", metaObject);
        if (modifyTime1 != null) {
            this.strictUpdateFill(metaObject, "modifyTime", LocalDateTime.class, LocalDateTime.now());
        }
        String userId = request.getHeader(HeaderConstant.USER_ID);
        this.strictUpdateFill(metaObject, "userId", Long.class, userId);
    }

    @Override
    public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        this.request = request;
        chain.doFilter(request, response);
    }

}

我們通過(guò)HttpFilter 去獲取請(qǐng)求頭中的參數(shù)然后賦值給我們更新的時(shí)候的參數(shù)椎例,最后在更新數(shù)據(jù)庫(kù)中的字段的時(shí)候就會(huì)更新這個(gè)字段的值

以上就是我對(duì)于字段填充功能的方法的總結(jié),如有疑問(wèn)或者更好的建議可以聯(lián)系我-请祖。-订歪!

ps:發(fā)現(xiàn)上面的寫(xiě)法會(huì)出現(xiàn)失敗的情況,后來(lái)查詢(xún)是因?yàn)檫^(guò)濾器在并發(fā)情況下有可能拿不到對(duì)應(yīng)的值所以換了一個(gè)方法(實(shí)現(xiàn)思想一樣)

 /**
     * 新增的時(shí)候添加字段
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
        if (null != servletRequestAttributes) {
            String userId = servletRequestAttributes.getRequest().getHeader(HeaderConstant.USER_ID);
            String departmentId = servletRequestAttributes.getRequest().getHeader(HeaderConstant.DEPARTMENT_ID);
            log.error("userId=[{}],時(shí)間為[{}]", userId, LocalDateTime.now());
            if (StringUtils.isNotBlank(userId)) {
                this.strictInsertFill(metaObject, "createUid", Long.class, Long.valueOf(userId));
                log.error("userId=[{}],時(shí)間為[{}]", Long.valueOf(userId), LocalDateTime.now());
            }
            if (StringUtils.isNotBlank(departmentId)) {
                this.strictInsertFill(metaObject, "createDepartmentId", Long.class, Long.valueOf(departmentId));
            }
        }

    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肆捕,一起剝皮案震驚了整個(gè)濱河市刷晋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慎陵,老刑警劉巖眼虱,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異席纽,居然都是意外死亡捏悬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)胆筒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)邮破,“玉大人,你說(shuō)我怎么就攤上這事仆救∈愫停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵彤蔽,是天一觀(guān)的道長(zhǎng)摧莽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)顿痪,這世上最難降的妖魔是什么镊辕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任油够,我火速辦了婚禮,結(jié)果婚禮上征懈,老公的妹妹穿的比我還像新娘石咬。我一直安慰自己,他們只是感情好卖哎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布鬼悠。 她就那樣靜靜地躺著,像睡著了一般亏娜。 火紅的嫁衣襯著肌膚如雪焕窝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天维贺,我揣著相機(jī)與錄音它掂,去河邊找鬼。 笑死溯泣,一個(gè)胖子當(dāng)著我的面吹牛虐秋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播发乔,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼熟妓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了栏尚?” 一聲冷哼從身側(cè)響起起愈,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎译仗,沒(méi)想到半個(gè)月后抬虽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纵菌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年阐污,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咱圆。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笛辟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出序苏,到底是詐尸還是另有隱情手幢,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布忱详,位于F島的核電站围来,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜监透,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一桶错、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胀蛮,春花似錦院刁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鸳玩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間演闭,已是汗流浹背不跟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留米碰,地道東北人窝革。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吕座,于是被迫代替她去往敵國(guó)和親虐译。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容