<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
不過測試的時候,控制檯列印的紀錄檔比較多,速度有點慢而且不利於檢視執行結果,所以接下來我們把這個紀錄檔處理下:
取消初始化spring紀錄檔列印,resources目錄下新增logback.xml,名稱固定,內容如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> </configuration>
說明:logback.xml的設定內容,不是我們學習的重點,如果有興趣可以自行百度查詢。
取消MybatisPlus啟動banner圖示
application.yml新增如下內容:
# mybatis-plus紀錄檔控制檯輸出
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
banner: off # 關閉mybatisplus啟動圖示
取消SpringBoot的log列印
application.yml新增如下內容:
spring:
main:
banner-mode: off # 關閉SpringBoot啟動圖示(banner)
解決控制檯列印紀錄檔過多的相關操作可以不用去做,一般會被用來方便我們檢視程式執行的結果。
在進行查詢的時候,我們的入口是在Wrapper這個類上,因為它是一個介面,所以我們需要去找它對應的實現類,關於實現類也有很多,說明我們有多種構建查詢條件物件的方式:
先來看第一種: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寫錯,就會導致查詢不成功
接著來看第二種:QueryWrapper的基礎上使用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表示式中的,類名::方法名,最終的sql語句為:
SELECT id,name,password,age,tel FROM user WHERE (age < ?)
注意:構建LambdaQueryWrapper的時候泛型不能省。
此時我們再次編寫條件的時候,就不會存在寫錯名稱的情況,但是qw後面多了一層lambda()呼叫
接著來看第三種: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); } }
這種方式就解決了上一種方式所存在的問題。
學完了三種構建查詢物件的方式,每一種都有自己的特點,所以用哪一種都行,剛才都是一個條件,那如果有多個條件該如何構建呢?
需求:查詢資料庫表中,年齡在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 > ?)
構建多條件的時候,可以支援鏈式程式設計
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);
需求:查詢資料庫表中,年齡小於10或年齡大於30的資料
@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()就相當於我們sql語句中的or
關鍵字,不加預設是and
,最終的sql語句為:
SELECT id,name,password,age,tel FROM user WHERE (age < ? OR age > ?)
先來看一張圖,
需求:查詢資料庫表中,根據輸入年齡範圍來查詢符合條件的記錄
使用者在輸入值的時候,
如果只輸入第一個框,說明要查詢大於該年齡的使用者
如果只輸入第二個框,說明要查詢小於該年齡的使用者
如果兩個框都輸入了,說明要查詢年齡在兩個範圍之間的使用者
思考第一個問題:後臺如果想接收前端的兩個資料,該如何接收?
我們可以使用兩個簡單資料型別,也可以使用一個模型類,但是User類中目前只有一個age屬性,如:
@Data public class User { private Long id; private String name; private String password; private Integer age; private String tel; }
使用一個age屬性,如何去接收頁面上的兩個值呢?這個時候我們有兩個解決方案
方案一:新增屬性age2,這種做法可以但是會影響到原模型類的屬性內容
@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; }
環境準備好後,我們來實現下剛才的需求:
@SpringBootTest class Mybatisplus02DqlApplicationTests { @Autowired private UserDao userDao; @Test void testGetAll(){ //模擬頁面傳遞過來的查詢資料 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(){ //模擬頁面傳遞過來的查詢資料 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當然這個也可以使用鏈式程式設計,如果太長了就要做些微的調整:
lt()方法
condition為boolean型別,返回true,則新增條件,返回false則不新增條件
到此這篇關於MyBatisPlus超詳細分析條件查詢的文章就介紹到這了,更多相關MyBatis條件查詢內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45