【MyBatis-Plus】DQL

2年前 (2022) 程序员胖胖胖虎阿
380 0 0

👉 博客主页:准Java全栈开发工程师
👉 00年出生,即将进入职场闯荡,目标赚钱,可能会有人觉得我格局小、觉得俗,但不得不承认这个世界已经不再是以一条线来分割的平面,而是围绕财富旋转的球面,成为有钱人不是为了去掌控球体的转向,而是当有人恶意掌控时,努力保护好家人和自己。

DQL

  • 一、条件查询
      • 1、方式一:使用 QueryWrapper
      • 2、方式二:使用 lambda 格式
      • 3、方式三(推荐):使用 LambdaQueryWrapper
      • 4、多条件查询 — and
      • 5、多条件查询 — or
      • 6、null 值判定
      • 7、查询条件
          • groupBy 分组查询
          • between 范围查询
          • like 模糊查询
          • orderBy 顺序查询
  • 二、查询投影
      • 1、方式一:使用 QueryWrapper 查询
      • 2、方式二:使用 LambdaQueryWrapper 查询
      • 3、聚合查询
  • 三、映射匹配兼容问题
      • 问题 1 :表字段与实体类属性不一致
      • 问题 2 :实体类中添加了数据库表中未定义的字段
      • 问题 3 :查询时取消查询某个字段
      • 问题 4 :表名与实体类名不一致

一、条件查询

  • 在前面介绍标准的 CRUD 操作时,我们就涉及到了 Wrapper 的内容,当时并没有做过多的介绍,现在来简单介绍一下。
  • 在进行查询操作时,我们通常都会涉及到一些条件的设定,如:年龄大于18小于30,性别为男等,这些条件我们可以在 SQL 语句中通过 where 条件指定,但是因为我们现在使用了 MP 提供的方法,有些方法我们不再手动书写 SQL 语句,如果还想要指定一些查询条件,我们就需要使用 Wrapper 来实现。

1、方式一:使用 QueryWrapper

    @Test
    void testSelectList(){
        QueryWrapper<User> qw = new QueryWrapper<>();
        // 查询年龄小于25岁的记录
        qw.lt("age",25);
        List<User> users = userMapper.selectList(qw);
        System.out.println(users);
    }

【MyBatis-Plus】DQL

  • 使用 lt 方法,第一个参数 column 指定列名,第二个参数 val 指定具体的数值,相当于在 SQL 语句中指定了 where age < 25 条件。
    【MyBatis-Plus】DQL

2、方式二:使用 lambda 格式

  • 使用方式一指定列名时,可能会出现列名编写错误问题,所以提出了使用 lambda 格式 “User::getAge” 的方式指定,使用该方式不会存在编写错误问题,但是要求在实体类中定义。
    @Test
    void testSelectList(){
        QueryWrapper<User> qw = new QueryWrapper<>();
        qw.lambda().lt(User::getAge,25);
        List<User> users = userMapper.selectList(qw);
        System.out.println(users);
    }

3、方式三(推荐):使用 LambdaQueryWrapper

  • 方式二虽然使用了 lambda 格式,但是仍然使用的是 QueryWrapper 对象,每次指定条件时都需要加上 lambda() ,显得非常的繁琐,所以又推出了 LambdaQueryWrapper ,可直接调用需要的查询条件。
    @Test
    void testSelectList(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.lt(User::getAge,25);
        List<User> users = userMapper.selectList(lqw);
        System.out.println(users);
    }
  • 除此之外,还提供了许多其他查询条件,可根据自己的业务需要进行调用。

4、多条件查询 — and

  • 需求:查询出年龄大于18小于30的用户信息。
    @Test
    void testSelectList(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.gt(User::getAge,18);
        lqw.lt(User::getAge,30);
        List<User> users = userMapper.selectList(lqw);
        System.out.println(users);
    }
  • 该种情况属于 and 并的情况,需要同时满足两个条件,就相当于 where age > 18 and age < 30。
    【MyBatis-Plus】DQL
  • 链式编写规则。
lqw.gt(User::getAge,18);
lqw.lt(User::getAge,30);
// 使用链式规则可写为:
lqw.gt(User::getAge,18).lt(User::getAge,30);

5、多条件查询 — or

需求:查询年龄小于18或大于30的用户信息。

    @Test
    void testSelectList(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.lt(User::getAge,18).or().gt(User::getAge,30);
        List<User> users = userMapper.selectList(lqw);
        System.out.println(users);
    }
  • 同样,如果是 或 的关系,只需要加上 or() 方法的调用即可。
    【MyBatis-Plus】DQL

6、null 值判定

  • 如果我们的查询条件的值不是直接进行赋值指定的,而是通过 getXxx 方法获得,那么就有可能会出现获取到 null 值的情况,这个时候再去进行查询操作就无法正确得到我们想要的结果。那应该怎么办呢?按照我们之前的做法,会选择使用 if 条件判断,如果不为空再添加上该查询条件,但是如果涉及到很多这种可能为空的情况,那我们岂不是得写好多 if 语句啊,有没有什么简单点的写法呢?这肯定是有的,不然我前面也不用说那么并不是很重要的废话。

【MyBatis-Plus】DQL

  • 注意观察第三行 gt 方法,第一个参数为 boolean 型的条件,之后才是列名,所以我们就可以将 if 条件中的判空语句写至该处,之后再书写列名等内容,使用一行代码就能够解决问题。
  • 很多方法的第一个参数都提供了 condition 条件判断,只有为 true 时才能完成指定工作。

7、查询条件

groupBy 分组查询
  • column 指明按照哪个字段查询。
    【MyBatis-Plus】DQL
between 范围查询
  • 第一个参数 column 指明列名,第二、三个参数指定数值,between 的效果为小于第二个参数值大于第三个参数值,注意顺序不要弄反。
    【MyBatis-Plus】DQL
like 模糊查询
  • like 方法的第一个参数 column 指定列名,第二个参数 val 指定值,前后都会加 % ,如:指定值为 J ,则会模糊查询 %J% 。
  • likeLeft 表示在前面加 %,如:%J。
  • likeRight 表示在后面加 %,如:J%。与 likeLeft 还是有本质上的区别的。
    【MyBatis-Plus】DQL
orderBy 顺序查询
  • orderBy排序
    • condition:条件,true 则进行排序,false 则不进行排序。
    • isAsc:是否为升序,true升序,false降序。
    • columns:排序字段,可以有多个。
  • orderByAsc / Desc(单个 column ):按照指定字段进行升序 / 降序。
  • orderByAsc / Desc(多个 column ):按照多个字段进行升序/降序。
    【MyBatis-Plus】DQL
  • 除此之外,还有其他的方法可以使用,在此就不再一一介绍,感兴趣的可以去官网提供的 条件构造器 中查看,不仅是中文,而且还非常的详细。

二、查询投影

  • 何为查询投影,说白了就是在查询操作时,指定查询的字段内容。

1、方式一:使用 QueryWrapper 查询

【MyBatis-Plus】DQL

  • 使用 select 方法指定需要查询的字段名,字段名需要和数据库表中的字段名保持一致,可以填写多个,每个字段名以字符串的方式指定,该方式由 QueryWrapper 提供。
    @Test
    void testSelectList(){
        QueryWrapper<User> qw = new QueryWrapper<>();
        qw.select("id","username","age");
        List<User> users = userMapper.selectList(qw);
        System.out.println(users);
    }
  • 因为并没有指定查询 password 的信息,所以查询出的数据中 password 值均为 null。
    【MyBatis-Plus】DQL

2、方式二:使用 LambdaQueryWrapper 查询

  • 虽然使用的都是 select 方法,但是传入的参数类型确是不同的,使用的是 lambda 格式风格,使用该方式不会出现字段名写错问题,但是只能写实体类中定义的数据。
    @Test
    void testSelectList(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.select(User::getId,User::getUsername,User::getPassword);
        List<User> users = userMapper.selectList(lqw);
        System.out.println(users);
    }

3、聚合查询

  • 如果我们想要使用一些函数获取信息,如使用 count方法 获得数据总和条目信息等,这种方式只能使用 QueryWrapper 实现。
    @Test
    void testSelectList(){
        QueryWrapper<User> qw = new QueryWrapper<>();
        qw.select("count(*) as count");
        List<Map<String, Object>> maps = userMapper.selectMaps(qw);
        System.out.println(maps);
    }
  • 同样使用的是 select 方法,然后不再写字段名,而是写所涉及到的函数即可。
    【MyBatis-Plus】DQL

三、映射匹配兼容问题

问题 1 :表字段与实体类属性不一致

  • 当表的列名和实体类的属性名不一致时,如:表中字段名为 pwd,实体类属性名为 password,就会导致数据封装不到模型对象,这个时候就需要其中一方做出修改,那如果双方均不想修改或不能修改时该如何解决?
  • 使用 @TableField 注解解决映射关系不一致问题,value 指定与表中哪个字段映射。
    【MyBatis-Plus】DQL

问题 2 :实体类中添加了数据库表中未定义的字段

  • 当实体类中定义了 online 在线人数属性但数据库对应的表中并没有定义该字段时,如果我们什么也不做在进行 CRUD 操作时就会报错,为了能够正常操作,除了在数据库表中添加相应的字段外,我们还可以通过什么方式解决该问题呢?
  • 仍然使用 @TableField 注解,将 exist 赋值为 false,则代表该字段可以不出现在数据库表中。
    【MyBatis-Plus】DQL

问题 3 :查询时取消查询某个字段

  • 通常情况下,我们都会将所有字段查询出来,但是如果我们想在查询时取消某个或某些字段的查询,如:password 密码字段,应该怎么做呢。
  • 仍然使用 @TableField 注解,将 select 赋值为 false,表示查询时不查询该字段信息。

【MyBatis-Plus】DQL

问题 4 :表名与实体类名不一致

  • 表名为 “ tbl_user ”,而实体类名为 “ user ”,这时两者并不能完成映射关系,在不修改双方的前提下该如何解决呢?
  • 使用 @TableName 注解指定该实体类所映射的表名,完成映射。
    【MyBatis-Plus】DQL

👉 以上就是文章的全部内容啦,诸佬如果有任何建议都可以提哦。
👉 创作不易,如果觉得对您有帮助的话,欢迎关注✨点赞👍收藏📂哦。

版权声明:程序员胖胖胖虎阿 发表于 2022年9月20日 上午11:56。
转载请注明:【MyBatis-Plus】DQL | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...