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

Mybatis/MybatisPlus公共字段填充與配置邏輯刪除

 更新時間:2025年05月16日 10:13:18   作者:sjsjsbbsbsn  
MyBatis 和 MyBatis-Plus 都提供了相應的機制來處理這些公共字段的填充和邏輯刪除,下面就來介紹一下,感興趣的可以了解一下

在開發(fā)過程中,很多時候需要處理一些公共字段,例如:創(chuàng)建時間、修改時間、狀態(tài)字段等。這些字段通常會在插入或更新數據時進行填充,以便記錄數據的變化和狀態(tài)。同時,邏輯刪除也是常見的業(yè)務需求,比如刪除記錄并不是從數據庫中物理刪除,而是通過更新某個字段(如 is_deleted)來標記數據已被刪除。

MyBatis 和 MyBatis-Plus 都提供了相應的機制來處理這些公共字段的填充和邏輯刪除。下面我們將分別介紹如何在 MyBatis 和 MyBatis-Plus 中實現公共字段填充與邏輯刪除。

1.公共字段填充

mybatis:

在 MyBatis 中,公共字段填充可以通過 TypeHandler 或者使用攔截器(Interceptor)來實現。但更為常見且方便的方式是通過 插件(例如 MyBatis Plus)來進行全局配置。下面我們講解一種使用攔截器的方式來實現公共字段填充。

MyBatis 支持通過攔截器(Interceptor)來修改執(zhí)行的 SQL,或者在執(zhí)行時進行公共字段的填充。你可以定義一個 Interceptor,在插入或更新操作前對公共字段進行填充:

@Intercepts({
    @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
@Component
public class MybatisInterceptor implements Interceptor {
    
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 獲取當前執(zhí)行的 SQL
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        BoundSql boundSql = statementHandler.getBoundSql();
        
        // 獲取 SQL 類型(插入或更新)
        String sql = boundSql.getSql();
        if (sql.trim().toUpperCase().startsWith("INSERT")) {
            // 如果是插入操作,填充公共字段
            sql = addCommonFieldsForInsert(sql);
        } else if (sql.trim().toUpperCase().startsWith("UPDATE")) {
            // 如果是更新操作,填充公共字段
            sql = addCommonFieldsForUpdate(sql);
        }
        
        // 更新 SQL
        boundSql.setSql(sql);
        
        return invocation.proceed();
    }
    
    private String addCommonFieldsForInsert(String sql) {
        // 獲取當前用戶信息(例如從 ThreadLocal 中獲取當前用戶)
        String currentUser = getCurrentUser();
        
        // 添加創(chuàng)建時間、更新時間、創(chuàng)建人、更新人等字段
        sql = sql.replace("(", "(create_time, update_time, create_by, update_by, ");
        sql = sql.replace("values", "values(now(), now(), '" + currentUser + "', '" + currentUser + "', ");
        return sql;
    }
    
    private String addCommonFieldsForUpdate(String sql) {
        // 獲取當前用戶信息(例如從 ThreadLocal 中獲取當前用戶)
        String currentUser = getCurrentUser();
        
        // 替換 SQL,設置更新時間、更新人
        if (sql.contains("set")) {
            sql = sql.replaceFirst("set", "set update_time = now(), update_by = '" + currentUser + "', ");
        }
        return sql;
    }
    
    private String getCurrentUser() {
        // 模擬獲取當前用戶,實際情況可以通過 ThreadLocal 或 SecurityContext 獲取
        return "admin";  // 假設當前用戶是 admin
    }

記得要把攔截器注冊

mybatis-plus:

通過實現MetaObjectHandler接口簡化處理。

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        // 獲取當前登錄用戶,假設是通過 ThreadLocal 獲取當前用戶
        String currentUser = getCurrentUser(); 
        
        this.strictInsertFill(metaObject, "createBy", String.class, currentUser);
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateBy", String.class, currentUser);
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 獲取當前登錄用戶,假設是通過 ThreadLocal 獲取當前用戶
        String currentUser = getCurrentUser();

        this.strictUpdateFill(metaObject, "updateBy", String.class, currentUser);
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }

    private String getCurrentUser() {
        // 假設當前用戶信息存儲在 ThreadLocal 中
        return "admin";  // 或者從上下文中獲取
    }
}

2.邏輯刪除:

1. MyBatis實現方式

需手動修改所有SQL語句或在攔截器中添加條件。

XML映射文件示例

<select id="selectById" resultType="User">
    SELECT * FROM user WHERE id = #{id} AND is_deleted = 0
</select>

<update id="deleteById">
    UPDATE user SET is_deleted = 1 WHERE id = #{id}
</update>

運行 HTML

2. MyBatis-Plus實現方式

提供全局配置和注解兩種方式。

方式1:全局配置(application.yml)

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: isDeleted   # 邏輯刪除字段名
      logic-delete-value: 1           # 刪除標記值
      logic-not-delete-value: 0       # 未刪除標記值

方式2:注解標記

public class User {

    @TableLogic
    private Integer isDeleted;
}

方式3:Java配置類

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public GlobalConfig globalConfig() {
        GlobalConfig config = new GlobalConfig();
        GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
        dbConfig.setLogicDeleteField("isDeleted");
        dbConfig.setLogicDeleteValue("1");
        dbConfig.setLogicNotDeleteValue("0");
        config.setDbConfig(dbConfig);
        return config;
    }
}

到此這篇關于Mybatis/MybatisPlus公共字段填充與配置邏輯刪除的文章就介紹到這了,更多相關MybatisPlus公共字段填充與邏輯刪除內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • Java中的record使用詳解

    Java中的record使用詳解

    record 是 Java 14 引入的一種新語法(在 Java 16 中成為正式功能),用于定義不可變的數據類,這篇文章給大家介紹Java中的record相關知識,感興趣的朋友一起看看吧
    2025-06-06
  • spring?mybatis環(huán)境常量與枚舉轉換示例詳解

    spring?mybatis環(huán)境常量與枚舉轉換示例詳解

    這篇文章主要為大家介紹了spring?mybatis環(huán)境常量與枚舉轉換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • java實現小貓釣魚游戲

    java實現小貓釣魚游戲

    這篇文章主要為大家詳細介紹了java實現小貓釣魚游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • SpringBoot之那些注入不了的Spring占位符(${}表達式)問題

    SpringBoot之那些注入不了的Spring占位符(${}表達式)問題

    這篇文章主要介紹了SpringBoot之那些注入不了的Spring占位符(${}表達式)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • JAVA記住密碼功能的實現代碼

    JAVA記住密碼功能的實現代碼

    這篇文章主要介紹了JAVA記住密碼功能的實現代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • 詳解Maven optional關鍵字透徹圖解

    詳解Maven optional關鍵字透徹圖解

    這篇文章主要介紹了詳解Maven optional關鍵字透徹圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • idea git設置Local Changes窗口過程(代碼/文件變更顯示)

    idea git設置Local Changes窗口過程(代碼/文件變更顯示)

    本文介紹了在IDEA中,當代碼有變更但未顯示LocalChanges窗口時,可以通過設置取消勾選“Usenon-modalcommitinterface”選項來解決該問題
    2026-04-04
  • 解析SpringSecurity+JWT認證流程實現

    解析SpringSecurity+JWT認證流程實現

    這篇文章主要介紹了解析SpringSecurity+JWT認證流程實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • JAVA中String類的使用方法示例講解

    JAVA中String類的使用方法示例講解

    在Java開發(fā)中,String類作為操作字符串的核心工具,其功能強大且應用廣泛,這篇文章主要介紹了JAVA中String類使用方法的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-05-05
  • java多線程編程之InheritableThreadLocal

    java多線程編程之InheritableThreadLocal

    這篇文章主要為大家詳細介紹了java多線程編程之InheritableThreadLocal,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評論

南雄市| 龙游县| 昭通市| 县级市| 海宁市| 平罗县| 铜梁县| 舒兰市| 饶平县| 枝江市| 德格县| 富平县| 南充市| 民县| 徐水县| 贵定县| 辽阳县| 寻乌县| 福安市| 舒城县| 砀山县| 辛集市| 盐池县| 溆浦县| 福建省| 浦江县| 大埔区| 湘潭县| 克山县| 中卫市| 永安市| 巴楚县| 永仁县| 湘潭市| 仙居县| 禄丰县| 江山市| 城固县| 石嘴山市| 安顺市| 元江|