MybatisPlus分頁查詢與多條件查詢介紹及查詢過程中空值問題的解決
前言
MP這樣一款強大的持久層框架處理起來復雜的SQL來也是得心應手,效率極高,快快與我一同領略Plus的獨特魅力吧
一.分頁處理
1.調用方法傳入?yún)?shù)獲取返回值
創(chuàng)建IPage分頁對象,設置分頁參數(shù),1為當前頁碼,3為每頁顯示的記錄數(shù),執(zhí)行分頁查詢并獲取其結果
@SpringBootTest
class Mybatisplus{
@Autowired
private UserDao userDao;
//分頁查詢
@Test
void testSelectPage(){
IPage<User> page=new Page<>(1,3);
userDao.selectPage(page,null);
System.out.println("當前頁碼值:"+page.getCurrent());
System.out.println("每頁顯示數(shù):"+page.getSize());
System.out.println("一共多少頁:"+page.getPages());
System.out.println("一共多少條數(shù)據(jù):"+page.getTotal());
System.out.println("數(shù)據(jù):"+page.getRecords());
}
}
2.設置分頁攔截器
將MP提供的分頁攔截器配置成Spring管理的bean對象
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
//1 創(chuàng)建MybatisPlusInterceptor攔截器對象
MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor();
//2 添加分頁攔截器
mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mpInterceptor;
}
}
查詢結果如下:

MP有多智能,他給我們提供的方法和功能太強大,以至于我們只需傳入兩個對象即可自動完成分頁查詢

二.條件查詢
2.1通過QueryWrapper對象來執(zhí)行分頁查詢
@SpringBootTest
class Mybatisplus{
@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 < ?)
很容易發(fā)現(xiàn),以字符串形式輸出作為查詢條件可能會出現(xiàn)字符串拼寫錯誤,針對此種情況,可以進行一下小改進!
2.2在QueryWrapper對象的基礎上使用lambda表達式
為了解決以字符串形式作為輸出而造成拼寫錯誤的問題,通過lambda來實現(xiàn)實體與屬性對應進行查詢,就極大地提高了查詢的準確性
@SpringBootTest
class Mybatisplus{
@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);
}
}與之對應的SQL語句同樣也是:
SELECT id,name,password,age,tel FROM user WHERE (age < ?)
注:構建LambdaQueryWrapper的時候泛型不能省

當不使用泛型時會提示默認的Object類不是函數(shù)接口

而我們的lambda()的底層又需要傳進去一個實體,傳進去Object顯然不能與后面的查詢條件相聯(lián)系!
此時我們再次編寫條件的時候,就不會存在寫錯名稱的情況,但是qw后面多了一層lambda()調用
2.3直接通過LambdaQueryWrapper對象
這也是方式二的另一種寫法,原理相同都是利用LambdaQueryWrapper
@SpringBootTest
class Mybatisplus{
@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);
}
}三.多條件查詢
對于多條件的情景,MP依然可以簡單化解,并且構建多條件的時候,可以支持鏈式編程
3.1且的情況
場景一:查詢數(shù)據(jù)庫表中,年齡在3歲到8歲之間的用戶信息
@SpringBootTest
class Mybatisplus{
@Autowired
private UserDao userDao;
@Test
/**
* 多條件查詢
*/
void testGetAll04() { //方式四 (常用!)
LambdaQueryWrapper<Users> qw4 = new LambdaQueryWrapper<>();
qw4.lt(Users::getAge, 8); //上限
qw4.gt(Users::getAge, 3); //下限
// qw4.lt(Users::getAge, 8).gt(Users::getAge, 3); 鏈式編程!
List<Users> users = userDao.selectList(qw4);
System.out.println(users);
}
}注:gt(),大于(>),最終的SQL語句為
SELECT id,name,password,age,tel FROM user WHERE (age < ? AND age > ?)
也是迅速查出來了結果

3.2或的情況
場景二:查詢數(shù)據(jù)庫表中,年齡小于3或年齡大于8的數(shù)據(jù)
@SpringBootTest
class Mybatisplus{
@Autowired
private UserDao userDao;
@Test
void testGetAll(){
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.lt(User::getAge, 3).or().gt(User::getAge, 8);
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 > ?)
也是順利的查了出來

四.null判定

以TB為例,我們購物時進行條件篩選時,可以選擇單條件,也可以選擇多條件,如上,我的條件就變成price>3000,price<null,這種情況按照以上介紹的查詢的方式就會出現(xiàn)問題,如圖:

顯然,這種情況在開發(fā)過程中時不被允許的。所以要求我們針對null的情況要解決如下問題:
用戶在輸入值的時候:
1.如果只輸入第一個框,說明要查詢大于該價格的商品
2.如果只輸入第二個框,說明要查詢小于該價格的商品 ?
3.如果兩個框都輸入了,說明要查詢價格在兩個范圍之間的商品
于是,我們可以
新建一個模型類,讓其繼承Brand類,并在其中添加price2屬性,Brand02 在擁有Brand屬性后同時添加了price2屬性
@Data
public class Brand {
private Long id;
private String name;
private Double price;
}
@Data
public class Brand02 extends Brand {
private Integer price2;
}
解決了實體的問題,再來解決條件的問題
@SpringBootTest
class Mybatisplus02{
@Autowired
private BrandDao brandDao;
@Test
void testGetAll(){
BrandQuery bq = new BrandQuery();
LambdaQueryWrapper<Brand> lqw = new LambdaQueryWrapper<Brand>();
lqw.lt(null!=bq.getPrice2(),User::getPrice, bq.getPrice2());
lqw.gt(null!=bq.getPrice(),User::getPrice, bq.getPrice());
List<Brand> brands = brandDao.selectList(lqw);
System.out.println(brands);
}
}
解讀:
如果兩個屬性不為空,則查詢price,price2區(qū)間范圍內
如果有一個屬性為空,則查詢不為空的區(qū)間
實現(xiàn)的核心在于lt()、gt()方法,condition為boolean類型上述的null!=bq.getPrice2()與之對應,返回true,則添加條件,返回false則不添加條件,條件的生效與否就是靠的這個設計!

最后,也是在null的條件下完成了查詢:

到此這篇關于MybatisPlus分頁查詢與多條件查詢介紹及查詢過程中空值問題的解決的文章就介紹到這了,更多相關MybatisPlus分頁查詢內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringSecurity自定義資源攔截規(guī)則及登錄界面跳轉問題
這篇文章主要介紹了SpringSecurity自定義資源攔截規(guī)則及登錄界面跳轉問題,我們想要自定義認證邏輯,就需要創(chuàng)建一些原來不存在的bean,這個時候就可以使@ConditionalOnMissingBean注解,本文給大家介紹的非常詳細,需要的朋友參考下吧2023-12-12
關于springboot配置druid數(shù)據(jù)源不生效問題(踩坑記)
今天日常跟著網(wǎng)課學習,學到了整合druid數(shù)據(jù)源,遇到了好幾個坑,希望這篇文章可以幫助一些和我一樣踩坑的人2021-09-09
IDEA中SpringBoot項目數(shù)據(jù)庫連接加密方法
這篇文章主要介紹了IDEA中SpringBoot項目數(shù)據(jù)庫連接加密方法,文章通過圖文結合的方式給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-06-06
SpringCloud-Gateway網(wǎng)關的使用實例教程
Gateway網(wǎng)關在微服務架構中扮演了不可或缺的角色,通過集中化管理、智能路由和強大的過濾器機制,為構建高效、可擴展的微服務系統(tǒng)提供了有力支持,這篇文章主要介紹了SpringCloud-Gateway網(wǎng)關的使用,需要的朋友可以參考下2024-03-03

