SpringBoot整合MyBatis-Plus樂(lè)觀鎖不生效的問(wèn)題及解決方法
SpringBoot整合Myabtis-Plus
在與官網(wǎng)配置一致的情況下依舊無(wú)法生效,如下整合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)的依賴就無(wú)需展示
配置文件配置
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.StdOutImpl
2、數(shù)據(jù)庫(kù)插入
數(shù)據(jù)庫(kù)以此為例
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)建時(shí)間', update_time DATETIME COMMENT '修改時(shí)間', deleted INT DEFAULT 0 COMMENT '假刪除', version INT DEFAULT 1 COMMENT '樂(lè)觀鎖', 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 ('一號(hào)', '123', '123@qq.com', CURRENT_DATE), ('二號(hào)','234','234.qq.com',CURRENT_DATE), ('三號(hào)','345','345.qq.com',CURRENT_DATE), ('四號(hào)','456','456.qq.com',CURRENT_DATE), ('五號(hào)','567','567.qq.com',CURRENT_DATE), ('六號(hào)','678','678.qq.com',CURRENT_DATE);
3、SpringBoot各個(gè)層次的操作
3.1、實(shí)體類
/** * @author FPH * @since 2022.04.27 03點(diǎn)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指定表的主鍵,并且定義這是一個(gè)自增的主鍵
@TableField表示填充此屬性,
@TableLogic表示假刪除
@Version表示樂(lè)觀鎖
以上配置均將在configuration層中實(shí)現(xiàn)
3.2、configuration
3.2.1、TableField的insert與update
insert表示插入這一數(shù)據(jù)時(shí),自動(dòng)將當(dāng)前時(shí)間填充至此屬性
update表示修改此數(shù)據(jù)時(shí),自動(dòng)將當(dāng)前時(shí)間填充
這里官網(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、樂(lè)觀鎖配置
官網(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點(diǎn)59分 */ @Configuration public class MybatisPlus { /** * 樂(lè)觀鎖 */ @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> { }
實(shí)現(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、控制層測(cè)試
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測(cè)試,能夠成功獲取全部的集合
這里可以發(fā)現(xiàn)service層無(wú)需寫這種簡(jiǎn)單地查詢語(yǔ)句,即可實(shí)現(xiàn)基本的sql功能
4.2、根據(jù)id修改信息
這里能發(fā)現(xiàn)有時(shí)候樂(lè)觀鎖不能生效,例如以下例子:
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這樣測(cè)試:
修改成功,但是去查看日志,發(fā)現(xiàn)并沒(méi)有生效
樂(lè)觀鎖并沒(méi)有自增
解決方案如下:
新增一個(gè)version
此時(shí)日志顯示這樣的信息:
數(shù)據(jù)庫(kù)中成功自增
如果此時(shí)再修改,但version依舊是傳1過(guò)去,則修改不成功
得出結(jié)論:version與當(dāng)前數(shù)據(jù)庫(kù)不一致則修改失敗
所以我們需要在每次修改時(shí),傳入一個(gè)version,通過(guò)id查詢當(dāng)前version的值,在通過(guò)set傳入實(shí)體類中一起發(fā)送到mybatisPlus自帶的修改方法中,則能實(shí)現(xiàn)樂(lè)觀鎖
到此這篇關(guān)于關(guān)于SpringBoot整合MyBatis-Plus樂(lè)觀鎖不生效的問(wèn)題解決方案的文章就介紹到這了,更多相關(guān)SpringBoot整合MyBatis-Plus樂(lè)觀鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于SpringBoot2.7.6連接nacos遇到的一些問(wèn)題
這篇文章主要介紹了關(guān)于SpringBoot2.7.6連接nacos遇到的一些問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06深入淺出講解Spring框架中AOP及動(dòng)態(tài)代理的應(yīng)用
在軟件業(yè),AOP為Aspect?Oriented?Programming的縮寫,意為:面向切面編程,通過(guò)預(yù)編譯方式和運(yùn)行期間動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)2022-03-03校驗(yàn)非空的注解@NotNull如何取得自定義的message
這篇文章主要介紹了校驗(yàn)非空的注解@NotNull如何取得自定義的message,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java上傳文件進(jìn)度條的實(shí)現(xiàn)方法(附demo源碼下載)
這篇文章主要介紹了Java上傳文件進(jìn)度條的實(shí)現(xiàn)方法,可簡(jiǎn)單實(shí)現(xiàn)顯示文件上傳比特?cái)?shù)及進(jìn)度的功能,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2015-12-12Spring Boot中利用JavaMailSender發(fā)送郵件的方法示例(附源碼)
這篇文章主要介紹了Spring Boot中利用JavaMailSender發(fā)送郵件的方法示例, 相信使用過(guò)Spring的眾多開(kāi)發(fā)者都知道Spring提供了非常好用的JavaMailSender接口實(shí)現(xiàn)郵件發(fā)送。在Spring Boot的Starter模塊中也為此提供了自動(dòng)化配置。需要的朋友可以參考借鑒。2017-02-02java web實(shí)現(xiàn)簡(jiǎn)單留言板功能
這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)簡(jiǎn)單留言板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11