[MyBatisPlus]DQL编程控制①(条件查询)

网友投稿 708 2022-09-06

[MyBatisPlus]DQL编程控制①(条件查询)

[MyBatisPlus]DQL编程控制①(条件查询)

文章目录

​​条件查询​​

​​解决日志冗长的问题​​​​构建条件查询​​​​多条件构建​​​​null判定​​

条件查询

结构还是前文的结构这里不再多赘述。

解决日志冗长的问题

不过测试的时候,控制台打印的日志比较多,速度有点慢而且不利于查看运行结果,所以接下来我们把这个日志处理下:

取消初始化spring日志打印,resources目录下添加logback.xml,名称固定,内容如下:

说明:logback.xml的配置内容,不是我们学习的重点,如果有兴趣可以自行百度查询。

# mybatis-plus日志控制台输出mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: banner: off # 关闭mybatisplus启动图标

spring: main: banner-mode: off # 关闭SpringBoot启动图标(banner)

解决控制台打印日志过多的相关操作可以不用去做,一般会被用来方便我们查看程序运行的结果。

构建条件查询

在进行查询的时候,我们的入口是在Wrapper这个类上,因为它是一个接口,所以我们需要去找它对应的实现类,关于实现类也有很多,说明我们有多种构建查询条件对象的方式:

先来看第一种:QueryWrapper

@SpringBootTestclass Mybatisplus02DqlApplicationTests { @Autowired private UserDao userDao; @Test void testGetAll(){ QueryWrapper qw = new QueryWrapper(); qw.lt("age",18); List userList = userDao.selectList(qw); System.out.println(userList); }}

lt: 小于(<) ,最终的sql语句为

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

第一种方式介绍完后,有个小问题就是在写条件的时候,容易出错,比如age写错,就会导致查询不成功

接着来看第二种:QueryWrapper的基础上使用lambda

@SpringBootTestclass Mybatisplus02DqlApplicationTests { @Autowired private UserDao userDao; @Test void testGetAll(){ QueryWrapper qw = new QueryWrapper(); qw.lambda().lt(User::getAge, 10);//添加条件 List 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

@SpringBootTestclass Mybatisplus02DqlApplicationTests { @Autowired private UserDao userDao; @Test void testGetAll(){ LambdaQueryWrapper lqw = new LambdaQueryWrapper(); lqw.lt(User::getAge, 10); List userList = userDao.selectList(lqw); System.out.println(userList); }}

这种方式就解决了上一种方式所存在的问题。

多条件构建

学完了三种构建查询对象的方式,每一种都有自己的特点,所以用哪一种都行,刚才都是一个条件,那如果有多个条件该如何构建呢?

需求:查询数据库表中,年龄在10岁到30岁之间的用户信息

@SpringBootTestclass Mybatisplus02DqlApplicationTests { @Autowired private UserDao userDao; @Test void testGetAll(){ LambdaQueryWrapper lqw = new LambdaQueryWrapper(); lqw.lt(User::getAge, 30); lqw.gt(User::getAge, 10); List userList = userDao.selectList(lqw); System.out.println(userList); }}

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

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

构建多条件的时候,可以支持链式编程

LambdaQueryWrapper lqw = new LambdaQueryWrapper();lqw.lt(User::getAge, 30).gt(User::getAge, 10);List userList = userDao.selectList(lqw);System.out.println(userList);

需求:查询数据库表中,年龄小于10或年龄大于30的数据

@SpringBootTestclass Mybatisplus02DqlApplicationTests { @Autowired private UserDao userDao; @Test void testGetAll(){ LambdaQueryWrapper lqw = new LambdaQueryWrapper(); lqw.lt(User::getAge, 10).or().gt(User::getAge, 30); List 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判定

先来看一张图,

我们在做条件查询的时候,一般会有很多条件可以供用户进行选择查询。这些条件用户可以选择使用也可以选择不使用,比如我要查询价格在8000以上的手机在输入条件的时候,价格有一个区间范围,按照需求只需要在第一个价格输入框中输入8000后台在做价格查询的时候,一般会让 price>值1 and price <值2因为前端没有输入值2,所以如果不处理的话,就会出现 price>8000 and price < null问题这个时候查询的结果就会出问题,具体该如何解决?

需求:查询数据库表中,根据输入年龄范围来查询符合条件的记录用户在输入值的时候, 如果只输入第一个框,说明要查询大于该年龄的用户 如果只输入第二个框,说明要查询小于该年龄的用户 如果两个框都输入了,说明要查询年龄在两个范围之间的用户

思考第一个问题:后台如果想接收前端的两个数据,该如何接收?

我们可以使用两个简单数据类型,也可以使用一个模型类,但是User类中目前只有一个age属性,如:

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

使用一个age属性,如何去接收页面上的两个值呢?这个时候我们有两个解决方案

方案一:添加属性age2,这种做法可以但是会影响到原模型类的属性内容

@Datapublic 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属性。

@Datapublic class User { private Long id; private String name; private String password; private Integer age; private String tel;}@Datapublic class UserQuery extends User { private Integer age2;}

环境准备好后,我们来实现下刚才的需求:

@SpringBootTestclass Mybatisplus02DqlApplicationTests { @Autowired private UserDao userDao; @Test void testGetAll(){ //模拟页面传递过来的查询数据 UserQuery uq = new UserQuery(); uq.setAge(10); uq.setAge2(30); LambdaQueryWrapper lqw = new LambdaQueryWrapper(); if(null != uq.getAge2()){ lqw.lt(User::getAge, uq.getAge2()); } if( null != uq.getAge()) { lqw.gt(User::getAge, uq.getAge()); } List userList = userDao.selectList(lqw); System.out.println(userList); }}

上面的写法可以完成条件为非空的判断,但是问题很明显,如果条件多的话,每个条件都需要判断,代码量就比较大,来看MP给我们提供的简化方式:

@SpringBootTestclass Mybatisplus02DqlApplicationTests { @Autowired private UserDao userDao; @Test void testGetAll(){ //模拟页面传递过来的查询数据 UserQuery uq = new UserQuery(); uq.setAge(10); uq.setAge2(30); LambdaQueryWrapper lqw = new LambdaQueryWrapper(); lqw.lt(null!=uq.getAge2(),User::getAge, uq.getAge2()); lqw.gt(null!=uq.getAge(),User::getAge, uq.getAge()); List userList = userDao.selectList(lqw); System.out.println(userList); }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:比较全面的MySQL优化参考(mysql 优化配置)
下一篇:sqlserver 2008存储过程 多个可空条件任意组合(sqlserver导入excel数据)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~