在数据持久化框架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中的这些强大功能。