前言
在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对象,然后设置了两个条件
@Test
void contextLoads() {
//方式一:按条件查询
QueryWrapper qw=new QueryWrapper();
//age小于25
qw.lt("age",25);
//age大于17
qw.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注解的方式