MP 乐观锁与代码生成器
2025/9/17大约 2 分钟
MyBatis-Plus 乐观锁与代码生成器
目录
乐观锁原理与用法
乐观锁用于防止并发更新丢失,适合高并发场景。
1. 数据库表添加version字段
ALTER TABLE user ADD COLUMN version INT DEFAULT 1 COMMENT '乐观锁版本号';
2. 实体类加@Version
import com.baomidou.mybatisplus.annotation.Version;
@Data
public class User {
private Long id;
private String name;
@Version // 乐观锁字段
private Integer version;
}
3. 配置乐观锁拦截器
点击展开乐观锁拦截器配置
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor mpInterceptor() {
MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mpInterceptor;
}
}
4. 并发更新示例
点击展开并发更新示例
// 线程1和线程2几乎同时读取同一条数据
User user1 = userMapper.selectById(1L); // version=1
User user2 = userMapper.selectById(1L); // version=1
user1.setName("A");
userMapper.updateById(user1); // version变为2
user2.setName("B");
userMapper.updateById(user2); // 更新失败,因为version已变
代码生成器
MyBatis-Plus 提供代码生成器,自动生成实体、Mapper、Service、Controller等代码。
1. 添加依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
2. 生成器配置示例
点击展开代码生成器配置
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.annotation.IdType;
public class CodeGenerator {
public static void main(String[] args) {
AutoGenerator autoGenerator = new AutoGenerator();
// 数据源配置
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
dataSource.setUsername("root");
dataSource.setPassword("root");
autoGenerator.setDataSource(dataSource);
// 全局配置
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");
globalConfig.setOpen(false);
globalConfig.setAuthor("YourName");
globalConfig.setFileOverride(true);
globalConfig.setMapperName("%sMapper");
globalConfig.setIdType(IdType.ASSIGN_ID);
autoGenerator.setGlobalConfig(globalConfig);
// 包配置
PackageConfig packageInfo = new PackageConfig();
packageInfo.setParent("com.example");
packageInfo.setEntity("entity");
packageInfo.setMapper("mapper");
autoGenerator.setPackageInfo(packageInfo);
// 策略配置
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setInclude("user");
strategyConfig.setEntityLombokModel(true);
autoGenerator.setStrategy(strategyConfig);
// 执行生成
autoGenerator.execute();
}
}
3. 运行效果
- 自动生成实体、Mapper、Service、Controller等代码
- 支持自定义模板和包结构