Mybatis-Plus中and()和or()的使用與原理詳解
一. 簡(jiǎn)單無優(yōu)先級(jí)連接(即無括號(hào)的sql語(yǔ)句)
簡(jiǎn)單來說,兩個(gè)子條件間默認(rèn)and與連接,若兩個(gè)之間顯式寫出or()則or或連接.
1. 與連接 and()
當(dāng)需要簡(jiǎn)單的將兩個(gè)條件與連接,則最直接的寫法為:
QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>(). eq("attr_id",key). eq("catelog_id",catelogId);
當(dāng)然也可以顯式地寫出and()如下,但沒必要:
QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>(). eq("attr_id",key); queryWrapper.and(qr -> qr.eq("catelog_id", catelogId));
2. 或連接 or()
當(dāng)需要簡(jiǎn)單的將兩個(gè)條件或連接,則最直接的寫法為:
QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>(). eq("attr_id",key). or(). eq("catelog_id",catelogId);
當(dāng)然也可以如下,但不那么直觀:
QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>(). eq("attr_id",key); queryWrapper.or(qr -> qr.eq("catelog_id", catelogId));
二. 復(fù)雜有優(yōu)先級(jí)的的連接
上面有2個(gè)不推薦的做法,是因?yàn)閟ql語(yǔ)句為A or B , A and B這種簡(jiǎn)單連接.當(dāng)涉及到諸如 A and ( B or C) and D 這類的復(fù)雜有優(yōu)先級(jí)的的連接,直接拼接會(huì)導(dǎo)致成為 A and B or C and D.所以這時(shí)候需要需要or(Consumer consumer),and(Consumer consumer)這兩個(gè)方法.示例如下:
QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().eq("attr_type", "base".equalsIgnoreCase(type) ? 1 : 0); queryWrapper.and(qr -> qr.eq("attr_id", key). or(). like("attr_name", key) ); queryWrapper.and(qr -> qr.eq("catelog_id", catelogId));
生成的sql語(yǔ)句如下:
select ... WHERE (attr_type = ? AND ( (attr_id = ? OR attr_name LIKE ?) ) AND ( (catelog_id = ?) )) ...;
由此還可見or(Consumer consumer),and(Consumer consumer)這兩個(gè)方法參數(shù)為Consumer時(shí),會(huì)在連接處生成2對(duì)括號(hào),以此提高優(yōu)先級(jí).
補(bǔ)充:MybatisPlus中and和or的組合使用
案例1:where A=? and B=?
//SELECT id,name,age,sex FROM student WHERE (name = ? AND age = ?) List<Student> list = studentService.lambdaQuery().eq(Student::getName, "1").eq(Student::getAge, 1).list();
案例2:where A=? or B=?
//SELECT id,name,age,sex FROM student WHERE (name = ? OR age = ?) List<Student> list = studentService.lambdaQuery().eq(Student::getName, "1").or().eq(Student::getAge, 12).list();
案例3:where A=? or(C=? and D=?)
//SELECT id,name,age,sex FROM student WHERE (name = ? OR (name = ? AND age = ?)) List<Student> list = studentService .lambdaQuery() .eq(Student::getName, "1") .or(wp -> wp.eq(Student::getName, "1").eq(Student::getAge, 12)) .list();
案例4:where (A=?andB=?)or(C=?andD=?)
// SELECT id,name,age,sex FROM student WHERE ((name = ? AND age = ?) OR (name = ? AND age = ?)) List<Student> list = studentService .lambdaQuery() .and(wp -> wp.eq(Student::getName, "1").eq(Student::getAge, 12)) .or(wp -> wp.eq(Student::getName, "1").eq(Student::getAge, 12)) .list();
案例5:whert A =? or (B=? and ( C=? or D=?))
// SELECT * FROM student WHERE ((name <> 1) OR (name = 1 AND (age IS NULL OR age >= 11))) List<Student> list = studentService .lambdaQuery() .and(wp -> wp.ne(Student::getName, "1")) .or( wp -> wp.eq(Student::getName, "1") .and(wpp -> wpp.isNull(Student::getAge).or().ge(Student::getAge, 11))) .list();
總結(jié)
到此這篇關(guān)于Mybatis-Plus中and()和or()使用與原理的文章就介紹到這了,更多相關(guān)Mybatis-Plus中and()和or()使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SSH框架網(wǎng)上商城項(xiàng)目第27戰(zhàn)之申請(qǐng)域名空間和項(xiàng)目部署及發(fā)布
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第26戰(zhàn)之申請(qǐng)域名空間和項(xiàng)目部署及發(fā)布,感興趣的小伙伴們可以參考一下2016-06-06Spring Boot 配置 Quartz 定時(shí)任務(wù)的方法
這篇文章主要介紹了Spring Boot 配置 Quartz 定時(shí)任務(wù)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09詳談@Cacheable不起作用的原因:bean未序列化問題
這篇文章主要介紹了@Cacheable不起作用的原因:bean未序列化問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢
這篇文章主要為大家詳細(xì)介紹了SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05深入解析Java中的Classloader的運(yùn)行機(jī)制
這篇文章主要介紹了Java中的Classloader的運(yùn)行機(jī)制,包括從JVM方面講解類加載器的委托機(jī)制等,需要的朋友可以參考下2015-11-11Java編寫簡(jiǎn)單計(jì)算器的完整實(shí)現(xiàn)過程
這篇文章主要給大家介紹了關(guān)于Java編寫簡(jiǎn)單計(jì)算器的完整實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12