最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題及解決方法

 更新時(shí)間:2022年04月28日 09:11:07   作者:FPH-9-11  
這篇文章主要介紹了SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題解決方案,通過實(shí)例代碼介紹了SpringBoot各個(gè)層次的操作,需要的朋友可以參考下

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.StdOutImpl

2、數(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)建時(shí)間',
    update_time DATETIME  COMMENT '修改時(shí)間',
    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 ('一號(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表示樂觀鎖

以上配置均將在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、樂觀鎖配置

官網(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 {
    /**
     * 樂觀鎖
     */
    @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層無需寫這種簡(jiǎn)單地查詢語句,即可實(shí)現(xiàn)基本的sql功能

4.2、根據(jù)id修改信息

這里能發(fā)現(xiàn)有時(shí)候樂觀鎖不能生效,例如以下例子:

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)并沒有生效

樂觀鎖并沒有自增

解決方案如下:

新增一個(gè)version

此時(shí)日志顯示這樣的信息:

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

如果此時(shí)再修改,但version依舊是傳1過去,則修改不成功

得出結(jié)論:version與當(dāng)前數(shù)據(jù)庫不一致則修改失敗

所以我們需要在每次修改時(shí),傳入一個(gè)version,通過id查詢當(dāng)前version的值,在通過set傳入實(shí)體類中一起發(fā)送到mybatisPlus自帶的修改方法中,則能實(shí)現(xiàn)樂觀鎖

到此這篇關(guān)于關(guān)于SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題解決方案的文章就介紹到這了,更多相關(guān)SpringBoot整合MyBatis-Plus樂觀鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何在IDEA中快速解決Jar沖突詳解

    如何在IDEA中快速解決Jar沖突詳解

    相信很多同學(xué)在過去做項(xiàng)目都遇到過Jar沖突的問題,在本地環(huán)境沒問題,一旦部署到測(cè)試或生產(chǎn)環(huán)境突然就啟動(dòng)報(bào)錯(cuò),報(bào)類似classNotFound的Exception,本文詳細(xì)整理了如何在IDEA中快速解決Jar沖突,需要的朋友可以參考下
    2021-06-06
  • LeetCode程序員面試題之遞歸乘法

    LeetCode程序員面試題之遞歸乘法

    在Java中,遞歸乘法是一種簡(jiǎn)單而有效的方法,可以用來計(jì)算兩個(gè)數(shù)字的乘積。它的基本思想是:如果第一個(gè)數(shù)字是0,則乘積為0;如果第一個(gè)數(shù)字是1,則乘積為第二個(gè)數(shù)字;其他情況,則通過將第一個(gè)數(shù)字減1,并將第二個(gè)數(shù)字與自身相乘,來實(shí)現(xiàn)遞歸乘法。
    2023-02-02
  • Java實(shí)現(xiàn)調(diào)用jython執(zhí)行python文件的方法

    Java實(shí)現(xiàn)調(diào)用jython執(zhí)行python文件的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)調(diào)用jython執(zhí)行python文件的方法,結(jié)合實(shí)例形式分析了Java調(diào)用jython執(zhí)行python文件的常見操作技巧及相關(guān)問題解決方法,需要的朋友可以參考下
    2018-03-03
  • 詳解Java中二叉樹的基礎(chǔ)概念(遞歸&迭代)

    詳解Java中二叉樹的基礎(chǔ)概念(遞歸&迭代)

    二叉樹(Binary?tree)是樹形結(jié)構(gòu)的一個(gè)重要類型。本文將通過圖片和示例代碼詳細(xì)為大家講解一下Java中的二叉樹的基礎(chǔ)概念,需要的可以參考一下
    2022-03-03
  • SpringBoot整合InfluxDB的詳細(xì)過程

    SpringBoot整合InfluxDB的詳細(xì)過程

    InfluxDB是一個(gè)開源的時(shí)間序列數(shù)據(jù)庫,由Go語言編寫,適用于存儲(chǔ)和查詢按時(shí)間順序產(chǎn)生的數(shù)據(jù),它具有高效的數(shù)據(jù)存儲(chǔ)和查詢機(jī)制,支持高并發(fā)寫入和查詢,靈活的數(shù)據(jù)模型和強(qiáng)大的查詢語言,本文介紹SpringBoot整合InfluxDB的詳細(xì)過程,感興趣的朋友一起看看吧
    2024-12-12
  • Eclipse快速添加get、set方法的操作技巧

    Eclipse快速添加get、set方法的操作技巧

    這篇文章主要介紹了Eclipse快速添加get、set方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • java后端調(diào)用第三方接口返回圖片流給前端的具體代碼實(shí)現(xiàn)

    java后端調(diào)用第三方接口返回圖片流給前端的具體代碼實(shí)現(xiàn)

    在前后端分離的開發(fā)中,經(jīng)常會(huì)遇到需要從后端返回圖片流給前端的情況,下面這篇文章主要給大家介紹了關(guān)于java后端調(diào)用第三方接口返回圖片流給前端的具體代碼實(shí)現(xiàn),需要的朋友可以參考下
    2024-02-02
  • SpringBoot集成pf4j實(shí)現(xiàn)插件開發(fā)功能的代碼示例

    SpringBoot集成pf4j實(shí)現(xiàn)插件開發(fā)功能的代碼示例

    pf4j是一個(gè)插件框架,用于實(shí)現(xiàn)插件的動(dòng)態(tài)加載,支持的插件格式(zip、jar),本文給大家介紹了SpringBoot集成pf4j實(shí)現(xiàn)插件開發(fā)功能的示例,文中通過代碼示例給大家講解的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • SpringMVC注解的入門實(shí)例詳解

    SpringMVC注解的入門實(shí)例詳解

    這篇文章主要為大家介紹了SpringMVC注解的入門實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 一種新的日期處理方式之JavaScript Temporal API

    一種新的日期處理方式之JavaScript Temporal API

    JavaScript Temporal API是一種為Web開發(fā)人員提供了一種新的處理日期和時(shí)間數(shù)據(jù)類型的方式。它的目的是使操作日期和時(shí)間更加簡(jiǎn)單和可靠,而且不用擔(dān)心歷史時(shí)區(qū)問題或全球化協(xié)調(diào)時(shí)間(UTC)之類的問題,感興趣的同學(xué)可以參考閱讀
    2023-05-05

最新評(píng)論

汾阳市| 筠连县| 辽宁省| 砀山县| 仙游县| 陇川县| 麻城市| 高安市| 青岛市| 万载县| 伊宁市| 桂阳县| 赣榆县| 蒙山县| 崇仁县| 定西市| 绥江县| 偏关县| 威信县| 兴隆县| 开封县| 工布江达县| 西华县| 额敏县| 张北县| 肥西县| 望城县| 达孜县| 和静县| 兴隆县| 普兰店市| 林周县| 红桥区| 松原市| 肥城市| 蒲江县| 毕节市| 尼勒克县| 阿荣旗| 昌图县| 二连浩特市|