MyBatis-Plus注解雙杰:@TableLogic與@Version,數據操作更高效
在數據持久化框架MyBatis-Plus中,@TableLogic和@Version注解為我們提供了強大的功能,分別用于實現邏輯刪除和樂觀鎖機制。
1. @TableLogic注解:邏輯刪除的藝術
什么是邏輯刪除
邏輯刪除是一種常見的刪除策略,它并不真正從數據庫中刪除數據記錄,而是通過修改某個標記字段的值來表示記錄已經被刪除。這種方式的好處在于,數據在被標記為刪除后依然存在于數據庫中,方便以后恢復或者審計。
@TableLogic注解的作用
@TableLogic是MyBatis-Plus提供的一個注解,用于標識實體類中的邏輯刪除字段。當執行刪除操作時,MyBatis-Plus會自動將這個字段的值設置為指定的邏輯刪除值(通常是1),而不是真正刪除記錄。
使用方法
首先,確保你的項目中已經添加了MyBatis-Plus的依賴。如果還沒有,可以在pom.xml中添加以下依賴
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
然后,在你的實體類中使用@TableLogic注解來標記邏輯刪除字段。例如
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("user")
public class User {
private Long id;
// 邏輯刪除字段
@TableLogic
private Integer deleted;
}
配置
@TableLogic注解通常不需要額外配置,它會自動處理邏輯刪除的標記。但是,你可以在注解中指定邏輯刪除的值和未刪除的值,例如
@TableLogic(value = "0", delval = "1")
這里的value表示未刪除的值,delval表示邏輯刪除的值。不過,通常使用默認值即可。
通過配置文件同樣可以進行設置
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
2.@Version注解:樂觀鎖的實現
什么是樂觀鎖
樂觀鎖是一種并發控制機制,它假設多用戶并發訪問時不會產生沖突,因此在更新數據時不會直接鎖定記錄。而是在更新時檢查記錄是否被其他用戶修改過,如果未被修改,則執行更新操作;否則,更新失敗。
@Version注解的作用
@Version注解用于標識實體類的樂觀鎖字段。在更新數據時,MyBatis-Plus會自動檢查這個字段的值是否發生變化,如果發生變化,則更新失敗;否則,執行更新操作。
使用方法
首先,在你的實體類中使用@Version注解來標記樂觀鎖字段。例如
import com.baomidou.mybatisplus.annotation.Version;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("user")
public class User {
private Long id;
// 版本號字段
@Version
private Integer version;
}
在上述代碼中,@Version注解標記了version字段為樂觀鎖字段。在更新數據時,MyBatis-Plus會自動檢查這個字段的值是否發生變化。
配置
默認情況下,MyBatis Plus已經為樂觀鎖做好了準備,無需額外配置即可工作。但如果你需要調整樂觀鎖失敗時的行為,可以通過繼承OptimisticLockerInterceptor并重寫相關方法來自定義行為。
- 步驟一:創建自定義攔截器
首先,創建一個類繼承自OptimisticLockerInterceptor,并根據需要重寫相應的方法。在這個例子中,我們將重寫updateById方法來實現自定義邏輯。
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
public class CustomOptimisticLockerInterceptor extends OptimisticLockerInnerInterceptor {
@Override
public void updateById(Executor executor, MappedStatement ms, Object parameter) {
try {
// 調用父類方法嘗試執行更新操作
super.updateById(executor, ms, parameter);
System.out.println("Update succeeded.");
} catch (Exception e) {
// 自定義處理邏輯,如記錄日志等
System.err.println("Update failed due to version conflict: " + e.getMessage());
// 可以選擇在這里添加更多的處理邏輯
}
}
}
- 步驟二:配置插件
然后,在Spring Boot應用中配置這個自定義攔截器。可以通過覆蓋MybatisPlusConfig類的getPlugins()方法來添加自定義的樂觀鎖攔截器。
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加自定義樂觀鎖攔截器
interceptor.addInnerInterceptor(new CustomOptimisticLockerInterceptor());
return interceptor;
}
}
通過上述步驟,我們成功地創建了一個自定義的樂觀鎖攔截器,并將其整合到了MyBatis Plus中。這樣,當發生版本沖突時,我們的應用程序將按照預設的方式處理,而非簡單地拋出異常。
3.小結
- @TableLogic使我們能夠輕松實現邏輯刪除,保護重要數據不被物理刪除。
- @Version提供了一種簡單有效的樂觀鎖定機制,保證了數據的一致性和完整性。
通過上述介紹,我們可以看出MyBatis Plus提供的這兩個注解極大地簡化了邏輯刪除和樂觀鎖的實現過程,使得開發人員可以更加專注于業務邏輯的實現而不用擔心底層數據操作的復雜性。希望這篇文章能幫助你更好地理解和應用MyBatis Plus中的這些強大功能。