❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️
查询投影是指在查询操作中,只选择需要的字段进行返回,而不是返回整个实体对象。这样可以减少网络传输的数据量,提高查询的效率。
- @Test
- void textGetAll() {
- LambdaQueryWrapper
lqw = new LambdaQueryWrapper<>(); - List
userList = userDao.selectList(lqw); - System.out.println(userList);
- }
正常查询是这样,会将所有字段都查询到,
然后当我们想查询部分字段时,这就叫查询投影。
我们只查询id、name、age三个字段:
- @Test
- void textGetAll() {
- LambdaQueryWrapper
lqw = new LambdaQueryWrapper<>(); - lqw.select(User::getId,User::getName,User::getAge);
- List
userList = userDao.selectList(lqw); - System.out.println(userList);
- }
运行结果:
可以看到这样确实只查询了三个字段,其他字段都显示为null。但是这种格式的写法只适用于lambda格式,如果不是lambda格式则是另一种写法。
查询id、name、age、tel四个字段:
- @Test
- void textGetAll() {
- QueryWrapper
lqw=new QueryWrapper<>(); - lqw.select("id","name","age","tel");
- List
userList = userDao.selectList(lqw); - System.out.println(userList);
- }
运行结果:
当我们想查询数据条数时,应该怎么办?lambda格式写法可做不了程序条数。
- @Test
- void textGetAll() {
- QueryWrapper
lqw=new QueryWrapper<>(); - lqw.select("count(*)");
- List
- System.out.println(userList);
- }
运行结果:
可以看出这很好查出来了,共有四条数据,但是最下面结果会不会觉得丑了点,那我们给它设置一个别名:
- @Test
- void textGetAll() {
- QueryWrapper
lqw=new QueryWrapper<>(); - lqw.select("count(*) as count");
- List
- System.out.println(userList);
- }
运行代码:
我们来一个按电话分组查询
- @Test
- void textGetAll() {
- QueryWrapper
lqw=new QueryWrapper<>(); - lqw.select("count(*) as count, tel");
- lqw.groupBy("tel");
- List
- System.out.println(userList);
- }
user表:
运行结果:
MybatisPlus查询也并不是什么都可以查询,适用于任何情况,当有些情况实现不了时,还得老老实实的使用Mybatis时候的写法,写查询语句写Mapper。
MyBatis-Plus提供了多种方式来设置查询条件,可以根据具体的需求选择适合的方式。
我们平时去进行登录操作时就会进行用户名和密码匹配,那在MyBatis-Plus中然后去进行查询呢?
- @Test
- void textGetAll() {
- LambdaQueryWrapper
lqw = new LambdaQueryWrapper<>(); - //等同于=
- lqw.eq(User::getName,"张三").eq(User::getPassword,"123456");
- List
userList=userDao.selectList(lqw); - //因为我们本来就是查询一个用户,使用可以使用selectOne替换上面这条语句
- //User loginUser=userDao.selectOne(lqw);
- System.out.println(userList);
- }
运行测试代码:
这里查询出来了张三用户,不过在当我们去使用这个操作时一般不会用密码原文,而是经过加密的密码。
在MyBatis-Plus中进行模糊匹配,可以使用like
方法来设置模糊查询条件。以下是使用like
方法进行模糊匹配的示例:
- @Test
- void textGetAll() {
- LambdaQueryWrapper
lqw=new LambdaQueryWrapper<>(); - //模糊查询
- lqw.like(User::getName,"三");
- List
userList=userDao.selectList(lqw); - System.out.println(userList);
- }
查询结果:
我们可以在控制台看到这个like中的百分号(%)是加在三的左右两边都有。
likeRight的百分号就在右边
在官网中还有很多条件构造器,感兴趣的同学可以前往官网学习:
条件构造器 | MyBatis-Plus (baomidou.com)
MyBatis-Plus对于映射匹配的兼容性非常好,它与MyBatis框架完全兼容,并且提供了更多的便利功能。
MyBatis-Plus使用的是MyBatis框架作为底层,它与MyBatis的映射配置文件(Mapper XML)和注解方式完全兼容。这意味着你可以继续使用MyBatis的映射方式,或者选择使用MyBatis-Plus提供的注解方式,二者可以灵活切换。
在实际情况中肯定有这样的情况,就是设计数据库的人设计的字段名和后端写实体类的人设计的属性名不一样:
那这个时候可以加一个@TableField注解 ,让我们来做这个字段的映射。
- package com.example.domain;
-
- import com.baomidou.mybatisplus.annotation.TableField;
- import lombok.Data;
-
- @Data
- public class User {
- private Long id;
- private String name;
- @TableField(value = "pwd")
- private String password;
- private Integer age;
- private String tel;
- }
@TableField
是MyBatis-Plus提供的注解之一,用于指定实体类中的字段与数据库表中的列的映射关系。
使用@TableField
注解可以对实体类的字段进行一些配置,包括字段名、是否为数据库表的主键、是否为自动填充字段等。
以下是@TableField
注解的常用属性:
value
:指定字段与数据库表的列名的映射关系,如果不指定,默认使用实体类字段名与数据库表的列名一致。exist
:指定该字段是否为数据库表的列,如果设置为false
,则该字段不参与数据库表的映射,默认为true
。el
:指定实体类字段与数据库列的映射关系的表达式,用于处理复杂的映射关系。fill
:指定该字段是否为自动填充字段,可选值为FieldFill
枚举类中的常量,如FieldFill.INSERT
、FieldFill.UPDATE
等。在User实体类中我们添加一个online字段,用来去判断用户是否在线,但是数据库中并不需要添加这个字段,那我们应该怎么去实现 让MybatisPlus去查询数据库。
给online添加@TableField注解,设置属性exist为false即可。
- package com.example.domain;
-
- import com.baomidou.mybatisplus.annotation.TableField;
- import lombok.Data;
-
- @Data
- public class User {
- private Long id;
- private String name;
- @TableField(value = "pwd")
- private String password;
- private Integer age;
- private String tel;
- @TableField(exist = false)
- private Integer online;
- }
在一般查询用户信息时,一般数据库中用户的密码信息是不会进行查询的,那这时候使用MybatisPlus应该如何去实现呢?
- package com.example.domain;
-
- import com.baomidou.mybatisplus.annotation.TableField;
- import lombok.Data;
-
- @Data
- public class User {
- private Long id;
- private String name;
- @TableField(value = "pwd",select = false)
- private String password;
- private Integer age;
- private String tel;
- @TableField(exist = false)
- private Integer online;
- }
如上面所示我们只需要给@TableField注解,设置select属性为false。
可以看到设置之后就没有password字段的信息了。
这个问题就是数据库表名和实体类的类名不一致时,应该怎么办呢?
- package com.example.domain;
-
- import com.baomidou.mybatisplus.annotation.TableField;
- import com.baomidou.mybatisplus.annotation.TableName;
- import lombok.Data;
-
- @Data
- @TableName("tbl_user")
- public class User {
- private Long id;
- private String name;
- @TableField(value = "pwd",select = false)
- private String password;
- private Integer age;
- private String tel;
- @TableField(exist = false)
- private Integer online;
- }
数据库表名为tbl_user。
还是一样可以查询到数据的。