SpringBoot整合MyBatis-Plus乐观锁不生效的问题及解决方法

目录
  • SpringBoot整合Myabtis-Plus
  • 1、依赖导入
  • 2、数据库插入
  • 3、SpringBoot各个层次的操作
    • 3.1、实体类
    • 3.2、configuration
      • 3.2.1、TableField的insert与update
      • 3.2.2、乐观锁配置
    • 3.3、mapper层
    • 3.4、service层
  • 4、控制层测试
    • 4.1、查询所有
    • 4.2、根据id修改信息

SpringBoot整合Myabtis-Plus

在与官网配置一致的情况下依旧无法生效,如下整合mybatis-plus

1、依赖导入

<!--        mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3.4</version>
</dependency>

其余的springboot与mysql相关的依赖就无需展示

配置文件配置

mybatis-plus:
  global-config:
    db-config:
      #      逻辑删除,删除标志
      logic-delete-value: 1
      #      逻辑删除,未删除标志
      logic-not-delete-value: 0
  type-aliases-package: com.fang.pojo
  configuration:
    #    mybatis-plus日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2、数据库插入

数据库以此为例

DROP TABLE IF EXISTS sys_user;
CREATE TABLE rbac_plus.sys_user
(
    id INT AUTO_INCREMENT NOT NULL COMMENT '主键ID',
    name VARCHAR(50) NOT NULL COMMENT '名称',
    password VARCHAR(500) NOT NULL COMMENT '密码',
    email VARCHAR(200) NOT NULL  COMMENT '邮箱',
    state INT NOT NULL DEFAULT 0 COMMENT '状态,0为正常,1为异常',
    create_time DATETIME NOT NULL COMMENT '创建时间',
    update_time DATETIME  COMMENT '修改时间',
    deleted INT DEFAULT 0  COMMENT '假删除',
    version INT DEFAULT 1  COMMENT '乐观锁',
    PRIMARY KEY (id)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='user表';
INSERT INTO `rbac_plus`.`sys_user` (`name`, `password`, `email`, `create_time`) VALUES ('一号', '123', '123@qq.com', CURRENT_DATE),
											('二号','234','234.qq.com',CURRENT_DATE),
											('三号','345','345.qq.com',CURRENT_DATE),
											('四号','456','456.qq.com',CURRENT_DATE),
											('五号','567','567.qq.com',CURRENT_DATE),
											('六号','678','678.qq.com',CURRENT_DATE);

3、SpringBoot各个层次的操作

3.1、实体类

/**
 * @author FPH
 * @since 2022.04.27 03点46分
 */
@Data
@TableName("sys_user")
public class SysUser implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String name;
    private String password;
    private String email;
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.UPDATE)
    private Date updateTime;
    @TableLogic
    private Integer deleted;
    @Version
    private Integer version;

@TableName指定表名

@TableId指定表的主键,并且定义这是一个自增的主键

@TableField表示填充此属性,

@TableLogic表示假删除

@Version表示乐观锁

以上配置均将在configuration层中实现

3.2、configuration

3.2.1、TableField的insert与update

insert表示插入这一数据时,自动将当前时间填充至此属性

update表示修改此数据时,自动将当前时间填充

这里官网有告诉我们如何配置:

package com.fang.configuration;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
 * @author FPH
 * @since 2022年4月27日04:17:56
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime",new Date(),metaObject);
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

3.2.2、乐观锁配置

官网也有指出如何配置

package com.fang.configuration;
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;
/**
 * @author FPH
 * @since 2022.04.27 03点59分
 */
@Configuration
public class MybatisPlus {
    /**
     * 乐观锁
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

3.3、mapper层

package com.fang.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fang.pojo.SysUser;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
 * @author FPH
 * @since 2022年4月27日04:04:16
 */
@Repository
public interface SysUserMapper extends BaseMapper<SysUser> {
}

3.4、service层

package com.fang.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fang.pojo.SysUser;
import java.util.List;
/**
 * @author FPH
 * @since 2022年4月27日04:06:07
 */
public interface SysUserService extends IService<SysUser> {
}

实现类:

package com.fang.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fang.mapper.SysUserMapper;
import com.fang.pojo.SysUser;
import com.fang.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * @author FPH
 * @since 2022年4月27日04:07:58
 */
@Service("SysUserService")
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {
    @Autowired
    private SysUserMapper sysUserMapper;
}

4、控制层测试

4.1、查询所有

package com.fang.controller;
import com.fang.pojo.SysUser;
import com.fang.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * @author FPH
 * @since 2022年4月27日04:09:41
 */
@RestController
@RequestMapping("/sysUser")
public class SysUserController {
    @Autowired
    private SysUserService sysUserService;

    @GetMapping("/baseSelAll")
    public List<SysUser> BaseSelectAll(){
        return sysUserService.list();
    }
}

ApiPost测试,能够成功获取全部的集合

这里可以发现service层无需写这种简单地查询语句,即可实现基本的sql功能

4.2、根据id修改信息

这里能发现有时候乐观锁不能生效,例如以下例子:

package com.fang.controller;
import com.fang.pojo.SysUser;
import com.fang.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * @author FPH
 * @since 2022年4月27日04:09:41
 */
@RestController
@RequestMapping("/sysUser")
public class SysUserController {
    @Autowired
    private SysUserService sysUserService;

    @PutMapping("updateById")
    public String updateById(SysUser sysUser){
        return sysUserService.updateById(sysUser)+"";
    }
}

apiPost这样测试:

修改成功,但是去查看日志,发现并没有生效

乐观锁并没有自增

解决方案如下:

新增一个version

此时日志显示这样的信息:

数据库中成功自增

如果此时再修改,但version依旧是传1过去,则修改不成功

得出结论:version与当前数据库不一致则修改失败

所以我们需要在每次修改时,传入一个version,通过id查询当前version的值,在通过set传入实体类中一起发送到mybatisPlus自带的修改方法中,则能实现乐观锁

到此这篇关于关于SpringBoot整合MyBatis-Plus乐观锁不生效的问题解决方案的文章就介绍到这了,更多相关SpringBoot整合MyBatis-Plus乐观锁内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot整合mybatis的超详细过程(配置模式+注解模式)

    目录 一.简单介绍 二具体配置 2.1.配置相关的依赖. 2.2 写.mapper.controller.service 2.2.1mapper文件 2.2.2service文件 2.2.2controller文件 2.3配置相关文件 三.结果截图 四.可能遇到的报错 一.简单介绍 1.配置相关的依赖2.配置模式3写.mapper.controller.service4.配置yaml文件 配置mybatis全局配置文件(这里我使用的是配置模式+注解模式所以需要配置全局文件) 二具体配置 2.1.

  • SpringBoot整合MybatisPlus实现增删改查功能

    目录 1.概述 2.引入依赖 3.配置连接信息 4.新建两个表 5.在项目中创建相应的实体类 5.1 创建基础实体类 5.2 SysDictType实体类 5.3 SysDictData实体类 6.创建DAO继承MybatisPlus增强接口 6.1 SysDictTypeMapper 6.2 SysDictDataMapper 7.进一步封装到Service层 7.1 定义Service接口中的抽象方法 7.2 实现Service接口中的方法 8.在控制层上进行增删改查操作 8.1 SysDi

  • SpringBoot整合Mybatis-plus的具体使用

    目录 一.mybatis-plus简介: 二.springboot整合mybatis-plus案例 一.mybatis-plus简介: Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生.这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网.那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于J

  • springboot整合mybatis流程详解

    目录 1.mybatis是什么 2.整合 2.1 导入依赖 2.2 创建包和类 2.3 在application.yaml配置mybatis 3.使用注解版mybaits 4.实战过程 1.mybatis是什么 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作.MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型.接口和 Java POJO(Plain Old Java

  • Springboot+Mybatis实现分页加条件查询功能

    本文实例为大家分享了Springboot+Mybatis实现分页加条件查询的具体代码,供大家参考,具体内容如下 User.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"         "http://mybatis.org/dtd/mybatis-3-mapp

  • springboot整合mybatisplus的方法详解

    目录 POM: application.yaml: POJO: mapper接口: 包扫描: 测试: 总结 POM: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <dependenc

  • 基于SpringBoot使用MyBatis插件的问题

    1:MyBatis MyBatis-Plus为我们提供了强大的mapper和service模板,能够大大的提高开发效率.但是在真正开发过程中,MyBatis-Plus并不能为我们解决所有问题,例如一些复杂的SQL,多表联查,我们就需要自己去编写代码和SQL语句,我们该如何快速的解决这个问题呢,这个时候可以使用MyBatisX插件.MyBatisX插件一款基于 IDEA 的快速开发插件,为效率而生. 2:MyBatis安装和使用 1:使用IDEA连接本机数据库 2:Maven引入依赖使用MyBat

  • SpringBoot、mybatis返回树结构的数据实现

    公司有个业务需要查出所有的用户权限分类,并将最后一层类别所包含的权限查出来. 数据库说明,有一个parent_id 字段是最好的:. parent_id的值就是上级的id,一般的话,最顶级的parent_id是设置为0. 先看看表结构: 下面不说废话,直接上代码: 定义的vo类: @ApiModelProperty("id") private Long id; @ApiModelProperty("父ID") private Long parentId; @ApiM

  • SpringBoot中的Mybatis依赖问题

    Pom导入依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> application.yml #配置数据源,yml格式 spring: datasource: ur

  • SpringBoot整合MyBatis-Plus乐观锁不生效的问题及解决方法

    目录 SpringBoot整合Myabtis-Plus 1.依赖导入 2.数据库插入 3.SpringBoot各个层次的操作 3.1.实体类 3.2.configuration 3.2.1.TableField的insert与update 3.2.2.乐观锁配置 3.3.mapper层 3.4.service层 4.控制层测试 4.1.查询所有 4.2.根据id修改信息 SpringBoot整合Myabtis-Plus 在与官网配置一致的情况下依旧无法生效,如下整合mybatis-plus 1.

  • SpringBoot整合MyBatis实现乐观锁和悲观锁的示例

    本文以转账操作为例,实现并测试乐观锁和悲观锁. 全部代码:https://github.com/imcloudfloating/Lock_Demo GitHub Page:https://cloudli.top 死锁问题 当 A, B 两个账户同时向对方转账时,会出现如下情况: 时刻 事务 1 (A 向 B 转账) 事务 2 (B 向 A 转账) T1 Lock A Lock B T2 Lock B (由于事务 2 已经 Lock A,等待) Lock A (由于事务 1 已经 Lock B,等

  • SpringBoot整合Mybatis自定义拦截器不起作用的处理方案

    目录 SpringBoot整合Mybatis自定义拦截器不起作用 1. 原始的读取mybatis-config.xml文件 2. 与SpringBoot容器整合 2.1 mybatis的自动装载 3. 在mybatis-config.xml配置又放入Spring容器 SpringBoot 自定义Mybatis拦截器 第一种 第二种 第三种 SpringBoot整合Mybatis自定义拦截器不起作用 Mybatis插件生效的方式: 1. 原始的读取mybatis-config.xml文件 该方式和

  • SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper实例详解

    一.添加所需依赖,当前完整的pom文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&q

  • springboot整合mybatis中的问题及出现的一些问题小结

    1.springboot整合mybatis mapper注入时显示could not autowire,如果强行写(value  = false ),可能会报NullPointException异常 解决方案: dao层加注解@Component(value = "首字母小写的接口名如UserMapper->userMapper") dao层还可以加注解@Mapper 2.The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecogni

  • SpringBoot整合Mybatis实现CRUD

    准备工具:IDEA jdk1.8 Navicat for MySQL Postman 一.新建Project 选择依赖:mybatis Web Mysql JDBC 项目结构 pom依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.o

  • SpringBoot整合mybatis简单案例过程解析

    这篇文章主要介绍了SpringBoot整合mybatis简单案例过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.在springboot项目中的pom.xml中添加mybatis的依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifac

  • SpringBoot整合Mybatis使用Druid数据库连接池

    本文实例为大家分享了SpringBoot整合Mybatis使用Druid数据库连接池的方法,具体内容如下 在SpringBoot项目中,增加如下依赖 <!-- spring mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version

  • SpringBoot整合mybatis结合pageHelper插件实现分页

    SpringBoot整合mybatis分页操作 SpringBoot整合Mybatis进行分页操作,这里需要使用Mybatis的分页插件:pageHelper, 关于pageHelper的介绍,请查看官方文档: https://pagehelper.github.io/ 1.使用前配置 关于pageHelper的使用配置,主要有以下2个步骤: 1.1.在pom文件中导入pageHelper依赖 <dependency> <groupId>com.github.pagehelper&

  • SpringBoot整合Mybatis的知识点汇总

    springboots使用的版本是2.0.1,注意不同版本可能有差异,并不一定通用 添加Mybatis的起步依赖: <!--mybatis起步依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version&

随机推荐