SpringBoot 集成 MybatisPlus 二——查询

2023-10-29 19:26:46 浏览数 (1)

0 前置数据

首先创建这样一张数据表

CREATE TABLE user (`id` INT(11) NOT NULL, `username` VARCHAR(50), `gendar` CHAR(2) , `remark` VARCHAR(50));

并向表中插入多条数据

1 简单查询

对于简单的查询,例如根据某一个字段或ID进行查询,使用 MyBatisPlus 可以直接进行。

1.1 根据ID查询

代码语言:txt复制
@Test
public void getUser(){
    User user = userMapper.selectById(1);
    System.out.println(user);
}

效果等同于如下SQL语句

1.2 根据某一个字段进行查询

代码语言:txt复制
@Test
public void getUserByField(){
    Map<String, Object> map = new HashMap<>();
    map.put("id", "1");
    List<User> user = userMapper.selectByMap(map);
    user.forEach(System.out::println);
}

因为只使用了一个属性进行查询,效果也和 1.1 中相同。

1.3 根据多个字段进行联合查询

代码语言:txt复制
@Test
public void getUserByFields(){
    Map<String, Object> map = new HashMap<>();
    map.put("id", "1");
    map.put("username", "admin");
    List<User> user = userMapper.selectByMap(map);
    user.forEach(System.out::println);
}

多个字段的查询,等同于如下效果

2 条件查询

2.1 条件构造器 QueryWrapper 对象

那么如果想要实现复杂一些的查询呢,应该怎么做?

MyBatisPlus 中的 QueryWrapper 对象,可以让用户自由构造SQL查询条件,可以快速上手并且有效提高开发效率。

表达式

含义

or

条件或

and

条件且

in

在...中

notin

不在...中

eq

等于

ne

不等于

gt

大于

ge

大于等于

lt

小于

le

小于等于

between

在...范围

like

模糊查询,含有

notlike

模糊查询,不含有

groupBy

分组

having

分组后筛选

orderBy

数据排序

isNull

空值判断

isNotNull

非空判断

exists

存在

notExists

不存在

需要注意的是:

条件查询中的列名,必须是数据库中的列名,而不是我们所创建实体类中的属性名。

2.2 查询举例

查询 username 中包含“zhang”并且性别为女的记录

代码语言:txt复制
@Test
public void getUserUseAnd(){
    QueryWrapper<User> wrapper = new QueryWrapper<User>();
    QueryWrapper<User> select = wrapper.like("username", "zhang").eq("gendar", "女");
    List<User> users = userMapper.selectList(select);
    users.forEach(System.out::println);
}

输出结果:

User{id=2, username='zhangsan', gendar='女', remark='销售人员'}

这里的 like() 方法相当于 SQL 语句中的 %zhang%;如果我们只想对某一个方向的查询进行模糊,如果左侧模糊或右侧模糊,可以使用 likeLeft() 或是 likeRight() 即可实现 %zhang 或 zhang% 的效果。

2.3 聚合查询

在实际的工作中,我们有时需要对查询的结果使用聚合函数进行计算。

如:查询不同性别的用户数量,当数量等于0时不统计

我们对这个问题进行一下分解:

首先需要按性别对用户表进行分组;然后计算各分组的数量;按数量对结果进行筛选,要求大于0

此文以 count() 函数举例,其它函数的使用方法可以进行参考。

代码语言:java复制
@Test
public void getUserUseGroup() {
    QueryWrapper<User> wrapper = new QueryWrapper<User>();
    wrapper.select("gendar", "COUNT(gendar) as count").groupBy("gendar").having("count > 0");
    List<Map<String, Object>> objects = userMapper.selectMaps(wrapper);
    objects.forEach(System.out::println);
}

在控制台可以看到生成的SQL语句及执行过程:

==> Preparing: SELECT gendar,COUNT(gendar) as count FROM user GROUP BY gendar HAVING count > 0

==> Parameters:

<== Columns: gendar, count

<== Row: 女, 2

<== Row: 男, 3

<== Total: 2

执行结果如下:

{gendar=女, count=2}

{gendar=男, count=3}

类似地,如果想要使用其他聚合函数,可以在 select() 方法中直接使用 SQL 语句实现。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

邀请人:“北洋”

0 人点赞