SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題及解決方法
SpringBoot整合Myabtis-Plus
在與官網(wǎng)配置一致的情況下依舊無法生效,如下整合mybatis-plus
1、依賴導(dǎo)入
<!-- mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.4</version>
</dependency>其余的springboot與mysql相關(guān)的依賴就無需展示
配置文件配置
mybatis-plus:
global-config:
db-config:
# 邏輯刪除,刪除標(biāo)志
logic-delete-value: 1
# 邏輯刪除,未刪除標(biāo)志
logic-not-delete-value: 0
type-aliases-package: com.fang.pojo
configuration:
# mybatis-plus日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl2、數(shù)據(jù)庫插入
數(shù)據(jù)庫以此為例
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 '狀態(tài),0為正常,1為異常',
create_time DATETIME NOT NULL COMMENT '創(chuàng)建時間',
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層中實現(xiàn)
3.2、configuration
3.2.1、TableField的insert與update
insert表示插入這一數(shù)據(jù)時,自動將當(dāng)前時間填充至此屬性
update表示修改此數(shù)據(jù)時,自動將當(dāng)前時間填充
這里官網(wǎng)有告訴我們?nèi)绾闻渲茫?/p>
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、樂觀鎖配置
官網(wǎng)也有指出如何配置
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> {
}實現(xiàn)類:
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測試,能夠成功獲取全部的集合
這里可以發(fā)現(xiàn)service層無需寫這種簡單地查詢語句,即可實現(xiàn)基本的sql功能
4.2、根據(jù)id修改信息
這里能發(fā)現(xiàn)有時候樂觀鎖不能生效,例如以下例子:
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這樣測試:

修改成功,但是去查看日志,發(fā)現(xiàn)并沒有生效

樂觀鎖并沒有自增
解決方案如下:
新增一個version

此時日志顯示這樣的信息:

數(shù)據(jù)庫中成功自增

如果此時再修改,但version依舊是傳1過去,則修改不成功
得出結(jié)論:version與當(dāng)前數(shù)據(jù)庫不一致則修改失敗
所以我們需要在每次修改時,傳入一個version,通過id查詢當(dāng)前version的值,在通過set傳入實體類中一起發(fā)送到mybatisPlus自帶的修改方法中,則能實現(xiàn)樂觀鎖
到此這篇關(guān)于關(guān)于SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題解決方案的文章就介紹到這了,更多相關(guān)SpringBoot整合MyBatis-Plus樂觀鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于SpringBoot2.7.6連接nacos遇到的一些問題
這篇文章主要介紹了關(guān)于SpringBoot2.7.6連接nacos遇到的一些問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
深入淺出講解Spring框架中AOP及動態(tài)代理的應(yīng)用
在軟件業(yè),AOP為Aspect?Oriented?Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運行期間動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種技術(shù)2022-03-03
校驗非空的注解@NotNull如何取得自定義的message
這篇文章主要介紹了校驗非空的注解@NotNull如何取得自定義的message,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Java上傳文件進度條的實現(xiàn)方法(附demo源碼下載)
這篇文章主要介紹了Java上傳文件進度條的實現(xiàn)方法,可簡單實現(xiàn)顯示文件上傳比特數(shù)及進度的功能,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2015-12-12
Spring Boot中利用JavaMailSender發(fā)送郵件的方法示例(附源碼)
這篇文章主要介紹了Spring Boot中利用JavaMailSender發(fā)送郵件的方法示例, 相信使用過Spring的眾多開發(fā)者都知道Spring提供了非常好用的JavaMailSender接口實現(xiàn)郵件發(fā)送。在Spring Boot的Starter模塊中也為此提供了自動化配置。需要的朋友可以參考借鑒。2017-02-02

