👉 博客主页:准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);
}
- 使用 lt 方法,第一个参数 column 指定列名,第二个参数 val 指定具体的数值,相当于在 SQL 语句中指定了 where age < 25 条件。
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。
- 链式编写规则。
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() 方法的调用即可。
6、null 值判定
- 如果我们的查询条件的值不是直接进行赋值指定的,而是通过 getXxx 方法获得,那么就有可能会出现获取到 null 值的情况,这个时候再去进行查询操作就无法正确得到我们想要的结果。那应该怎么办呢?按照我们之前的做法,会选择使用 if 条件判断,如果不为空再添加上该查询条件,但是如果涉及到很多这种可能为空的情况,那我们岂不是得写好多 if 语句啊,有没有什么简单点的写法呢?这肯定是有的,不然我前面也不用说那么并不是很重要的废话。
- 注意观察第三行 gt 方法,第一个参数为 boolean 型的条件,之后才是列名,所以我们就可以将 if 条件中的判空语句写至该处,之后再书写列名等内容,使用一行代码就能够解决问题。
- 很多方法的第一个参数都提供了 condition 条件判断,只有为 true 时才能完成指定工作。
7、查询条件
groupBy 分组查询
- column 指明按照哪个字段查询。
between 范围查询
- 第一个参数 column 指明列名,第二、三个参数指定数值,between 的效果为小于第二个参数值大于第三个参数值,注意顺序不要弄反。
like 模糊查询
- like 方法的第一个参数 column 指定列名,第二个参数 val 指定值,前后都会加 % ,如:指定值为 J ,则会模糊查询 %J% 。
- likeLeft 表示在前面加 %,如:%J。
- likeRight 表示在后面加 %,如:J%。与 likeLeft 还是有本质上的区别的。
orderBy 顺序查询
- orderBy排序
- condition:条件,true 则进行排序,false 则不进行排序。
- isAsc:是否为升序,true升序,false降序。
- columns:排序字段,可以有多个。
- orderByAsc / Desc(单个 column ):按照指定字段进行升序 / 降序。
- orderByAsc / Desc(多个 column ):按照多个字段进行升序/降序。
- 除此之外,还有其他的方法可以使用,在此就不再一一介绍,感兴趣的可以去官网提供的 条件构造器 中查看,不仅是中文,而且还非常的详细。
二、查询投影
- 何为查询投影,说白了就是在查询操作时,指定查询的字段内容。
1、方式一:使用 QueryWrapper 查询
- 使用 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。
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 方法,然后不再写字段名,而是写所涉及到的函数即可。
三、映射匹配兼容问题
问题 1 :表字段与实体类属性不一致
- 当表的列名和实体类的属性名不一致时,如:表中字段名为 pwd,实体类属性名为 password,就会导致数据封装不到模型对象,这个时候就需要其中一方做出修改,那如果双方均不想修改或不能修改时该如何解决?
- 使用 @TableField 注解解决映射关系不一致问题,value 指定与表中哪个字段映射。
问题 2 :实体类中添加了数据库表中未定义的字段
- 当实体类中定义了 online 在线人数属性但数据库对应的表中并没有定义该字段时,如果我们什么也不做在进行 CRUD 操作时就会报错,为了能够正常操作,除了在数据库表中添加相应的字段外,我们还可以通过什么方式解决该问题呢?
- 仍然使用 @TableField 注解,将 exist 赋值为 false,则代表该字段可以不出现在数据库表中。
问题 3 :查询时取消查询某个字段
- 通常情况下,我们都会将所有字段查询出来,但是如果我们想在查询时取消某个或某些字段的查询,如:password 密码字段,应该怎么做呢。
- 仍然使用 @TableField 注解,将 select 赋值为 false,表示查询时不查询该字段信息。
问题 4 :表名与实体类名不一致
- 表名为 “ tbl_user ”,而实体类名为 “ user ”,这时两者并不能完成映射关系,在不修改双方的前提下该如何解决呢?
- 使用 @TableName 注解指定该实体类所映射的表名,完成映射。
👉 以上就是文章的全部内容啦,诸佬如果有任何建议都可以提哦。
👉 创作不易,如果觉得对您有帮助的话,欢迎关注✨点赞👍收藏📂哦。
相关文章
暂无评论...