👉 博客主页:准Java全栈开发工程师 👉 00年出生,即将进入职场闯荡,目标赚钱,可能会有人觉得我格局小、觉得俗,但不得不承认这个世界已经不再是以一条线来分割的平面,而是围绕财富旋转的球面,成为有钱人不是为了去掌控球体的转向,而是当有人恶意掌控时,努力保护好家人和自己。
一、条件查询
在前面介绍标准的 CRUD 操作时,我们就涉及到了 Wrapper 的内容,当时并没有做过多的介绍,现在来简单介绍一下。 在进行查询操作时,我们通常都会涉及到一些条件的设定,如:年龄大于18小于30,性别为男等,这些条件我们可以在 SQL 语句中通过 where 条件指定,但是因为我们现在使用了 MP 提供的方法,有些方法我们不再手动书写 SQL 语句,如果还想要指定一些查询条件,我们就需要使用 Wrapper 来实现。
1、方式一:使用 QueryWrapper
@Test
void testSelectList ( ) {
QueryWrapper < User > qw = new QueryWrapper < > ( ) ;
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
@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 注解指定该实体类所映射的表名,完成映射。
👉 以上就是文章的全部内容啦,诸佬如果有任何建议都可以提哦。 👉 创作不易,如果觉得对您有帮助的话,欢迎关注✨点赞👍收藏📂哦。