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

MyBatis-Plus實(shí)現(xiàn)公共字段自動(dòng)填充功能詳解

 更新時(shí)間:2022年08月01日 10:09:45   作者:小劉要努力(????_??)?  
在開(kāi)發(fā)中經(jīng)常遇到多個(gè)實(shí)體類(lèi)有共同的屬性字段,這些字段屬于公共字段,也就是很多表中都有這些字段,能不能對(duì)于這些公共字段在某個(gè)地方統(tǒng)一處理,來(lái)簡(jiǎn)化開(kāi)發(fā)呢?MyBatis-Plus就提供了這一功能,本文就來(lái)為大家詳細(xì)講講

1.問(wèn)題分析

我們?cè)陂_(kāi)發(fā)中經(jīng)常遇到多個(gè)實(shí)體類(lèi)有共同的屬性字段,例如在用戶(hù)注冊(cè)時(shí)需要設(shè)置創(chuàng)建時(shí)間、創(chuàng)建人、修改時(shí)間、修改人等字段,在用戶(hù)編輯信息時(shí)需要設(shè)置修改時(shí)間和修改人等字段。這些字段屬于公共字段,也就是很多表中都有這些字段,能不能對(duì)于這些公共字段在某個(gè)地方統(tǒng)一處理,來(lái)簡(jiǎn)化開(kāi)發(fā)呢?

答案就是我們可是使用Mybatis Plus提供的公共字段自動(dòng)填充功能。

2.實(shí)現(xiàn)步驟

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

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

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

@TableField(fill = FieldFill.INSERT)//插入時(shí)填充字段
private LocalDateTime createTime;
 
@TableField(fill = FieldFill.INSERT_UPDATE)//插入、更新時(shí)填充字段
private LocalDateTime updateTime;
 
@TableField(fill = FieldFill.INSERT)//插入時(shí)填充字段
private Long createUser;

@TableField(fill = FieldFill.INSERT_UPDATE)//插入、更新時(shí)填充字段
private Long updateUser;

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

package com.lyq.reggie.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 {
    /**
     * 插入操作,自動(dòng)填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("公共字段自動(dòng)填充[insert]...");
        log.info(metaObject.toString());
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("createUser", BaseContext.getCurrentId());
        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }

    /**
     * 更新操作,自動(dòng)填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("公共字段自動(dòng)填充[update]...");
        log.info(metaObject.toString());

        long id = Thread.currentThread().getId();
        log.info("線(xiàn)程id為:{}",id);

        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }
}

3. 實(shí)現(xiàn)字段全局填充

這個(gè)時(shí)候我們嫌棄每個(gè)表都需要加對(duì)應(yīng)的注解,麻煩,這個(gè)時(shí)候我們就可以使用Mybatis Plus提供全局配置 sqlInjector 用于注入ISqlInjector接口的子類(lèi),實(shí)現(xiàn)自定義方法注入。

自定義自己的通用方法可以實(shí)現(xiàn)接口ISqlInjector也可以繼承抽象類(lèi) AbstractSqlInjector 注入通用方法 SQL 語(yǔ)句 然后繼承 BaseMapper 添加自定義方法,全局配置 sqlInjector 注入 MP 會(huì)自動(dòng)將類(lèi)所有方法注入到 mybatis 容器中。

首先我們需要增加一個(gè)配置類(lèi),將這個(gè)數(shù)據(jù)過(guò)濾器注冊(cè)為bean

@Configuration
public class MybatisPlusConfig {
    /*
     * @version V1.0
     * Title: updateInterceptor
     * @author LiuYanQiang
     * @description 插入數(shù)據(jù)過(guò)濾器
     * @createTime  2022/1/13 14:30
     * @param []
     * @return com.tfjybj.intelligentArticleSystem.config.MybatisPlusConfig.UpdateInterceptor*/
    @Bean
    public UpdateInterceptor updateInterceptor() {
        return new UpdateInterceptor();
    }
}

再接著寫(xiě)攔截方法繼承抽象類(lèi) AbstractSqlInjector 并且實(shí)現(xiàn)接口ISqlInjector來(lái)進(jìn)行SQL的攔截實(shí)現(xiàn)公共字段的全局填充

package com.lyq.jsoup.config.MybatisPlusConfig;
import com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;

import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : UpdateInterceptor
 * @description : [自動(dòng)給創(chuàng)建時(shí)間個(gè)更新時(shí)間加值]
 * @createTime : [2022/1/12 9:09]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/1/12 9:09]
 * @updateRemark : [描述說(shuō)明本次修改內(nèi)容]
 */
@Intercepts(value = {@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class UpdateInterceptor extends AbstractSqlParserHandler implements Interceptor {

    /**
     * 創(chuàng)建時(shí)間
     */
    private static final String CREATE_TIME = "createTime";
    /**
     * 更新時(shí)間
     */
    private static final String UPDATE_TIME = "updateTime";

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        // SQL操作命令
        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
        // 獲取新增或修改的對(duì)象參數(shù)
        Object parameter = invocation.getArgs()[1];
        // 獲取對(duì)象中所有的私有成員變量(對(duì)應(yīng)表字段)
        Field[] declaredFields = parameter.getClass().getDeclaredFields();
        if (parameter.getClass().getSuperclass() != null) {
            Field[] superField = parameter.getClass().getSuperclass().getDeclaredFields();
            declaredFields = ArrayUtils.addAll(declaredFields, superField);
        }
        // mybatis plus判斷
        boolean plus= parameter.getClass().getDeclaredFields().length == 1 && parameter.getClass().getDeclaredFields()[0].getName().equals("serialVersionUID");

        //兼容mybatis plus
        if (plus) {
            Map<String, Object> updateParam = (Map<String, Object>) parameter;
            Class<?> updateParamType = updateParam.get(updateParam.keySet().iterator().next()).getClass();
            declaredFields = updateParamType.getDeclaredFields();
            if (updateParamType.getSuperclass() != null) {
                Field[] superField = updateParamType.getSuperclass().getDeclaredFields();
                declaredFields = ArrayUtils.addAll(declaredFields, superField);
            }
        }
        String fieldName = null;
        for (Field field : declaredFields) {
            fieldName = field.getName();
            if (Objects.equals(CREATE_TIME, fieldName)) {
                if (SqlCommandType.INSERT.equals(sqlCommandType)) {
                    field.setAccessible(true);
                    field.set(parameter, new Timestamp(System.currentTimeMillis()));
                }
            }
            if (Objects.equals(UPDATE_TIME, fieldName)) {
                if (SqlCommandType.INSERT.equals(sqlCommandType) || SqlCommandType.UPDATE.equals(sqlCommandType)) {
                    field.setAccessible(true);
                    //兼容mybatis plus的update
                    if (plus) {
                        Map<String, Object> updateParam = (Map<String, Object>) parameter;
                        field.set(updateParam.get(updateParam.keySet().iterator().next()), new Timestamp(System.currentTimeMillis()));
                    } else {
                        field.set(parameter, new Timestamp(System.currentTimeMillis()));
                    }
                }
            }
        }
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        if (target instanceof Executor) {
            return Plugin.wrap(target, this);
        }
        return target;
    }

    @Override
    public void setProperties(Properties properties) {
    }
}

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

相關(guān)文章

  • JAVA之讀取properties時(shí)路徑的注意問(wèn)題

    JAVA之讀取properties時(shí)路徑的注意問(wèn)題

    這篇文章主要介紹了JAVA之讀取properties時(shí)路徑的注意問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • SpringBoot集成Aviator實(shí)現(xiàn)參數(shù)校驗(yàn)的代碼工程

    SpringBoot集成Aviator實(shí)現(xiàn)參數(shù)校驗(yàn)的代碼工程

    Aviator是一個(gè)高性能、輕量級(jí)的java語(yǔ)言實(shí)現(xiàn)的表達(dá)式求值引擎,主要用于各種表達(dá)式的動(dòng)態(tài)求值,本文給大家詳細(xì)介紹了SpringBoot集成Aviator實(shí)現(xiàn)參數(shù)校驗(yàn)的方法,并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • SpringBoot整合BootStrap實(shí)戰(zhàn)

    SpringBoot整合BootStrap實(shí)戰(zhàn)

    這篇文章主要介紹了SpringBoot整合BootStrap實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Go Java 算法之迷你語(yǔ)法分析器示例詳解

    Go Java 算法之迷你語(yǔ)法分析器示例詳解

    這篇文章主要為大家介紹了Go Java 算法之迷你語(yǔ)法分析器示例詳解,
    有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Java如何實(shí)現(xiàn)樹(shù)的同構(gòu)?

    Java如何實(shí)現(xiàn)樹(shù)的同構(gòu)?

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java如何實(shí)現(xiàn)樹(shù)的同構(gòu)展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 在Spring Boot中加載初始化數(shù)據(jù)的實(shí)現(xiàn)

    在Spring Boot中加載初始化數(shù)據(jù)的實(shí)現(xiàn)

    這篇文章主要介紹了在Spring Boot中加載初始化數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Java并發(fā)控制機(jī)制詳解

    Java并發(fā)控制機(jī)制詳解

    這篇文章主要為大家詳細(xì)介紹了Java并發(fā)控制機(jī)制,什么是Java并發(fā)控制機(jī)制,Java并發(fā)控制機(jī)制的作用,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Java中TreeSet、HashSet、Collection重寫(xiě)比較器的實(shí)現(xiàn)

    Java中TreeSet、HashSet、Collection重寫(xiě)比較器的實(shí)現(xiàn)

    比較器是一種可以對(duì)集合或數(shù)組中的元素按照自定義的方式進(jìn)行排序的對(duì)象,本文主要介紹了Java中TreeSet、HashSet、Collection重寫(xiě)比較器的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-08-08
  • 如何基于ssm框架實(shí)現(xiàn)springmvc攔截器

    如何基于ssm框架實(shí)現(xiàn)springmvc攔截器

    這篇文章主要介紹了如何基于ssm框架實(shí)現(xiàn)springmvc攔截器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • IDEA自動(dòng)生成注釋模板的配置教程

    IDEA自動(dòng)生成注釋模板的配置教程

    本文介紹了如何在IntelliJIDEA中配置類(lèi)和方法的注釋模板,包括自動(dòng)生成項(xiàng)目名稱(chēng)、包名、日期和時(shí)間等內(nèi)容,以及如何定制參數(shù)和返回值的注釋格式,需要的朋友可以參考下
    2025-04-04

最新評(píng)論

逊克县| 左云县| 苏尼特右旗| 沁阳市| 马龙县| 陵水| 汶川县| 乃东县| 甘洛县| 广元市| 宁乡县| 洞头县| 潜山县| 唐海县| 应城市| 武功县| 福鼎市| 嵊州市| 开平市| 石家庄市| 关岭| 武川县| 句容市| 庆云县| 平塘县| 大方县| 灵武市| 宁蒗| 南岸区| 治县。| 奉节县| 武汉市| 维西| 扶余县| 汉沽区| 乌什县| 汶川县| 鹿泉市| 罗江县| 铁力市| 府谷县|