Springboot2整合Mybatisplus实现乐观锁

1.添加pom文件

  <!--  <version>2.1.5.RELEASE</version>Springboot版本 -->

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- mybatisPlus 核心库 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- 引入阿里数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.6</version>
        </dependency>

2.配置文件application.properties

server.port=8088

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

3.编写Mybatis-puls配置类

@Configuration
public class MybatisPlusConfig {

    //乐观锁配置
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
  //下面随意配置
    /**
     * mybatis-plus SQL执行效率插件【生产环境可以关闭】
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        return new PerformanceInterceptor();
    }
    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
    

    @Bean
    public RestTemplate getRestTemplate(){
        return  new RestTemplate();
    }

    //逻辑删除
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }
}

4.编写entity对象

@Data  //注意需要下载lombok插件,不行就写get和set方法
@TableName("bank")
public class Bank implements Serializable {
    private static final long serialVersionUID = 1L;

    @TableId(type = IdType.AUTO)
    private Integer id;

    private Integer amount;

    @Version
    private Integer version;

    private Integer userId;

}

5.编写Mapper

@Mapper
public  interface BankMapper extends BaseMapper<Bank> {
}

6.编写Service

public interface BankSerice extends IService<Bank> {
}

7.编写实现层,根据业务场景去写,这里不详细说明了

@Service
public class BankSeviceImpl extends ServiceImpl<BankMapper,Bank> implements BankSerice {
    
}

8.编写控制层

@RestController
public class BankController {

    @Autowired
    BankSerice bankService;

    @RequestMapping("/bank/{userId}/{money}")
    public String access(@PathVariable("userId") String userId, @PathVariable("money") Integer money) throws InterruptedException {
        QueryWrapper<Bank> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", userId);
        Bank bank = bankService.getOne(queryWrapper);
        Integer amount = bank.getAmount();
        bank.setAmount(amount + money);
        Thread.sleep(5000);
        boolean b = bankService.updateById(bank);
        if (b) {
            return "更新成功";
        }
        return "更新失败,余额已被其他操作人员修改,请重试";
    }
}

9.数据库执行SQL

CREATE TABLE `bank` (
  `id` INT(11) NOT NULL,
  `amount` INT(10) DEFAULT NULL COMMENT '余额',
  `version` INT(5) DEFAULT NULL COMMENT '版本号',
  `user_id` INT(11) DEFAULT NULL COMMENT '用户id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC



INSERT INTO bank (id,amount,VERSION,user_id) VALUES (1,100,0,2)

10.启动Springboot访问http://localhost:8088/bank/2/100

点击2次同时访问

猜你喜欢

转载自blog.csdn.net/qq_41085151/article/details/106906598