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

MyBatisPlus超詳細(xì)分析條件查詢

 更新時間:2022年08月18日 15:13:48   作者:十八歲討厭編程  
這篇文章主要介紹了MyBatisPlus條件查詢的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

解決日志冗長的問題

不過測試的時候,控制臺打印的日志比較多,速度有點(diǎn)慢而且不利于查看運(yùn)行結(jié)果,所以接下來我們把這個日志處理下:

取消初始化spring日志打印,resources目錄下添加logback.xml,名稱固定,內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>

說明:logback.xml的配置內(nèi)容,不是我們學(xué)習(xí)的重點(diǎn),如果有興趣可以自行百度查詢。

取消MybatisPlus啟動banner圖標(biāo)

application.yml添加如下內(nèi)容:

# mybatis-plus日志控制臺輸出
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    banner: off # 關(guān)閉mybatisplus啟動圖標(biāo)

取消SpringBoot的log打印

application.yml添加如下內(nèi)容:

spring:
  main:
    banner-mode: off # 關(guān)閉SpringBoot啟動圖標(biāo)(banner)

解決控制臺打印日志過多的相關(guān)操作可以不用去做,一般會被用來方便我們查看程序運(yùn)行的結(jié)果。

構(gòu)建條件查詢

在進(jìn)行查詢的時候,我們的入口是在Wrapper這個類上,因?yàn)樗且粋€接口,所以我們需要去找它對應(yīng)的實(shí)現(xiàn)類,關(guān)于實(shí)現(xiàn)類也有很多,說明我們有多種構(gòu)建查詢條件對象的方式:

先來看第一種:QueryWrapper

@SpringBootTest
class Mybatisplus02DqlApplicationTests {
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll(){
        QueryWrapper qw = new QueryWrapper();
        qw.lt("age",18);
        List<User> userList = userDao.selectList(qw);
        System.out.println(userList);
    }
}

lt: 小于(<) ,最終的sql語句為

SELECT id,name,password,age,tel FROM user WHERE (age < ?)

第一種方式介紹完后,有個小問題就是在寫條件的時候,容易出錯,比如age寫錯,就會導(dǎo)致查詢不成功

接著來看第二種:QueryWrapper的基礎(chǔ)上使用lambda

@SpringBootTest
class Mybatisplus02DqlApplicationTests {
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll(){
        QueryWrapper<User> qw = new QueryWrapper<User>();
        qw.lambda().lt(User::getAge, 10);//添加條件
        List<User> userList = userDao.selectList(qw);
        System.out.println(userList);
    }
}

User::getAget,為lambda表達(dá)式中的,類名::方法名,最終的sql語句為:

SELECT id,name,password,age,tel FROM user WHERE (age < ?)

注意:構(gòu)建LambdaQueryWrapper的時候泛型不能省。

此時我們再次編寫條件的時候,就不會存在寫錯名稱的情況,但是qw后面多了一層lambda()調(diào)用

接著來看第三種:LambdaQueryWrapper

@SpringBootTest
class Mybatisplus02DqlApplicationTests {
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        lqw.lt(User::getAge, 10);
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
}

這種方式就解決了上一種方式所存在的問題。

多條件構(gòu)建

學(xué)完了三種構(gòu)建查詢對象的方式,每一種都有自己的特點(diǎn),所以用哪一種都行,剛才都是一個條件,那如果有多個條件該如何構(gòu)建呢?

需求:查詢數(shù)據(jù)庫表中,年齡在10歲到30歲之間的用戶信息

@SpringBootTest
class Mybatisplus02DqlApplicationTests {
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        lqw.lt(User::getAge, 30);
        lqw.gt(User::getAge, 10);
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
}

gt:大于(>),最終的SQL語句為

SELECT id,name,password,age,tel FROM user WHERE (age < ? AND age > ?)

構(gòu)建多條件的時候,可以支持鏈?zhǔn)骄幊?/p>

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.lt(User::getAge, 30).gt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);

需求:查詢數(shù)據(jù)庫表中,年齡小于10或年齡大于30的數(shù)據(jù)

@SpringBootTest
class Mybatisplus02DqlApplicationTests {
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        lqw.lt(User::getAge, 10).or().gt(User::getAge, 30);
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
}

or()就相當(dāng)于我們sql語句中的or關(guān)鍵字,不加默認(rèn)是and,最終的sql語句為:

SELECT id,name,password,age,tel FROM user WHERE (age < ? OR age > ?)

null判定

先來看一張圖,

  • 我們在做條件查詢的時候,一般會有很多條件可以供用戶進(jìn)行選擇查詢。
  • 這些條件用戶可以選擇使用也可以選擇不使用,比如我要查詢價(jià)格在8000以上的手機(jī)
  • 在輸入條件的時候,價(jià)格有一個區(qū)間范圍,按照需求只需要在第一個價(jià)格輸入框中輸入8000
  • 后臺在做價(jià)格查詢的時候,一般會讓 price>值1 and price <值2
  • 因?yàn)榍岸藳]有輸入值2,所以如果不處理的話,就會出現(xiàn) price>8000 and price < null問題
  • 這個時候查詢的結(jié)果就會出問題,具體該如何解決?

需求:查詢數(shù)據(jù)庫表中,根據(jù)輸入年齡范圍來查詢符合條件的記錄

用戶在輸入值的時候,

? 如果只輸入第一個框,說明要查詢大于該年齡的用戶

? 如果只輸入第二個框,說明要查詢小于該年齡的用戶

? 如果兩個框都輸入了,說明要查詢年齡在兩個范圍之間的用戶

思考第一個問題:后臺如果想接收前端的兩個數(shù)據(jù),該如何接收?

我們可以使用兩個簡單數(shù)據(jù)類型,也可以使用一個模型類,但是User類中目前只有一個age屬性,如:

@Data
public class User {
    private Long id;
    private String name;
    private String password;
    private Integer age;
    private String tel;
}

使用一個age屬性,如何去接收頁面上的兩個值呢?這個時候我們有兩個解決方案

方案一:添加屬性age2,這種做法可以但是會影響到原模型類的屬性內(nèi)容

@Data
public class User {
    private Long id;
    private String name;
    private String password;
    private Integer age;
    private String tel;
    private Integer age2;
}

方案二:新建一個模型類,讓其繼承User類,并在其中添加age2屬性,UserQuery在擁有User屬性后同時添加了age2屬性。

@Data
public class User {
    private Long id;
    private String name;
    private String password;
    private Integer age;
    private String tel;
}
@Data
public class UserQuery extends User {
    private Integer age2;
}

環(huán)境準(zhǔn)備好后,我們來實(shí)現(xiàn)下剛才的需求:

@SpringBootTest
class Mybatisplus02DqlApplicationTests {
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll(){
        //模擬頁面?zhèn)鬟f過來的查詢數(shù)據(jù)
        UserQuery uq = new UserQuery();
        uq.setAge(10);
        uq.setAge2(30);
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        if(null != uq.getAge2()){
            lqw.lt(User::getAge, uq.getAge2());
        }
        if( null != uq.getAge()) {
            lqw.gt(User::getAge, uq.getAge());
        }
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
}

上面的寫法可以完成條件為非空的判斷,但是問題很明顯,如果條件多的話,每個條件都需要判斷,代碼量就比較大,來看MP給我們提供的簡化方式:

@SpringBootTest
class Mybatisplus02DqlApplicationTests {
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll(){
        //模擬頁面?zhèn)鬟f過來的查詢數(shù)據(jù)
        UserQuery uq = new UserQuery();
        uq.setAge(10);
        uq.setAge2(30);
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        lqw.lt(null!=uq.getAge2(),User::getAge, uq.getAge2());
        lqw.gt(null!=uq.getAge(),User::getAge, uq.getAge());
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
}

d當(dāng)然這個也可以使用鏈?zhǔn)骄幊?,如果太長了就要做些微的調(diào)整:

lt()方法

condition為boolean類型,返回true,則添加條件,返回false則不添加條件

到此這篇關(guān)于MyBatisPlus超詳細(xì)分析條件查詢的文章就介紹到這了,更多相關(guān)MyBatis條件查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring-boot @Component和@Bean的區(qū)別詳解

    spring-boot @Component和@Bean的區(qū)別詳解

    這篇文章主要介紹了spring-boot @Component和@Bean的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 原生Java操作兔子隊(duì)列RabbitMQ

    原生Java操作兔子隊(duì)列RabbitMQ

    這篇文章主要介紹了原生Java操作兔子隊(duì)列RabbitMQ,MQ全稱為Message?Queue,即消息隊(duì)列,“消息隊(duì)列”是在消息的傳輸過程中保存消息的容器,需要的朋友可以參考下
    2023-05-05
  • Java如何從服務(wù)器中下載圖片

    Java如何從服務(wù)器中下載圖片

    這篇文章主要為大家詳細(xì)介紹了Java如何從服務(wù)器中下載圖片,代碼中附有詳細(xì)注釋,感興趣的小伙伴們可以參考一下
    2016-05-05
  • MyBatis 參數(shù)映射機(jī)制實(shí)踐記錄

    MyBatis 參數(shù)映射機(jī)制實(shí)踐記錄

    這篇文章主要介紹了MyBatis 參數(shù)映射機(jī)制實(shí)踐記錄,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-12-12
  • Java多線程中的Balking模式詳解

    Java多線程中的Balking模式詳解

    大家好,本篇文章主要講的是Java多線程中的Balking模式詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • springboot集成mybatis?plus和dynamic-datasource注意事項(xiàng)說明

    springboot集成mybatis?plus和dynamic-datasource注意事項(xiàng)說明

    這篇文章主要介紹了springboot集成mybatis?plus和dynamic-datasource注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 關(guān)于Spring中的三級緩存解析

    關(guān)于Spring中的三級緩存解析

    這篇文章主要介紹了關(guān)于Spring中的三級緩存,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java并發(fā)編程關(guān)鍵字volatile保證可見性不保證原子性詳解

    java并發(fā)編程關(guān)鍵字volatile保證可見性不保證原子性詳解

    這篇文章主要為大家介紹了java并發(fā)編程關(guān)鍵字volatile保證可見性不保證原子性詳解,文中附含詳細(xì)示例說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • SpringMVC中的HandlerMapping詳解

    SpringMVC中的HandlerMapping詳解

    這篇文章主要介紹了SpringMVC中的HandlerMapping詳解,HandlerMapping是請求映射處理器,也就是通過請求的url找到對應(yīng)的邏輯處理單元(Controller),注意這里只是建立請求與Controller的映射關(guān)系,最終的處理是通過HandlerAdapt來進(jìn)行處理的,需要的朋友可以參考下
    2023-09-09
  • MyBatis-Plus通用枚舉自動關(guān)聯(lián)注入的實(shí)現(xiàn)

    MyBatis-Plus通用枚舉自動關(guān)聯(lián)注入的實(shí)現(xiàn)

    本文主要介紹了MyBatis-Plus通用枚舉自動關(guān)聯(lián)注入的實(shí)現(xiàn),解決了繁瑣的配置,讓 mybatis 優(yōu)雅的使用枚舉屬性,感興趣的可以一起來了解一下
    2021-06-06

最新評論

德安县| 公主岭市| 新丰县| 嵩明县| 南通市| 忻州市| 翼城县| 区。| 无锡市| 旅游| 广宗县| 岳普湖县| 绥棱县| 巧家县| 应城市| 张家口市| 霍城县| 吉木萨尔县| 五莲县| 信阳市| 宜春市| 玉树县| 邛崃市| 陈巴尔虎旗| 比如县| 石狮市| 瓮安县| 偃师市| 合川市| 青海省| 盈江县| 涞水县| 蓬莱市| 文昌市| 沿河| 新津县| 历史| 公主岭市| 龙山县| 雷山县| 改则县|