Mybatis-puls——条件查询的三种格式+条件查询null判定+查询投影

news/2024/11/24 1:54:14/

前言

在mybatis_plus的封装中的Wrapper<T>接口参数就是用于封装查询条件 

 在测试类中启动如上一个简单的查询,然后控制台运行会输出一大堆无关日志,这里先把这些日志关闭

 去除无关日志文件

先新建一个XML配置文件 

 然后变成如下,这里configuration标签里面什么都没有配置就是取消所有日志文件了

然后再次启动就只剩下spring和mybatis的图标了

 

这两个图标也可以消去,在application.yml中关闭mybatis的banner的显示,选择false

 再设置spring的banner-mode为off就可以把spring的banner一起关掉了

 再次运行就可以看见一个没有多余日志输出的界面了

 按条件查询的三种方式

 要实现按条件查询,进入到selectlist的源码里面看见需要一个wrapper的对象,在wrapper源码中可以看见wrapper<T>是一个抽象类如下。

 在Wrapper这个抽象类下面还有一系列的实现类,这里要用到的是QueryWrapper这个实现类,专门用于做查询封装操作的,下面还有一些诸如updatewrapper用于更新操作的 

设置查询条件(and关系)

方式一

如下所示新建了一个QueryWrapper对象,然后设置了两个条件

	@Testvoid contextLoads() {//方式一:按条件查询QueryWrapper qw=new QueryWrapper();//age小于25qw.lt("age",25);//age大于17qw.gt("age",17);List<mpdb>  userlist=userDao.selectList(qw);System.out.println(userlist);}

 然后输出正常

 方式二

        //方式二:lambda格式按条件查询QueryWrapper<mpdb> qw=new QueryWrapper<mpdb>();qw.lambda().lt(mpdb::getAge,25);qw.lambda().gt(mpdb::getAge,17);List<mpdb>  userlist=userDao.selectList(qw);System.out.println(userlist);

同样正常输出 ,并且防止了因为字段名写错而找不到出错地方

 方式三

在方式二上简化了

       // 方式三:lambda格式按条件查询LambdaQueryWrapper<mpdb> lqw=new LambdaQueryWrapper<mpdb>();lqw.lt(mpdb::getAge,25);lqw.gt(mpdb::getAge,17);List<mpdb>  userlist=userDao.selectList(lqw);System.out.println(userlist);

输出结果依旧正确

三种方式大部分都推荐用第三种 ,第一种在特殊情况下才使用。

如果过条件过多可以采用这种链式编程的方式 

设置查询条件(or关系)

条件语句里面加上一个.or()

        lqw.lt(mpdb::getAge,25).or().gt(mpdb::getAge,17);

NULL值处理

应用场景如下,有空值到后台时要有对应的处理 

这里到先到pojo层或者说domain层下面新建一个实体类mpdbQuery用于封装条件查询的条件

,这里直接继承mpdb实体类即可

  然后要分析可能有哪些字段有范围,比如日期型有范围,数值型也有范围,在该表中只有age有限制,所以新建一个age2用于描述年龄的上限,收集来的age属性用于描述下限。

准备好后在测试类中如下

正常输出

 如果有一个为空的话会有如下,查询失败

 在lt方法还有第二种实现,传一个boolean类型 

 lt的代码变成如下,如果的判断不成立就不加入该条件。原本上面的都是无条件加入条件

        lqw.lt(null!=mq.getAge2(),mpdb::getAge,mq.getAge2());

 当然,也可以用if判断,但是每个都要加的话就太多了

查询投影

所谓查询投影就是设置查询出来的结果是什么样,达成只显示其中的某一些字段

使用如下的一个select方法,参数就是要投影的字段名

  LambdaQueryWrapper<mpdb> lqw=new LambdaQueryWrapper<mpdb>();lqw.select(mpdb::getId,mpdb::getName,mpdb::getAge);List<mpdb>  userlist=userDao.selectList(lqw);System.out.println(userlist);

输出如下,只有那三个字段

 上面这个是lambda格式专用。

如果是用第一种方法的话就要变成如下

        //非lambda格式的投影QueryWrapper<mpdb> lqw=new QueryWrapper<mpdb>();lqw.select("id","name","age","tel");List<mpdb>  userlist=userDao.selectList(lqw);System.out.println(userlist);

输出如下

 针对count(*)的查询投影

查询投影只能用这个方式来做,不能用lambda方式

如果要查询count(*)的话因为实体类没有对应的用于接收count(*)的字段,所以这里换一个方式接收,改成如下,String就是字段名,object就是值

这里as count的作用是起别名 

 输出如下

 分组查询

使用groupBy方法

 输出如下,每一组tel都有对应的数量

 小结

 如果有不支持的格式的话就要恢复最早写mybatis的格式来写这了,在DAO层中使用@Select注解的方式


http://www.ppmy.cn/news/781815.html

相关文章

Gof23设计模式之装饰者模式

1.概述 定义 指在不改变现有对象结构的情况下&#xff0c;动态地给对象增加一些职责&#xff08;即增加其额外功能&#xff09;的模式。 例子 我们先来看一个快餐店的例子。 快餐店有炒面、炒饭这些快餐&#xff0c;可以额外附加鸡蛋、火腿、培根这些配菜&#xff0c;当然加…

少儿机器人编程有什么用

少儿机器人编程有什么用?小孩的学习一直以来都是家长们非常关心和重视的一件事情。很多的家长在培养孩子的学习方面也可以说是相当的耐心的&#xff0c;会给孩子选择一些能更有利于孩子成长的课程。就拿现在很多的家长想要孩子去学习机器人编程的课程来说&#xff0c;有的家长…

开发和编程是一样的吗?区别有哪些?

很多人搞不懂软件开发和编程的区别是什么?特别是对于计划学习软件开发或者是编程技术的人来说&#xff0c;很想知道开发和编程的关系。我相信不只是计划学习软件开发的人不能区分编程和开发&#xff0c;肯定有一部分从业者也不能很好的区分开发和编程的差别&#xff0c;我们在…

为什么学编程?

现代计算机之父和人工智能之父的英国数学家------阿兰图灵1997年&#xff0c;IBM公司的Deep Blue打败国际象棋大师计算机系统&#xff1a;硬件软件硬件由中央处理器&#xff08;CPU&#xff09;&#xff0c;存储器和输入/输出设备等核心部件组成&#xff0c;在软件的配合下完成…

使用什么编程语言?怎样入门?

C&#xff1f;C&#xff1f;Java&#xff1f;Python&#xff1f;各种各样的编程语言琳琅满目。我们到底应该选什么呢&#xff1f;什么样的语言才是适合自己的呢&#xff1f; 1.对比数据 我们先通过一组数据客观的来了解各种编程语言。 这是近十年来的这种编程语言的发展趋势。…

【解惑】编程到底有什么用?

【解惑】编程到底有什么用&#xff1f; 同学提问&#xff1a; 这几天一直在敲JAVA代码。。一直看视频。。。。感觉是还没发现编程到底有什么用啊。。。。这样的感觉是不是基本上可以灭了编程之路了啊。。。。 我的解答&#xff1a; 编程的意义就在于用技术解决实际的问…

python编程有什么用-孩子学习Python编程有什么好处

孩子学习Python编程有什么好处&#xff1f;这位地产大佬56岁开始学Python&#xff0c;让我们拭目以待他的学习成果&#xff01; 地产大佬、SOHO中国董事长潘石屹在微博宣布要学一门新的语言——Python&#xff0c;并称这是"给自己人生的礼物”。 此消息让不少网友直呼&qu…

计算机语言都有哪些都有什么用

1.低级语言 &#xff08;1&#xff09;.机器语言 这种语言是完全面向机器的语言&#xff0c;由纯粹的二进制代码组成的语言&#xff0c;可以由计算机直接识别和运行的语言&#xff0c;拥有极高的执行效率。 可是因为只有“0”、“1”两种信息&#xff0c;十分难以编写和读懂。 …