国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

這篇具有很好參考價(jià)值的文章主要介紹了Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


前言

為了鞏固所學(xué)的知識(shí),作者嘗試著開始發(fā)布一些學(xué)習(xí)筆記類的博客,方便日后回顧。當(dāng)然,如果能幫到一些萌新進(jìn)行新技術(shù)的學(xué)習(xí)那也是極好的。作者菜菜一枚,文章中如果有記錄錯(cuò)誤,歡迎讀者朋友們批評(píng)指正。
(博客的參考源碼可以在我主頁(yè)的資源里找到,如果在學(xué)習(xí)的過程中有什么疑問歡迎大家在評(píng)論區(qū)向我提出)


發(fā)現(xiàn)寶藏

前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。【寶藏入口】。

五、CRUD進(jìn)階開發(fā)I

1.mp日志簡(jiǎn)化(加快程序運(yùn)行速度)

  1. 在application.yml中添加配置
# 開啟mp日志 (輸出到控制臺(tái))
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  1. 運(yùn)行結(jié)果(多了很多查詢結(jié)果的詳細(xì)信息)

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 進(jìn)一步簡(jiǎn)化控制臺(tái)輸出
  • 編輯applicatiion.yml(輸入banner就會(huì)有對(duì)應(yīng)提示)

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  • 創(chuàng)建logback.xml并編寫該配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

</configuration>
  1. 簡(jiǎn)化后的控制臺(tái)輸出(spring加載與mybatis-plus加載相關(guān)信息不再顯示)

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

2.條件查詢的三種方式

  1. 方式一:常規(guī)寫法按條件查詢
  • 在測(cè)試類的查詢?nèi)糠椒?selectList() 方法上ctrl + 鼠標(biāo)左鍵進(jìn)入該方法的源代碼,可知當(dāng) selectList() 方法的參數(shù)為null的時(shí)候代表查全部,當(dāng)參數(shù)為Wrapper類的時(shí)候代表按該類的限制條件查詢

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  • 在Wrapper上ctrl + 鼠標(biāo)左鍵進(jìn)入該類源碼,然后crtl + H查看該類的繼承體系,可知該類是個(gè)抽象類,無(wú)法直接使用,此處我們選用該類的實(shí)現(xiàn)類QueryWrapper類來(lái)實(shí)現(xiàn)限制條件的編寫

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  • 在測(cè)試類的 testGetAll() 方法中編寫按條件查詢的代碼
    @Test
    void testGetAll() {
        //按條件查詢
        //創(chuàng)建QueryWrapper類對(duì)象
        QueryWrapper qw = new QueryWrapper<>();
        //編寫限制條件(查詢年齡小于18歲的用戶信息)
        //lt代表 <  gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
        qw.lt("age", 18);
        //將條件Wrapper<T>類型的參數(shù)qw傳入selectList()方法中
        List<User> userList = userDao.selectList(qw);
        System.out.println(userList);
    }
  • 運(yùn)行結(jié)果

可以看到只查詢了2條記錄(原表有4條記錄)

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)
2. 方式二:lambda格式按條件查詢I

  • 常規(guī)寫法中的列名是寫在字符串里的,出錯(cuò)不容易發(fā)現(xiàn),可以借助lambda表達(dá)式確保列名不會(huì)寫錯(cuò),注意QuerWrapper接口后面要注入實(shí)體類
    @Test
    void testGetAll() {
        //方式二:lambda格式按條件查詢I
        //創(chuàng)建QueryWrapper類對(duì)象,并指定泛型
        QueryWrapper<User> qw = new QueryWrapper<User>();
        //編寫限制條件(查詢年齡大于18歲的用戶)
        //lt代表 <  gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
        qw.lambda().gt(User::getAge, 18);
        //將條件Wrapper<T>類型的參數(shù)qw傳入selectList()方法中
        List<User> userList = userDao.selectList(qw);
        System.out.println(userList);
    }
  • 運(yùn)行結(jié)果

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 方式三:lambda格式按條件查詢II(推薦)
    @Test
    void testGetAll() {
        //方式三:lambda格式按條件查詢II
        //創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //編寫限制條件(查詢年齡小于4歲的用戶)
        //lt代表 <  gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
        lqw.lt(User::getAge, 4);
        //將條件Wrapper<T>類型的參數(shù)lqw傳入selectList()方法中
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
  • 運(yùn)行結(jié)果

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 多條件查詢(舉例)
  • and邏輯(比如 x > 3 并且 x < 10)
  @Test
    void testGetAll() {
        //方式三:lambda格式多條件查詢
        //創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //編寫限制條件(查詢大于3歲小于10歲的用戶)
        //lt代表 <  gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
        //鏈?zhǔn)骄幊?/span>
        
        lqw.lt(User::getAge, 10).lqw.gt(User::getAge, 3);
        
        //將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }


  • 運(yùn)行結(jié)果

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  • or邏輯 (比如 x < 3 或者 x > 10)
    @Test
    void testGetAll() {
        //方式三:lambda格式按條件查詢
        //創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //編寫限制條件(查詢年齡大10歲或者小于4歲的用戶)
        //lt代表 <  gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
        //鏈?zhǔn)骄幊?/span>
        
        lqw.gt(User::getAge, 10). or().lt(User::getAge, 4);
        
        //將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
  • 運(yùn)行結(jié)果

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

3.條件查詢null判斷

  1. 應(yīng)用場(chǎng)景舉例

當(dāng)我們?cè)诰W(wǎng)上購(gòu)物的時(shí)候篩選商品價(jià)格區(qū)間一般只設(shè)置上限或者下限,不設(shè)置值的那個(gè)輸入框需要進(jìn)行控制判斷

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 原本的User類作為下限類,新建一個(gè)Userquery類繼承User類表示上限

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

package com.example.dl_mp.domain.query;

import com.example.dl_mp.domain.User;
import lombok.Data;

//@Data 注解的主要作用是提高代碼的簡(jiǎn)潔,
// 使用這個(gè)注解可以省去代碼中大量的get()、 set()、 toString()等方法(這些通用方法可以一鍵生成);
//要使用 @Data 注解要先引入lombok,它是一個(gè)工具類庫(kù),可以用簡(jiǎn)單的注解形式來(lái)簡(jiǎn)化代碼,提高開發(fā)效率。
@Data
public class Userquery extends User {
    //以年齡為例,設(shè)置上限屬性age2
    private Integer age2;
}

  1. 模擬網(wǎng)頁(yè)傳入測(cè)試數(shù)據(jù)
    @Test
    void testGetAll() {
        //模擬頁(yè)面?zhèn)鬟f過來(lái)的查詢數(shù)據(jù)
        Userquery uq = new Userquery();
        uq.setAge(3);
        uq.setAge2(10);

        //創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //編寫限制條件(查詢年齡大于3歲或者小于10歲的用戶)
        //lt代表 <  gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
        lqw.gt(User::getAge, uq.getAge());
        lqw.lt(User::getAge, uq.getAge2());
        //將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }


  • 運(yùn)行結(jié)果(但是如果getAge ()或者getAge2()為空,則查詢失?。?/li>

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 用if語(yǔ)句判斷(太多的if語(yǔ)句程序冗余,能用但是不推薦)
    @Test
    void testGetAll() {
        //模擬頁(yè)面?zhèn)鬟f過來(lái)的查詢數(shù)據(jù)
        Userquery uq = new Userquery();        
        //此處不設(shè)置下限Age的值
        //uq.setAge(3);
        uq.setAge2(10);
        //創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //編寫限制條件(查詢年齡小于10歲的用戶)
        //lt代表 <  gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值        
        if(null != uq.getAge()){
            lqw.gt(User::getAge, uq.getAge());
        }        
        lqw.lt(User::getAge, uq.getAge2());
        //將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }

  • 運(yùn)行結(jié)果

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 用【mybatis-plus條件構(gòu)造器】的語(yǔ)法格式
 @Test
    void testGetAll() {
        //模擬頁(yè)面?zhèn)鬟f過來(lái)的查詢數(shù)據(jù)
        Userquery uq = new Userquery();
        uq.setAge(3);
        //此處不設(shè)置上限限Age2的值
        //uq.setAge2(10);
        //創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //編寫限制條件(查詢年齡大于3歲的用戶)
        //lt代表 <  gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
        lqw.lt(null != uq.getAge2(), User::getAge, uq.getAge2());
        lqw.gt(null != uq.getAge(), User::getAge, uq.getAge());
        //將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
  • 運(yùn)行結(jié)果

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

4. 查詢投影

  1. 如果我們只希望返回某些列的數(shù)據(jù),而不是所有列的數(shù)據(jù),我們可以用SELECT 列1, 列2, 列3 FROM …,讓結(jié)果集僅包含指定列。這種操作稱為【投影查詢】

2.lambda表達(dá)式查詢指定字段

    @Test
    void testGetAll() {
        //查詢投影
        //創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();

        //lambda表達(dá)式查詢指定字段
        lqw.select(User::getId, User::getAge);

        //將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
  • 運(yùn)行結(jié)果

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 如果使用的不是lambda表達(dá)式,就需要手動(dòng)指定字段
 @Test
    void testGetAll() {
        //查詢投影
        //創(chuàng)建QueryWrapper類對(duì)象,并指定泛型
        QueryWrapper<User> lqw = new QueryWrapper<User>();

        //非lambda表達(dá)式查詢指定字段
        lqw.select("age", "id", "password");

        //將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
  • 運(yùn)行結(jié)果

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 聚合查詢 selectMaps()(count、max、min、avg、sum)
    @Test
    void testGetAll() {
        //查詢投影
        //創(chuàng)建QueryWrapper類對(duì)象,并指定泛型
        QueryWrapper<User> lqw = new QueryWrapper<User>();
        //聚合查詢(count、max、min、avg、sum),lambda無(wú)法做聚合查詢
        //as 起別名
        //查詢表中有多少條記錄
        lqw.select("count(*) as count");
        //將條件Wrapper<T>類型的參數(shù)傳入selectMaps()方法中
        List<Map<String, Object>> userList = userDao.selectMaps(lqw);
        System.out.println(userList);
    }
  • 運(yùn)行結(jié)果(結(jié)果集 Map 中 count 是 key, 4 是value)

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 分組查詢( gruopBy() )
    @Test
    void testGetAll() {
        //查詢投影
        //創(chuàng)建QueryWrapper類對(duì)象,并指定泛型
        QueryWrapper<User> lqw = new QueryWrapper<User>();
        //分組查詢(groupby)
        //as 起別名
        //按電話分組并分別計(jì)數(shù)
        lqw.select("count(*) as count, tel");
        lqw.groupBy("tel");
        //將條件Wrapper<T>類型的參數(shù)傳入selectMaps()方法中
        List<Map<String, Object>> userList = userDao.selectMaps(lqw);
        System.out.println(userList);
    }
    
  • 運(yùn)行結(jié)果

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 模糊查詢(like)
    @Test
    void testGetAll() {
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //模糊匹配 like, Left 和 Right指的是%在左邊還是右邊
        lqw.likeRight(User::getName,"J");
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
    
  1. 更多請(qǐng)見【官方條件構(gòu)造器詳解】【查詢投影詳解】

5.映射匹配兼容性(@TableField()和@TableName())

  1. 問題一 :表字段與編碼屬性設(shè)計(jì)不匹配
  • 如圖表字段為 ‘pwd’ ,而實(shí)體類為 ‘password’,查詢會(huì)出現(xiàn)異常,可以在實(shí)體類中通過 @TableField(value = “pwd”) 注解將實(shí)體類屬性與表名進(jìn)行映射匹配

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 問題二 :編碼中添加了數(shù)據(jù)庫(kù)中未定義的屬性
    如圖,實(shí)體類中有用于判斷用戶是否在線的online屬性,而數(shù)據(jù)庫(kù)中沒有相應(yīng)的字段,查詢會(huì)出現(xiàn)異常,可以通過 @TableField(exist = false) 設(shè)置該屬性在數(shù)據(jù)庫(kù)中不存在

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 問題三 :采用默認(rèn)查詢開發(fā)了更多字段查看權(quán)限
    如圖,用戶密碼默認(rèn)在查詢字段中,而該字段并不隨便對(duì)外開放,可以用**@TableField(select = false)**將該字段的查詢權(quán)限關(guān)閉

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 問題四 :表名與編碼開發(fā)設(shè)計(jì)不同步
    可以通過 @TableName(“tbl_user”) 注解將實(shí)體類名與數(shù)據(jù)庫(kù)表名關(guān)聯(lián)起來(lái)
    Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

6.id生成策略(@TableId()或全局配置)

  1. Mybatis-plus提供了多種主鍵生成策略, 可以在Pojo類中主鍵上加注解進(jìn)行配置,例如數(shù)據(jù)庫(kù)主鍵自增 @TableId(type=IdType.AUTO)

  2. 不同的表應(yīng)用不同的id生成策略:

     日志:自增(1,2,3,4,……)
     購(gòu)物訂單:特殊規(guī)則(FQ23948AK3843)
     外賣單:關(guān)聯(lián)地區(qū)日期等信息(10 04 20200314 34 91)
     關(guān)系表:可省略id
     ……
    
  3. 策略種類

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 全局配置id生成策略

假設(shè)我們希望默認(rèn)全部都使用 AUTO 策略(數(shù)據(jù)庫(kù)ID自增),那么可以在 application.yml 中添加如下配置進(jìn)行修改:

mybatis-plus.global-config.db-config.id-type=auto

7.多數(shù)據(jù)操作(_BatchIds())

  1. 應(yīng)用場(chǎng)景
    購(gòu)物車刪除多條記錄
    Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)
  2. 在testSave()方法中添加兩條新紀(jì)錄,效果如圖

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 刪除多條記錄( deleteBatchIds ( Collection<> ) )
  • 代碼
    @Test
    void testDelete(){
        //刪除指定多條數(shù)據(jù)
        List<Long> list = new ArrayList<>();
        list.add(12L);
        list.add(13L);
        userDao.deleteBatchIds(list);
    }
  • 運(yùn)行結(jié)果
    Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)
    Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)
  1. 查詢多條記錄
  • 代碼

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  • 運(yùn)行結(jié)果

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

六、CRUD進(jìn)階開發(fā)II

1.邏輯刪除( @TableLogic() 或者 全局配置)

  1. 應(yīng)用場(chǎng)景
  • 假如編號(hào)為1的員工辭職了,他的姓名,工號(hào)等信息要?jiǎng)h除,但是他工作的合同編號(hào),成交日期,金額等信息需要保留,如果直接執(zhí)行按id刪除操作,會(huì)把所有相關(guān)的數(shù)據(jù)刪除掉,邏輯刪除可以解決這個(gè)問題。
  • 邏輯刪除指的是修改數(shù)據(jù)的某個(gè)字段,使其表示為已刪除狀態(tài),而非刪除數(shù)據(jù),保留該數(shù)據(jù)在數(shù)據(jù)庫(kù)中,但是查詢時(shí)不顯示該數(shù)據(jù)(查詢時(shí)過濾掉該數(shù)據(jù))。
    Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)
  1. 在navicat中右鍵user表,點(diǎn)擊設(shè)計(jì)表選項(xiàng)添加字段delete, 并設(shè)置默認(rèn)值為0,代表未進(jìn)行邏輯刪除,然后點(diǎn)擊保存

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

3.在對(duì)應(yīng)的user實(shí)體類中添加邏輯刪除字段 deleted , 并通過 @TableLogic() 注解設(shè)置未進(jìn)行邏輯刪除的值 value 和 邏輯刪除的值 delval

//lombok
@Data
@TableName("user")
public class User {
    //設(shè)置主鍵生成策略
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    @TableField(value = "pwd",select = false)
    private String password;
    private Integer age;
    private String tel;
    //邏輯刪除字段,標(biāo)記當(dāng)前記錄是否被刪除
    @TableLogic(value = "0" ,delval = "1")
    private Integer deleted;
}
  1. 在測(cè)試類中的 testDelete() 方法方法中刪除id為1的記錄
  • 代碼
    @Test
    void testDelete(){
        //模擬邏輯刪除
        userDao.deleteById(1L);
    }

  • 運(yùn)行結(jié)果

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)從控制臺(tái)輸出以及表更新后的情況來(lái)看,可以知道邏輯刪除做的其實(shí)是更新操作,并且此時(shí)查詢?nèi)坎辉O(shè)置條件會(huì)默認(rèn)查詢 邏輯刪除字段 deleted = 0(自定義的值)的記錄

  1. 在全局配置中配置邏輯刪除相關(guān)信息
  • 在注解中的字符串里配置容易出錯(cuò),我們可以在全局配置文件中配置邏輯刪除的相關(guān)參數(shù)

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  • MyBatisPlus全局配置示例
 global-config:
    db-config: 
       #全局配置邏輯刪除字段名
       logic-delete-field: deleted
       #邏輯已刪除值(默認(rèn)1)
       logic-delete-value: 1
       #邏輯未刪除值(默認(rèn)0)
       logic-not-delete-value: 0

2.樂觀鎖(@version)

  1. 應(yīng)用場(chǎng)景舉例

添加和刪除的操作簡(jiǎn)單的介紹完了,接下來(lái)介紹一下修改相關(guān)的問題及其解決方在案:樂觀鎖。比如我們?cè)诰W(wǎng)上購(gòu)物進(jìn)行秒殺活動(dòng)的時(shí)候,大家都去搶一個(gè)商品,每搶一次商品數(shù)量減一,最后一個(gè)被搶完的時(shí)候需要一個(gè)限制條件防止異常,這個(gè)處理并發(fā)問題的解決方案叫做樂觀鎖。它通過一個(gè)字段來(lái)標(biāo)識(shí),每搶一次該標(biāo)識(shí)+1,這樣每個(gè)人拿到的標(biāo)識(shí)都不一樣,當(dāng)標(biāo)識(shí)到達(dá)設(shè)定值后程序開始攔截請(qǐng)求。

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 添加樂觀鎖字段version

在user表上右鍵設(shè)計(jì)表格,點(diǎn)擊添加字段,編輯version字段,設(shè)置數(shù)據(jù)類型為int,默認(rèn)值為1

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)效果如下

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 在實(shí)體類user中添加樂觀鎖字段version,并添加@version注解

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 在Mpconfig類中添加樂觀鎖攔截器

要實(shí)現(xiàn)每次訪問version的效果需要在訪問的sql語(yǔ)句里添加功能可以實(shí)現(xiàn) version = version + 1 的字段,mp里樂觀鎖攔截器可以做這個(gè)事情

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 在測(cè)試類的 testUpdate()方法中編輯修改記錄的代碼看看效果
  • 代碼
 void testUpdate(){
        User user = new User();
        user.setId(3L);
        user.setName("Jock666");
        //要傳version,如果沒有傳version就沒有鎖機(jī)制
        user.setVersion(1);
        userDao.updateById(user);
 }
  • 運(yùn)行結(jié)果

右邊的version是傳入的version,左邊的version是更新后的version,可以看到實(shí)現(xiàn)了version = version + 1的效果

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)
6. 開啟鎖機(jī)制的第二種方法,先查詢,再進(jìn)行更新操作

  • 代碼
    @Test
    void testUpdate(){
        //1.先通過要修改的數(shù)據(jù)id將當(dāng)前數(shù)據(jù)查詢出來(lái)
        User user = userDao.selectById(3L);
        //2.將要修改的屬性逐一設(shè)置進(jìn)去
        user.setName("Jock777");
        userDao.updateById(user);
  • 運(yùn)行結(jié)果
    Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 模擬多用戶秒殺場(chǎng)景

假設(shè)此時(shí)秒殺活動(dòng)已經(jīng)過去了2秒,數(shù)據(jù)庫(kù)里id為3的商品樂觀鎖字段version已經(jīng)累加到了3

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

假設(shè)用戶1 user, 用戶2 user2 再進(jìn)行秒殺活動(dòng),用戶2先訪問秒殺界點(diǎn)擊下單,然后數(shù)庫(kù)更新代表該商品的 id 為 3 的樂觀鎖字段version, 當(dāng)用戶1再進(jìn)行訪問下單的時(shí)候,version == 3的條件不成立,該更新請(qǐng)求操作失效,即秒殺失敗

  • 代碼
    @Test
        void testUpdate(){
        //用戶1查詢時(shí)version=3
        User user = userDao.selectById(3L);
        //用戶2查詢時(shí)version=3
        User user2 = userDao.selectById(3L);

        user2.setName("Jock aaa");
        //用戶2更新后version==4
        userDao.updateById(user2);

        user.setName("Jock bbb");
        //此時(shí)用戶1更新時(shí)verion=3的條件不成立,該更新語(yǔ)句失效
        userDao.updateById(user);

    }
  • 運(yùn)行結(jié)果

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)
Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

3. mp快速開發(fā)-代碼生成器

1.場(chǎng)景介紹

在我們開發(fā)mp項(xiàng)目的時(shí)候,創(chuàng)建編寫實(shí)體類功能的時(shí)候,模板都差不多,區(qū)別就是模塊名不一樣,這就類似于造句,只要提供模板和參數(shù),mp就能自動(dòng)幫我們生成代碼
Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  • 模板 :MyBatisPlus提供
  • 數(shù)據(jù)庫(kù)相關(guān)配置 :讀取數(shù)據(jù)庫(kù)獲取信息
  • 開發(fā)者自定義配置 :手工配置
  1. 創(chuàng)建新的springboot空項(xiàng)目DL_mp_generator(不勾選任何依賴,一會(huì)手動(dòng)加),創(chuàng)建好新項(xiàng)目后導(dǎo)入 代碼生成器 以及 velocity模板引擎 等坐標(biāo)(完整代碼見資源mybatis-plus源碼)
//pom.xml文件
    <dependencies>
        <!--代碼生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!--velocity模板引擎-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>
    </dependencies>
  1. 核心代碼

創(chuàng)建Generator類,編寫核心代碼

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

此時(shí)運(yùn)行沒有什么意義,因?yàn)槭裁葱畔⒍紱]有配置

public class Generator {
    public static void main(String[] args) {
        //創(chuàng)建生成器對(duì)象
        AutoGenerator autoGenerator = new AutoGenerator();

        //執(zhí)行生成器
        autoGenerator.execute();
    }
}

4.配置數(shù)據(jù)源

public class Generator {
    public static void main(String[] args) {
        //創(chuàng)建生成器對(duì)象
        AutoGenerator autoGenerator = new AutoGenerator();
        //配置數(shù)據(jù)源信息
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        autoGenerator.setDataSource(dataSource);
        //執(zhí)行生成器
        autoGenerator.execute();
    }
}

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)
(默認(rèn)生成文件路徑在D盤根目錄下)

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)
2.配置文件生成路徑

  • 代碼
public class Generator {
    public static void main(String[] args) {
        //創(chuàng)建生成器對(duì)象
        AutoGenerator autoGenerator = new AutoGenerator();

        //配置數(shù)據(jù)源
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        autoGenerator.setDataSource(dataSource);

        //設(shè)置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");    //設(shè)置代碼生成位置
        globalConfig.setOpen(true);    //設(shè)置生成完畢后是否打開生成代碼所在的目錄
        globalConfig.setAuthor("東離與糖寶");    //設(shè)置作者
        globalConfig.setFileOverride(true);     //設(shè)置是否覆蓋原始生成的文件
        globalConfig.setMapperName("%sDao");    //設(shè)置數(shù)據(jù)層接口名,%s為占位符,指代模塊名稱
        globalConfig.setIdType(IdType.ASSIGN_ID);   //設(shè)置Id生成策略
        autoGenerator.setGlobalConfig(globalConfig);

        //執(zhí)行生成器
        autoGenerator.execute();
    }
}

  • 運(yùn)行結(jié)果

(默認(rèn)生成的包名叫baomidou)

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 配置包名相關(guān)信息

先把baomidou包刪除,并將臨時(shí)表名改為tbl_user并執(zhí)行如下代碼

Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  • 代碼
public class Generator {
    public static void main(String[] args) {
        //創(chuàng)建生成器對(duì)象
        AutoGenerator autoGenerator = new AutoGenerator();

        //配置數(shù)據(jù)源
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        autoGenerator.setDataSource(dataSource);

        //設(shè)置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");    //設(shè)置代碼生成位置
        globalConfig.setOpen(true);    //設(shè)置生成完畢后是否打開生成代碼所在的目錄
        globalConfig.setAuthor("東離與糖寶");    //設(shè)置作者
        globalConfig.setFileOverride(true);     //設(shè)置是否覆蓋原始生成的文件
        globalConfig.setMapperName("%sDao");    //設(shè)置數(shù)據(jù)層接口名,%s為占位符,指代模塊名稱
        globalConfig.setIdType(IdType.ASSIGN_ID);   //設(shè)置Id生成策略
        autoGenerator.setGlobalConfig(globalConfig);


        //設(shè)置包名相關(guān)配置
        PackageConfig packageInfo = new PackageConfig();
        packageInfo.setParent("com.aaa");   //設(shè)置生成的包名,與代碼所在位置不沖突,二者疊加組成完整路徑
        packageInfo.setEntity("domain");    //設(shè)置實(shí)體類包名
        packageInfo.setMapper("dao");   //設(shè)置數(shù)據(jù)層包名
        autoGenerator.setPackageInfo(packageInfo);

        //執(zhí)行生成器
        autoGenerator.execute();
    }
}

  • 運(yùn)行結(jié)果

解析舉例; 可以看到根據(jù)表名稱生成了tbl前綴,并且實(shí)體類中有g(shù)etter和setter方法
Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

  1. 策略配置
  • 代碼
public class Generator {
    public static void main(String[] args) {
        //創(chuàng)建生成器對(duì)象
        AutoGenerator autoGenerator = new AutoGenerator();

        //配置數(shù)據(jù)源
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        autoGenerator.setDataSource(dataSource);

        //設(shè)置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");    //設(shè)置代碼生成位置
        globalConfig.setOpen(true);    //設(shè)置生成完畢后是否打開生成代碼所在的目錄
        globalConfig.setAuthor("東離與糖寶");    //設(shè)置作者
        globalConfig.setFileOverride(true);     //設(shè)置是否覆蓋原始生成的文件
        globalConfig.setMapperName("%sDao");    //設(shè)置數(shù)據(jù)層接口名,%s為占位符,指代模塊名稱
        globalConfig.setIdType(IdType.ASSIGN_ID);   //設(shè)置Id生成策略
        autoGenerator.setGlobalConfig(globalConfig);


        //設(shè)置包名相關(guān)配置
        PackageConfig packageInfo = new PackageConfig();
        packageInfo.setParent("com.aaa");   //設(shè)置生成的包名,與代碼所在位置不沖突,二者疊加組成完整路徑
        packageInfo.setEntity("domain");    //設(shè)置實(shí)體類包名
        packageInfo.setMapper("dao");   //設(shè)置數(shù)據(jù)層包名
        autoGenerator.setPackageInfo(packageInfo);

        //策略設(shè)置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("tbl_user");  //設(shè)置當(dāng)前參與生成的表名,參數(shù)為可變參數(shù)
        strategyConfig.setTablePrefix("tbl_");  //設(shè)置數(shù)據(jù)庫(kù)表的前綴名稱,模塊名 = 數(shù)據(jù)庫(kù)表名 - 前綴名  例如: User = tbl_user - tbl_
        strategyConfig.setRestControllerStyle(true);    //設(shè)置是否啟用Rest風(fēng)格
        strategyConfig.setVersionFieldName("version");  //設(shè)置樂觀鎖字段名
        strategyConfig.setLogicDeleteFieldName("deleted");  //設(shè)置邏輯刪除字段名
        strategyConfig.setEntityLombokModel(true);  //設(shè)置是否啟用lombok
        autoGenerator.setStrategy(strategyConfig);

        //執(zhí)行生成器
        autoGenerator.execute();
    }
}

  • 運(yùn)行結(jié)果

解析舉例: 可以看到數(shù)據(jù)庫(kù)表前綴名稱 tbl_ 在生成實(shí)體類等文件的時(shí)候被成功剪切,并且生成了樂觀鎖和邏輯刪除字段,并且啟用lombok(自帶getter 和 setter方法)
Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)

`博客內(nèi)容借鑒了bilibili黑馬程序員SSM課程資料,如有侵權(quán),請(qǐng)聯(lián)系作者刪除`

總結(jié)

歡迎各位留言交流以及批評(píng)指正,如果文章對(duì)您有幫助或者覺得作者寫的還不錯(cuò)可以點(diǎn)一下關(guān)注,點(diǎn)贊,收藏支持一下。
(博客的參考源碼可以在我主頁(yè)的資源里找到,如果在學(xué)習(xí)的過程中有什么疑問歡迎大家在評(píng)論區(qū)向我提出)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-494792.html

到了這里,關(guān)于Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • MyBatis-Plus-入門操作(1)

    MyBatis-Plus-入門操作(1)

    2.1常見注解 約定大于配置 mp掃描實(shí)體類基于反射的方式作為數(shù)據(jù)庫(kù)表的信息。 默認(rèn)的約定 類名駝峰轉(zhuǎn)下劃線 名字為id的是主鍵 屬性名進(jìn)行駝峰轉(zhuǎn)換成下劃線 要是不遵循約定的話就需要對(duì)應(yīng)的注解進(jìn)行修改。 表的名字和 實(shí)際的表的名字是不一致的 schema數(shù)據(jù)庫(kù) value 表名 mp的

    2024年02月09日
    瀏覽(19)
  • Mybatis-plus從入門到精通

    MyBatis-Plus(簡(jiǎn)稱MP)是一個(gè)基于MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上對(duì)其進(jìn)行擴(kuò)展,用于簡(jiǎn)化MyBatis操作,提高開發(fā)效率。它繼承了MyBatis原生的所有特性,并且添加了一些額外的功能,如自動(dòng)化代碼生成、通用增刪改查操作、條件構(gòu)造器等。MyBatis-Plus是為了滿足日常開發(fā)中對(duì)簡(jiǎn)

    2024年02月15日
    瀏覽(25)
  • 【MyBatis-Plus】入門案例與簡(jiǎn)介

    【MyBatis-Plus】入門案例與簡(jiǎn)介

    1. 入門案例 MybatisPlus(簡(jiǎn)稱MP)是基于MyBatis框架基礎(chǔ)上開發(fā)的增強(qiáng)型工具,旨在簡(jiǎn)化開發(fā)、提供效率。 開發(fā)方式 基于MyBatis使用MyBatisPlus 基于Spring使用MyBatisPlus 基于SpringBoot使用MyBatisPlus SpringBoot剛剛我們學(xué)習(xí)完成,它能快速構(gòu)建Spring開發(fā)環(huán)境用以整合其他技術(shù),使用起來(lái)是非常簡(jiǎn)

    2024年02月10日
    瀏覽(55)
  • (3)MyBatis-Plus待開發(fā)

    @TableName MyBatis-Plus在確定操作的表時(shí),由BaseMapper的泛型決定即實(shí)體類型決定,且默認(rèn)操作的表名和實(shí)體類型的類名一致,如果不一致則會(huì)因找不到表報(bào)異常 在實(shí)體類類型上添加@TableName(“t_user”)用來(lái)標(biāo)識(shí)實(shí)體類對(duì)應(yīng)的表 全局配置: 實(shí)際開發(fā)中實(shí)體類所對(duì)應(yīng)的表都有固定的前綴

    2024年02月09日
    瀏覽(15)
  • MyBatis-Plus 實(shí)戰(zhàn)教程四 idea插件

    MyBatis-Plus 實(shí)戰(zhàn)教程四 idea插件

    MybatisPlus提供了很多的插件功能,進(jìn)一步拓展其功能。目前已有的插件有: PaginationInnerInterceptor:自動(dòng)分頁(yè) TenantLineInnerInterceptor:多租戶 DynamicTableNameInnerInterceptor:動(dòng)態(tài)表名 OptimisticLockerInnerInterceptor:樂觀鎖 IllegalSQLInnerInterceptor:sql 性能規(guī)范 BlockAttackInnerInterceptor:防止全表更

    2024年02月06日
    瀏覽(15)
  • 手搭手入門Mybatis-Plus配置多數(shù)據(jù)源

    手搭手入門Mybatis-Plus配置多數(shù)據(jù)源

    https://baomidou.com/ 為簡(jiǎn)化開發(fā)而生 MyBatis-Plus(opens new window)(簡(jiǎn)稱 MP)是一個(gè) MyBatis (opens new window) 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生。 無(wú)侵入 :只做增強(qiáng)不做改變,引入它不會(huì)對(duì)現(xiàn)有工程產(chǎn)生影響,如絲般順滑 損耗小 :?jiǎn)?dòng)即會(huì)自

    2024年02月07日
    瀏覽(31)
  • mybatis-plus在實(shí)際開發(fā)中的應(yīng)用

    mybatis-plus在實(shí)際開發(fā)中的應(yīng)用

    最近的項(xiàng)目是使用mybatis-plus作為持久層框架,前面也記錄過mybatis-plus的基本使用,此次記錄一下本次項(xiàng)目中的一些使用要點(diǎn) 基本的導(dǎo)入依賴和代碼自動(dòng)生成器,可以去看以前的文章,本次不再贅述。 以項(xiàng)目中的一個(gè)實(shí)體類為例 實(shí)體類上mybatis-plus的注解有兩個(gè), @TableName(“

    2024年02月09日
    瀏覽(20)
  • 若依前后端分離版使用mybatis-plus實(shí)踐教程

    1、根目錄得pom加入依賴 2、在framework得pom文件下面增加 3、在framework的config下面更改myBatisConfig 4、admin模塊下面的yml配置

    2024年01月25日
    瀏覽(23)
  • mybatis-plus+nacos配置中心和服務(wù)發(fā)現(xiàn)保姆級(jí)教程

    mybatis-plus+nacos配置中心和服務(wù)發(fā)現(xiàn)保姆級(jí)教程

    ?本文通過簡(jiǎn)單的示例代碼和說明,讓讀者能夠了解Mybatis-Plus+Nacos的簡(jiǎn)單使用? 默認(rèn)你已經(jīng)看了我的Mybatis-Plus+Mysql的教程,現(xiàn)在有了一個(gè)簡(jiǎn)單的項(xiàng)目如下(之前的教程:? https://www.cnblogs.com/leafstar/p/17638741.html) ? 1.下載nacao,我這里下的是2.1.0版本 提供一下我用的版本( 鏈接:https

    2024年02月12日
    瀏覽(22)
  • 深入解析Mybatis-Plus框架:簡(jiǎn)化Java持久層開發(fā)(二)

    深入解析Mybatis-Plus框架:簡(jiǎn)化Java持久層開發(fā)(二)

    博客地址: CSDN :https://blog.csdn.net/powerbiubiu 本章節(jié)開始從實(shí)際的應(yīng)用場(chǎng)景,來(lái)講解Mybatis-Plus常用的一些操作,根據(jù)業(yè)務(wù)場(chǎng)景來(lái)進(jìn)行增刪改查的功能,首先先搭建一個(gè)項(xiàng)目。 1 搭建數(shù)據(jù)庫(kù) 根據(jù)業(yè)務(wù)場(chǎng)景,設(shè)定了用戶,角色,菜單三張表,同時(shí)還有用戶與角色關(guān)聯(lián)表,角色與菜

    2024年02月20日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包