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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!
邀请人:“北洋”