Mybatis/MybatisPlus公共字段填充與配置邏輯刪除
在開發(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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
spring?mybatis環(huán)境常量與枚舉轉換示例詳解
這篇文章主要為大家介紹了spring?mybatis環(huán)境常量與枚舉轉換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
SpringBoot之那些注入不了的Spring占位符(${}表達式)問題
這篇文章主要介紹了SpringBoot之那些注入不了的Spring占位符(${}表達式)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
idea git設置Local Changes窗口過程(代碼/文件變更顯示)
本文介紹了在IDEA中,當代碼有變更但未顯示LocalChanges窗口時,可以通過設置取消勾選“Usenon-modalcommitinterface”選項來解決該問題2026-04-04
java多線程編程之InheritableThreadLocal
這篇文章主要為大家詳細介紹了java多線程編程之InheritableThreadLocal,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10

