接着上一讲的Mp的分页功能
 下面我们讲解条件查询功能和其他功能
解决一下日志输出和banner问题
每次卞就会输出这些日志
 很不美观,现在我们关闭一下
 
 这样建个xml,文件名为logback.xml
 
 文件内容改成这样
 配置了logback但是里面什么都没写就不会说有日志输出
 
 然后运行的话可以发现日志没了
 但是对应的banner还在,就是这个spring和mp的表示啊
 下面我们做的就是取消一下这个
 
 更改一下spring配置文件即可
 
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver   # mysql 驱动
      url: jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&serverTimezone=UTC  # 连接数据库
      username: root    # 数据库账户
      password: 123456    # 数据库密码
  #关闭spring的banner
  main:
    banner-mode: off
    #关闭Mp的banner
mybatis-plus:
  global-config:
    banner: false
现在就什么都没有了
 
条件查询
条件查询之前mybatis是写到一个对应mapper的xml里面
 然后用各种标签做标注
 而Mp中我们是用Wrapper这个参数封装查询条件
 
设置查询条件方式
方式1(普通方式)
Wrapper是个抽象类,他也有许多实现类
 这个QueryWarpper就是我们以用来封装条件查询的实现类
 
  @Test
    void testGetAll(){
        //创建QueryyWarpper查询对象
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        //在里面增添条件,lt代表<(小于),gt代表>(大于)
        userQueryWrapper.lt("age",22);
//      再把我们的对象加入到我们的查询中即可完成条件查询
        List<User> users = userDao.selectList(userQueryWrapper);
        for (User use:users
             ) {
            System.out.println(use);
        }
    }
可以看到查询到的结果是正确的
 

方式2 lambda方式
我们就封装条件写
 qw.lt(“列名”,值)
 列名会很容易打错,也不好发现
 so出现了这种方式和方式1差不多
 如图
 现在属性名就不会写错了
 
方式3 LambdaQueryWarpper(!)
用方式2需要一直写lambda
 mp提供一个LambdaQueryWarpper的实现类
 可以直接写Lambda
@Test
    void testGetAll(){
    //新的实现类
        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
        //可以直接写lambda格式
        userLambdaQueryWrapper.lt(User::getAge,22);
        List<User> users = userDao.selectList(userLambdaQueryWrapper);
        for (User use:users
             ) {
            System.out.println(use);
        }
    }
也可以成功运行
 
条件之间的多重组合
比如说and和or这种怎么表示呢
 and好说
 你可以再封装一次把另一个条件加入搭配Warpper对象中
 比如这样,就是年龄大于10小于22
userLambdaQueryWrapper.lt(User::getAge,22);
userLambdaQueryWrapper.gt(User::getAge,10);
也可以用支持的链式编程
 是同样的效果
userLambdaQueryWrapper.lt(User::getAge,22).gt(User::getAge,10);
那我们的or
 也是用链式的
 用到or()方法来代表
 比如下面这行代码,表示小于(lt)10岁或者大于(gt)30岁
userLambdaQueryWrapper.lt(User::getAge,10).or().gt(User::getAge,30);
小结

 
null判定(参数)
像这种,如果不设置会受到一些null
 如何处理null就是我们需要研究的问题
 
 我们先模拟一下前端传送的数据模型(实际开发是用不到的)
 我们需要新定义一个查询条件类作为数据模型
 因为age可能有上下限(分析哪些属性可能有上下限这种)
 不能只用有一个age来表示
 写一个查询条件类,设一个age2代表上限 age代表下限
 
 正常操作,无null情况
 小于30大于10
 这个结果是正确的我就不展示了
 
 如果没有传下限的情况
 我们想的是介绍找30岁以下的
 而运行的是age 在 null 和 30岁之间的
 这样就会失败
 应该是我们没有设置就是nul的情况对应的条件不应该往上连
 怎么解决呢(我这里不说if条件判断这个大家都应该会)
 
 还是我们的内置方法
 重载方法,条件方法一般有一个condition
 如果是true的话就连接上,如果是false就不进行条件连接

 更改后的格式
 这样就正确了
 
小结


查询投影/分组统计(查询字段控制,含函数字段如count(*))
查询投影就是控制我们查询行
 我们要查询什么列
 比如这个
 就是我们只查询对应的id name和age 其他的都不查询,这个是LambdaQueryWarpper的格式
 如果是正常的QueryWarpper看图2
 
 
 说一些不止是字段的
 当我们想统计count(*)就是数据总数的时候
 只能用QueryWarpper来做
 这样直接运行肯定是不对的,因为我们返回值是User的List集合
 是没有count的对应字段所以没法封装
 
 我们需要另一个方法
 返回Map双列集合
 user.Dao()selectMap(lqw);
 会把我们对应的查询变为key查询到的值变为value显示
 
 也可以进行一些分组统计
 分组统计就是基于查询投影的(和sql语句内核是一样的)
 
各种查询条件对应方法
就这些老朋友
 在Mp里面对于的函数
 
 =匹配
 对应函数eq()
 如图查询的是名字为Jerry且密码为jerry的用户
 且这种只查询一个用户的,可以用selectOne
 不用selectList
 
 范围查询
lt <
le <=
gt >
ge >=
between(列,下限,上限) 应该是和sql语句一样 左闭右闭[]
查询age【10,30】的员工
 
 模糊匹配
 like
 除了接收判断null参数的
 还有likeRight和likeLeft是对应%的位置
 比如你
 lqw.likeRight(User::getName,“J”);
 这个时候%就会加在右边匹配的是J%就是以J开头的名字
 likeLeft同理
 
小结

  可以在Mp官网上看对应方法
可以在Mp官网上看对应方法
 熟能生巧
映射匹配兼容性
就sql和我们的java实体类的映射问题
 
 
问题1:数据库和实体类字段名不同
 如果同名就自动映射
 不同的话,就要修改
 不修改会按照实体类的属性名查询表中没有这个字段会报错的如图
 

 一般都是实体类进行修改,但是要一个一个修改是不方便的
 解决方法
 用Mp提供的注解
 @TableField(value=“表中字段名”)
 
问题2:实体类比数据库字段多
 就是一些属性是不需要在数据库存储的
 但是需要在外面的实体类定义
 比如就在线这个属性online也是要查询的,但是不会放到数据库里
 但是我们查询的时候,比如查询全表是java编程在做
 语句就会是select id,…,online from 表
 但表里没有这个字段,这样就会报错
 如图
 
 解决办法
 
 我们只需要@TableFiled(exist=false)即可说明这个属性在表里不存在
 
 问题3:默认使用select方法会查询所有值
 不安全,比如查询到密码,返回的json用户就能看到密码
 除了手动去投影
 还可以用注解来
 @TableField(select=false)
 就是这个字段不参与查询
 
问题4:表明和类名不同
 因为什么呢
 因为组成语句 select … from 类名小写
 可以看出来对应关系
 
这个默认是类名小写,类名表名不同就查询不到
 可以写@TableName(“表名”)在类上来解决
 



















