【MybatisPlus】MP的分页查询、多条件查询以及查询过程中解决null的空值判定_lambdaquerywrapper 不为空

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

@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的时候泛型不能省**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3c74f80728de4a89b6faac872352f68b.png)  
 **当不使用泛型时会提示默认的Object类不是函数接口**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/714c1387594d4964a9392a149e4ad042.png)  
 而我们的**lambda()的底层又需要传进去一个实体**,传进去Object显然不能与后面的查询条件相联系!  
 此时我们再次编写条件的时候,就不会存在写错名称的情况,但是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且的情况



> 
> **场景一:查询数据库表中,年龄在3岁到8岁之间的用户信息**
> 
> 
> 



@SpringBootTest
class Mybatisplus{

@Autowired
private UserDao userDao;

@Test
/**
* 多条件查询
*/
void testGetAll04() { //方式四 (常用!)
LambdaQueryWrapper qw4 = new LambdaQueryWrapper<>();
qw4.lt(Users::getAge, 8); //上限
qw4.gt(Users::getAge, 3); //下限
// qw4.lt(Users::getAge, 8).gt(Users::getAge, 3); 链式编程!
List users = userDao.selectList(qw4);
System.out.println(users);
}
}


**注:gt(),大于(>),最终的SQL语句为**



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


也是迅速查出来了结果  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/01ed59eaf022472abdbe656a10a53447.png)


#### 3.2或的情况



> 
> **场景二:查询数据库表中,年龄小于3或年龄大于8的数据**
> 
> 
> 



@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 > ?)


也是顺利的查了出来![在这里插入图片描述](https://img-blog.csdnimg.cn/f1d63098fd5b4c7d922b0f491e3f7c1b.png)


### 四.null判定


![在这里插入图片描述](https://img-blog.csdnimg.cn/fc858a065ede49699192fce507983003.png)  
 以TB为例,我们购物时进行条件筛选时,**可以选择单条件,也可以选择多条件**,如上,我的条件就变成price>3000,price<null,这种情况按照以上介绍的查询的方式就会出现问题,如图:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/580bf63098954c32af8d249d2eae3c80.png)  
 显然,这种情况在开发过程中时不被允许的。所以要求我们针对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 lqw = new LambdaQueryWrapper();
lqw.lt(null!=bq.getPrice2(),User::getPrice, bq.getPrice2());
lqw.gt(null!=bq.getPrice(),User::getPrice, bq.getPrice());
List brands = brandDao.selectList(lqw);
System.out.println(brands);
}
}


**解读:**  
 **如果两个属性不为空,则查询price,price2区间范围内  
 如果有一个属性为空,则查询不为空的区间**  
 实现的核心在于lt()、gt()方法,condition为boolean类型上述的`null!=bq.getPrice2()`与之对应,**返回true,则添加条件,返回false则不添加条件,条件的生效与否就是靠的这个设计!**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d6cd53c744234845aa791b4344ab6db5.png)  
 最后,也是在null的条件下完成了查询:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/0962e27caeec45d7a3a715129afbdc3b.png)


![img](https://img-blog.csdnimg.cn/img_convert/7844c5fe22999e91ed20e26d8cfeef85.png)
![img](https://img-blog.csdnimg.cn/img_convert/cdb92d790e085032f68c966ca5b67945.png)
![img](https://img-blog.csdnimg.cn/img_convert/e9e47153d33707f606139d3b8776c712.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

998044)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值