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

Mybatis-Plus進(jìn)階分頁與樂觀鎖插件及通用枚舉和多數(shù)據(jù)源詳解

 更新時間:2022年03月21日 15:48:21   作者:扎哇太棗糕  
這篇文章主要介紹了Mybatis-Plus的分頁插件與樂觀鎖插件還有通用枚舉和多數(shù)據(jù)源的相關(guān)介紹,文中代碼附有詳細(xì)的注釋,感興趣的朋友來看看吧

分頁插件

  MP中自帶了分頁插件的功能,只需要在配置類中進(jìn)行簡單的配置即可使用分頁的相關(guān)功能。分頁插件常常與前端的分頁顯示功能相關(guān),為了在前端美觀的顯示查詢到的數(shù)據(jù),通常會使用分頁插件,將所有的數(shù)據(jù)分成許多頁一頁一頁的進(jìn)行顯示,不同頁的切換使用按鈕來完成

MP的插件配置類

@Configuration
public class MybatisPlusConfiguration {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        // 創(chuàng)建一個MybatisPlus的插件攔截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        // 創(chuàng)建分頁的插件對象并設(shè)置數(shù)據(jù)庫類型
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        // 設(shè)置請求的頁面大于最大頁后操作, true調(diào)回到首頁,false 繼續(xù)請求  默認(rèn)false
        paginationInnerInterceptor.setOverflow(true);
        // 設(shè)置分頁的單頁最多條數(shù),默認(rèn) 500 條,-1 不受限制
        paginationInnerInterceptor.setMaxLimit(500L);

        // 將這個分頁插件添加到攔截器中并返回
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
}

自定義方法并調(diào)用分頁

mapper定義方法

@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {

    /**
     * 通過年齡查詢用戶信息并分頁返回
     * @param page 傳入一個page對象
     * @param age  年齡
     * @return 返回一個page對象
     */
    Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);
}

映射文件編寫SQL語句

<mapper namespace="com.xiaochen.mapper.UserMapper">
    <select id="selectPageVo" resultType="com.xiaochen.domain.User">
        select id,name,age,email from user where age > #{age}
    </select>
</mapper>

測試方法調(diào)用自定義方法

@Autowired
UserMapper mapper;

@Test
public void testpage() {

    // 創(chuàng)建一個page對象,設(shè)置當(dāng)前頁是第1頁,每頁包含3條記錄
    Page<User> page = new Page<>(2, 3);

    // mapper調(diào)用selectPage方法之后將結(jié)果返回給上面的page對象
    // 第二個參數(shù)null的話就是查詢所有的記錄,如果有查詢條件的話就傳一個wrapper對象
   mapper.selectPageVo(page, 20);

    // 當(dāng)前頁的數(shù)據(jù)
    System.out.println(page.getRecords());
    // 當(dāng)前是第幾頁
    System.out.println(page.getCurrent());
    // 總頁數(shù)
    System.out.println(page.getPages());
    // 每頁的記錄數(shù)
    System.out.println(page.getSize());
    // 總記錄數(shù)
    System.out.println(page.getTotal());
    // 是否有下一頁
    System.out.println(page.hasNext());
    // 是否有上一頁
    System.out.println(page.hasPrevious());
}

樂觀鎖插件

  要想使用樂觀鎖插件,首先要知道什么是樂觀鎖以及樂觀鎖出現(xiàn)的原因?,F(xiàn)實(shí)生活中,一個管理系統(tǒng)往往不僅僅只有一個管理員,以修改商品價格為例,如果有兩個管理員小李和小王商品的原價為100,老板先是讓小李將商品的價格上調(diào)50,一段時間后讓小王將商品的價格下調(diào)20,由于小李有事耽擱,兩個人同時登錄管理系統(tǒng)獲取到商品的價格對其分別進(jìn)行修改操作。如果小李最后完成操作的話商品最終為150元,如果小王最后完成操作的話商品最終為80元,這樣的話就會造成最終的價格不是老板想要的130。

要想使用代碼實(shí)現(xiàn)上述案例的話,使用線程來實(shí)現(xiàn)的話更加真實(shí)(可以模擬兩人處理先后的不確定性),但是為了簡化操作,設(shè)定最后完成操作的是小王,也即是說最后商品的價格為80

@Test
public void happyLockTest() {
    // 小李查詢商品的價格
    Product productLi = mapper.selectById(1);
    // 小王查詢到商品的價格
    Product productWang = mapper.selectById(1);
    // +50
    productLi.setPrice(productLi.getPrice() + 50);
    mapper.updateById(productLi);
    // -20
    productWang.setPrice(productWang.getPrice() - 20);
    mapper.updateById(productWang);

    // 查詢最終的商品價格
    System.out.println("最終價格為:" + mapper.selectById(1).getPrice());
}

// 控制臺最終打印 -> 最終價格為:80

  有問題就有解決問題的方法,出現(xiàn)這個問題的原因就是兩個管理員同時獲取到了商品的信息并對他進(jìn)行了修改,如果可以使用鎖限制同一時間只能有一個管理員對數(shù)據(jù)進(jìn)行修改操作的話,就可以避免這個問題了,這就是悲觀鎖。

  不對啊,不是說要講樂觀鎖的嘛怎么講到了悲觀鎖了?悲觀鎖將整張表鎖住了,阻止其他人對表進(jìn)行修改操作,這樣的話對效率有很大的折損。于是樂觀鎖應(yīng)運(yùn)而生,樂觀鎖允許任何人任何時候?qū)Ρ碇袛?shù)據(jù)進(jìn)行修改,只不過數(shù)據(jù)表中要添加一個字段表示數(shù)據(jù)的當(dāng)前版本號,數(shù)據(jù)每經(jīng)過一次更新版本號就相應(yīng)加一,數(shù)據(jù)每次更新的時候都會帶上版本號字段作為更新的條件。這樣的話就可以避免之前的問題了,兩人同時獲取到的版本都是0,小李修改之后就會將版本字段值加一也就是1,這時小王修改的時候就會查不到表中版本號為0的數(shù)據(jù)而無法修改。

  這樣的話就會避免修改沖突,但是還是無法得到想要的結(jié)果,于是可以對兩人的修改結(jié)果進(jìn)行判斷,如果更新操作的返回結(jié)果不是0的話就說明更新成功,否則就再次獲取數(shù)據(jù)表中的信息(這次就是為了獲得最新的版本號)再次進(jìn)行更新操作

  使用MP中的樂觀鎖插件,首先需要在配置類中將樂觀鎖插件添加到攔截器中,然后再在實(shí)體類中的版本號字段上使用@Version標(biāo)志,然后就是和平常一樣的操作數(shù)據(jù)庫即可,執(zhí)行更新操作的時候會自動將當(dāng)前查詢到的版本號當(dāng)做條件拼接到SQL語句中

// 將樂觀鎖插件添加到攔截器中
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

// 實(shí)體類標(biāo)注版本號
@Version
private Integer version;

// 測試方法,測試兩個人最后的修改結(jié)果
@Test
public void happyLockTest() {
    // 小李查詢商品的價格
    Product productLi = mapper.selectById(1);
    // 小王查詢到商品的價格
    Product productWang = mapper.selectById(1);
    // +50
    int result = 0;
    do {
        // 更新失敗,重新查詢并修改
        productLi = mapper.selectById(1);
        productLi.setPrice(productLi.getPrice() + 50);
        result = mapper.updateById(productLi);
    } while (result == 0);
    // -20
    do {
        // 更新失敗,重新查詢并修改
        productWang = mapper.selectById(1);
        productWang.setPrice(productWang.getPrice() - 20);
        result = mapper.updateById(productWang);
    } while (result == 0);
    // 查詢最終的商品價格
    System.out.println("最終價格為:" + mapper.selectById(1).getPrice());
}

// 控制臺最終打印 -> 最終價格為:130

通用枚舉類

  對于表中擁有固定幾個值的一些字段,可以使用枚舉類將比較簡單的數(shù)字或字符存入到數(shù)據(jù)庫表中,然后將這個簡單的數(shù)字或字符對應(yīng)著其具體的字符串表示,比如性別0代表女1代表男。這樣就會減輕數(shù)據(jù)庫的存儲壓力,提高用戶的使用體驗(yàn)。 使用MP的通用枚舉必須先創(chuàng)建一個枚舉類,向外提供屬性的getter方法和全參構(gòu)造器,并使用@EnumValue注解將標(biāo)識的屬性值在數(shù)據(jù)庫中存儲

@Getter
@AllArgsConstructor
public enum SexEnum {

    FEMALE(0, "女"),
    MALE(1, "男");

    // 將注解標(biāo)識的屬性值存儲到數(shù)據(jù)庫中
    @EnumValue
    private Integer sex;
    private String sexName;
}

  然后實(shí)體類中修改字段對應(yīng)屬性的類型為枚舉類型,然后重寫toString方法,方便查詢結(jié)果顯示為數(shù)據(jù)表中數(shù)字或字符對應(yīng)的具體的字符串表示

// 修改字段對應(yīng)屬性的類型為枚舉類型
private SexEnum sex;

// 重寫toString方法
@Override
public String toString() {
    return "User{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", sex=" + sex.getSexName() +
            ", age=" + age +
            ", email='" + email + '\'' +
            ", isDeleted=" + isDeleted +
            '}';
}

  最后在配置文件中設(shè)置通用枚舉的包,也就是相當(dāng)于讓你寫的枚舉類生效

mybatis-plus:
  # 設(shè)置通用枚舉的包
  type-enums-package: com.xiaochen.enums

測試

@Test
public void enumTest() {
    
    User user = new User();
    user.setName("張三");
    user.setAge(23);
    user.setSex(SexEnum.FEMALE);
    mapper.insert(user);

    User user1 = mapper.selectById(6);
    System.out.println(user1);
}

測試結(jié)果

多數(shù)據(jù)源

  多數(shù)據(jù)源就是在一個程序中同時配置多個數(shù)據(jù)庫作為數(shù)據(jù)源進(jìn)行操作,適用于多種場景:純粹多庫、 讀寫分離、 一主多從、 混合模式等。目前我們就來模擬一個純粹多庫的一個場景,配置兩個數(shù)據(jù)庫的兩張表,通過一個測試用例分別獲取兩張表的數(shù)據(jù),如果獲取到說明多庫模擬成功

第一步: 導(dǎo)入依賴

<!--mybatis-的場景啟動器-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>

第二步: 配置文件配置多數(shù)據(jù)源

spring:
# 配置數(shù)據(jù)源信息
datasource:
dynamic:
# 設(shè)置默認(rèn)的數(shù)據(jù)源或者數(shù)據(jù)源組,當(dāng)設(shè)置的數(shù)據(jù)源都找不到時使用默認(rèn)數(shù)據(jù)源,默認(rèn)值即為master
primary: master
# 嚴(yán)格匹配數(shù)據(jù)源,默認(rèn)false.true未匹配到指定數(shù)據(jù)源時拋異常,false匹配不到指定數(shù)據(jù)源時使用默認(rèn)數(shù)據(jù)源
strict: false
datasource:
# 主數(shù)據(jù)源
master:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus
username: root
password: 123456
# 從數(shù)據(jù)源
slave_1:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456

第三步: 照常使用方法測試在兩個數(shù)據(jù)庫查詢兩張表,唯一不同的就是在service的實(shí)現(xiàn)類上使用@DS注解,標(biāo)注service實(shí)現(xiàn)類的所有方法都是對指定數(shù)據(jù)源進(jìn)行操作的

測試類及結(jié)果

到此這篇關(guān)于Mybatis-Plus進(jìn)階分頁與樂觀鎖插件及通用枚舉和多數(shù)據(jù)源詳解的文章就介紹到這了,更多相關(guān)Mybatis-Plus 分頁插件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中多環(huán)境yml的配置與打包問題

    SpringBoot中多環(huán)境yml的配置與打包問題

    這篇文章主要介紹了SpringBoot中多環(huán)境yml的配置與打包問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java集合的Collection接口和List接口詳解

    Java集合的Collection接口和List接口詳解

    這篇文章主要為大家詳細(xì)介紹了Java集合的Collection接口和List接口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • JavaSE實(shí)現(xiàn)三子棋游戲

    JavaSE實(shí)現(xiàn)三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了JavaSE實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Springboot 使用 JSR 303 對 Controller 控制層校驗(yàn)及 Service 服務(wù)層 AOP 校驗(yàn) 使用消息資源文件對消息國際化

    Springboot 使用 JSR 303 對 Controller 控制層校驗(yàn)及 Service 服務(wù)層 AOP 校驗(yàn)

    這篇文章主要介紹了Springboot 使用 JSR 303 對 Controller 控制層校驗(yàn)及 Service 服務(wù)層 AOP 校驗(yàn) 使用消息資源文件對消息國際化的相關(guān)知識,需要的朋友可以參考下
    2017-12-12
  • maven依賴沖突加載順序與解決

    maven依賴沖突加載順序與解決

    這篇文章主要介紹了項(xiàng)目中同時引用了相同依賴的不同版本,也就是沖突,maven?是如何選擇的,了解了有助于解決項(xiàng)目中的依賴問題,需要的朋友可以參考下
    2024-01-01
  • java文件上傳至ftp服務(wù)器的方法

    java文件上傳至ftp服務(wù)器的方法

    這篇文章主要為大家詳細(xì)介紹了java文件上傳至ftp服務(wù)器的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 使用zip4j實(shí)現(xiàn)Java中的ZIP文件加密壓縮的操作方法

    使用zip4j實(shí)現(xiàn)Java中的ZIP文件加密壓縮的操作方法

    本文介紹如何通過Maven集成zip4j 1.3.2庫創(chuàng)建帶密碼保護(hù)的ZIP文件,涵蓋依賴配置、代碼示例及加密原理,確保數(shù)據(jù)安全性,感興趣的朋友一起看看吧
    2025-07-07
  • java實(shí)現(xiàn)可視化日歷

    java實(shí)現(xiàn)可視化日歷

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)可視化日歷,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 不知道面試會不會問Lambda怎么用(推薦)

    不知道面試會不會問Lambda怎么用(推薦)

    這篇文章主要介紹了Lambda表達(dá)式用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot整合Kafka、Flink實(shí)現(xiàn)流式處理的方法

    SpringBoot整合Kafka、Flink實(shí)現(xiàn)流式處理的方法

    這篇文章給大家介紹SpringBoot整合Kafka、Flink實(shí)現(xiàn)流式處理,本文將指導(dǎo)您如何在SpringBoot應(yīng)用中整合Kafka和Flink,從而實(shí)現(xiàn)一個完整的實(shí)時數(shù)據(jù)處理流水線,感興趣的朋友跟隨小編一起看看吧
    2025-06-06

最新評論

大英县| 无为县| 巩义市| 罗城| 镇沅| 温州市| 鹤山市| 延安市| 华亭县| 呼和浩特市| 卢湾区| 红安县| 阿鲁科尔沁旗| 江西省| 大连市| 正镶白旗| 江华| 永德县| 沁水县| 怀集县| 柳江县| 琼中| 隆化县| 平远县| 扶沟县| 民丰县| 永川市| 偏关县| 辽宁省| 边坝县| 河南省| 北辰区| 晋江市| 湛江市| 香港 | 南岸区| 无极县| 宁晋县| 仙桃市| 塔城市| 长沙市|