MyBatis-Plus注解雙杰:@TableLogic與@Version,數(shù)據(jù)操作更高效
在數(shù)據(jù)持久化框架MyBatis-Plus中,@TableLogic和@Version注解為我們提供了強(qiáng)大的功能,分別用于實(shí)現(xiàn)邏輯刪除和樂觀鎖機(jī)制。
1. @TableLogic注解:邏輯刪除的藝術(shù)
什么是邏輯刪除
邏輯刪除是一種常見的刪除策略,它并不真正從數(shù)據(jù)庫中刪除數(shù)據(jù)記錄,而是通過修改某個(gè)標(biāo)記字段的值來表示記錄已經(jīng)被刪除。這種方式的好處在于,數(shù)據(jù)在被標(biāo)記為刪除后依然存在于數(shù)據(jù)庫中,方便以后恢復(fù)或者審計(jì)。
@TableLogic注解的作用
@TableLogic是MyBatis-Plus提供的一個(gè)注解,用于標(biāo)識(shí)實(shí)體類中的邏輯刪除字段。當(dāng)執(zhí)行刪除操作時(shí),MyBatis-Plus會(huì)自動(dòng)將這個(gè)字段的值設(shè)置為指定的邏輯刪除值(通常是1),而不是真正刪除記錄。
使用方法
首先,確保你的項(xiàng)目中已經(jīng)添加了MyBatis-Plus的依賴。如果還沒有,可以在pom.xml中添加以下依賴
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
然后,在你的實(shí)體類中使用@TableLogic注解來標(biāo)記邏輯刪除字段。例如
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注解通常不需要額外配置,它會(huì)自動(dòng)處理邏輯刪除的標(biāo)記。但是,你可以在注解中指定邏輯刪除的值和未刪除的值,例如
@TableLogic(value = "0", delval = "1")
這里的value表示未刪除的值,delval表示邏輯刪除的值。不過,通常使用默認(rèn)值即可。
通過配置文件同樣可以進(jìn)行設(shè)置
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
2.@Version注解:樂觀鎖的實(shí)現(xiàn)
什么是樂觀鎖
樂觀鎖是一種并發(fā)控制機(jī)制,它假設(shè)多用戶并發(fā)訪問時(shí)不會(huì)產(chǎn)生沖突,因此在更新數(shù)據(jù)時(shí)不會(huì)直接鎖定記錄。而是在更新時(shí)檢查記錄是否被其他用戶修改過,如果未被修改,則執(zhí)行更新操作;否則,更新失敗。
@Version注解的作用
@Version注解用于標(biāo)識(shí)實(shí)體類的樂觀鎖字段。在更新數(shù)據(jù)時(shí),MyBatis-Plus會(huì)自動(dòng)檢查這個(gè)字段的值是否發(fā)生變化,如果發(fā)生變化,則更新失??;否則,執(zhí)行更新操作。
使用方法
首先,在你的實(shí)體類中使用@Version注解來標(biāo)記樂觀鎖字段。例如
import com.baomidou.mybatisplus.annotation.Version;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("user")
public class User {
private Long id;
// 版本號(hào)字段
@Version
private Integer version;
}
在上述代碼中,@Version注解標(biāo)記了version字段為樂觀鎖字段。在更新數(shù)據(jù)時(shí),MyBatis-Plus會(huì)自動(dòng)檢查這個(gè)字段的值是否發(fā)生變化。
配置
默認(rèn)情況下,MyBatis Plus已經(jīng)為樂觀鎖做好了準(zhǔn)備,無需額外配置即可工作。但如果你需要調(diào)整樂觀鎖失敗時(shí)的行為,可以通過繼承OptimisticLockerInterceptor并重寫相關(guān)方法來自定義行為。
- 步驟一:創(chuàng)建自定義攔截器
首先,創(chuàng)建一個(gè)類繼承自O(shè)ptimisticLockerInterceptor,并根據(jù)需要重寫相應(yīng)的方法。在這個(gè)例子中,我們將重寫updateById方法來實(shí)現(xiàn)自定義邏輯。
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 {
// 調(diào)用父類方法嘗試執(zhí)行更新操作
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應(yīng)用中配置這個(gè)自定義攔截器??梢酝ㄟ^覆蓋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;
}
}
通過上述步驟,我們成功地創(chuàng)建了一個(gè)自定義的樂觀鎖攔截器,并將其整合到了MyBatis Plus中。這樣,當(dāng)發(fā)生版本沖突時(shí),我們的應(yīng)用程序?qū)凑疹A(yù)設(shè)的方式處理,而非簡(jiǎn)單地拋出異常。
3.小結(jié)
- @TableLogic使我們能夠輕松實(shí)現(xiàn)邏輯刪除,保護(hù)重要數(shù)據(jù)不被物理刪除。
- @Version提供了一種簡(jiǎn)單有效的樂觀鎖定機(jī)制,保證了數(shù)據(jù)的一致性和完整性。
通過上述介紹,我們可以看出MyBatis Plus提供的這兩個(gè)注解極大地簡(jiǎn)化了邏輯刪除和樂觀鎖的實(shí)現(xiàn)過程,使得開發(fā)人員可以更加專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)而不用擔(dān)心底層數(shù)據(jù)操作的復(fù)雜性。希望這篇文章能幫助你更好地理解和應(yīng)用MyBatis Plus中的這些強(qiáng)大功能。