欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

解決日志冗長(zhǎng)的問(wèn)題

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

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

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

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

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

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

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

取消SpringBoot的log打印

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

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

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

構(gòu)建條件查詢(xún)

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

先來(lái)看第一種: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語(yǔ)句為

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

第一種方式介紹完后,有個(gè)小問(wèn)題就是在寫(xiě)條件的時(shí)候,容易出錯(cuò),比如age寫(xiě)錯(cuò),就會(huì)導(dǎo)致查詢(xún)不成功

接著來(lái)看第二種: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á)式中的,類(lèi)名::方法名,最終的sql語(yǔ)句為:

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

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

此時(shí)我們?cè)俅尉帉?xiě)條件的時(shí)候,就不會(huì)存在寫(xiě)錯(cuò)名稱(chēng)的情況,但是qw后面多了一層lambda()調(diào)用

接著來(lái)看第三種: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);
    }
}

這種方式就解決了上一種方式所存在的問(wèn)題。

多條件構(gòu)建

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

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

@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語(yǔ)句為

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

構(gòu)建多條件的時(shí)候,可以支持鏈?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);

需求:查詢(xún)數(shù)據(jù)庫(kù)表中,年齡小于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語(yǔ)句中的or關(guān)鍵字,不加默認(rèn)是and,最終的sql語(yǔ)句為:

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

null判定

先來(lái)看一張圖,

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

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

用戶(hù)在輸入值的時(shí)候,

? 如果只輸入第一個(gè)框,說(shuō)明要查詢(xún)大于該年齡的用戶(hù)

? 如果只輸入第二個(gè)框,說(shuō)明要查詢(xún)小于該年齡的用戶(hù)

? 如果兩個(gè)框都輸入了,說(shuō)明要查詢(xún)年齡在兩個(gè)范圍之間的用戶(hù)

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

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

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

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

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

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

方案二:新建一個(gè)模型類(lèi),讓其繼承User類(lèi),并在其中添加age2屬性,UserQuery在擁有User屬性后同時(shí)添加了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)備好后,我們來(lái)實(shí)現(xiàn)下剛才的需求:

@SpringBootTest
class Mybatisplus02DqlApplicationTests {
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll(){
        //模擬頁(yè)面?zhèn)鬟f過(guò)來(lái)的查詢(xún)數(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);
    }
}

上面的寫(xiě)法可以完成條件為非空的判斷,但是問(wèn)題很明顯,如果條件多的話(huà),每個(gè)條件都需要判斷,代碼量就比較大,來(lái)看MP給我們提供的簡(jiǎn)化方式:

@SpringBootTest
class Mybatisplus02DqlApplicationTests {
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll(){
        //模擬頁(yè)面?zhèn)鬟f過(guò)來(lái)的查詢(xún)數(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)然這個(gè)也可以使用鏈?zhǔn)骄幊?,如果太長(zhǎng)了就要做些微的調(diào)整:

lt()方法

condition為boolean類(lèi)型,返回true,則添加條件,返回false則不添加條件

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

相關(guān)文章

  • 淺析JAVA Lock鎖原理

    淺析JAVA Lock鎖原理

    這篇文章主要介紹了JAVA Lock鎖原理的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • lambdaQueryWrapper多條件嵌套查詢(xún)方式

    lambdaQueryWrapper多條件嵌套查詢(xún)方式

    這篇文章主要介紹了lambdaQueryWrapper多條件嵌套查詢(xún)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Java?Rabbitmq中四種集群架構(gòu)的區(qū)別詳解

    Java?Rabbitmq中四種集群架構(gòu)的區(qū)別詳解

    這篇文章主要為大家詳細(xì)介紹了Java?Rabbitmq中四種集群架構(gòu)的區(qū)別,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • 使用RestTemplate調(diào)用RESTful?API的代碼示例

    使用RestTemplate調(diào)用RESTful?API的代碼示例

    在開(kāi)發(fā)?Web?應(yīng)用程序時(shí),調(diào)用?RESTful?API?是一個(gè)常見(jiàn)的任務(wù),本文將介紹如何使用?RestTemplate?調(diào)用?RESTful?API,并提供示例代碼,感興趣的同學(xué)可以跟著小編一起來(lái)看看
    2023-06-06
  • spring boot Logging的配置以及使用詳解

    spring boot Logging的配置以及使用詳解

    這篇文章主要介紹了spring boot Logging的配置以及使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Java異常分類(lèi)處理拋出捕獲操作詳解

    Java異常分類(lèi)處理拋出捕獲操作詳解

    異常就是不正常,比如當(dāng)我們身體出現(xiàn)了異常我們會(huì)根據(jù)身體情況選擇喝開(kāi)水、吃藥、看病、等 異常處理方法。 java異常處理機(jī)制是我們java語(yǔ)言使用異常處理機(jī)制為程序提供了錯(cuò)誤處理的能力,程序出現(xiàn)的錯(cuò)誤,程序可以安全的退出,以保證程序正常的運(yùn)行等
    2022-09-09
  • java的arraylist排序示例(arraylist用法)

    java的arraylist排序示例(arraylist用法)

    這篇文章主要介紹了java的arraylist排序示例,學(xué)習(xí)一下arraylist的用法,需要的朋友可以參考下
    2014-03-03
  • java避免多層嵌套循環(huán)用到的一些小技巧分享

    java避免多層嵌套循環(huán)用到的一些小技巧分享

    這篇文章主要介紹了java避免多層嵌套循環(huán)用到的一些小技巧分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 淺談shiro的SecurityManager類(lèi)結(jié)構(gòu)

    淺談shiro的SecurityManager類(lèi)結(jié)構(gòu)

    下面小編就為大家?guī)?lái)一篇淺談shiro的SecurityManager類(lèi)結(jié)構(gòu)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • 淺談Java double 相乘的結(jié)果偏差小問(wèn)題

    淺談Java double 相乘的結(jié)果偏差小問(wèn)題

    下面小編就為大家?guī)?lái)一篇淺談Java double 相乘的結(jié)果偏差小問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01

最新評(píng)論