文章目录
1. 条件构造器
在Mybatis-Plus
中,Wrapper
接口的实现类关系如下:
可以看到,AbstractWrapper
和AbstractChainWrapper
是重点实现,接下来我们重点学习AbstractWrapper
以及其子类。
说明:
QueryWrapper(LambdaQueryWrapper)
和 UpdateWrapper(LambdaUpdateWrapper)
的父类 用于生成 sql
的 where
条件, entity
属性也用于生成 sql
的 where
条件 注意: entity
生成的 where
条件与 使用各个 api
生成的 where
条件没有任何关联行为。
下面学习具体的条件构造器
1. allEq
该方法用来查找所有符合条件的数据。
1.1 说明
1.2 测试用例(我们主要是查看生成的SQL)
params
为:
Map<String, Object> params = new HashMap<>();
params.put("name", "李四");
params.put("age", "20");
params.put("password", null);
1.2.1 wrapper.allEq(params):包含null
生成的SQL
为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (password IS NULL AND name = ? AND age = ?)
...
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.allEq(params);
this.userMapper.selectList(wrapper);
...
1.2.2 wrapper.allEq(params, false):不包含null
生成的SQL
为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name = ? AND age = ?)
...
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.allEq(params, false);
this.userMapper.selectList(wrapper);
...
1.2.3 wrapper.allEq((k, v) -> (k.equals(“age”) || k.equals(“id”)), params):过滤器过滤出指定的条件
示例1:
生成的SQL
为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (age = ?)
...
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 这里查询的是查询的key要么是age要么是id
wrapper.allEq((k, v) -> (k.equals("age") || k.equals("id")), params);
this.userMapper.selectList(wrapper);
...
示例2:
生成的SQL
为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name = ? AND age = ?)
...
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 这里查询的是查询的key要么是age要么是id要么是name
wrapper.allEq((k, v) -> (k.equals("age") || k.equals("id") || k.equals("name")), params);
this.userMapper.selectList(wrapper);
...
2. 基本比较操作
eq(equal)
:等于 =ne(not equal)
:不等于 <>gt(greater than)
:大于 >ge(Greater than or equal to)
:大于等于 >=It(less than)
:小于 <le(Less than or equal to)
:小于等于 <=between
:BETWEEN 值1 AND 值2notBetween
:NOT BETWEEN 值1 AND 值2in
:字段 IN (value.get(0), value.get(1), …)notIn
:字段 NOT IN (v0, v1, …)
示例代码:
@Test
public void testEq() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 查找 满足下面3个条件的人
// 1. password 等于 123456
// 2. age 大于等于 20
// 3. 名字是 "李四" or "王五" or "赵六"
wrapper.eq("password", "123456")
.ge("age", 20)
.in("name", "李四", "王五", "赵六");
List<User> users = this.userMapper.selectList(wrapper);
for (User user : users) {
System.out.println(user);
}
}
生成的sql
为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (password = ? AND age >= ? AND name IN (?,?,?))
3. 模糊查询
示例代码:
@Test
public void testLike() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// name like '%五'
wrapper.likeLeft("name", "五");
List<User> users = this.userMapper.selectList(wrapper);
for (User user : users) {
System.out.println(user);
}
}
生成的sql
为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name LIKE '%五')
4. 排序
示例代码;
@Test
public void testOrderByAgeDesc() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 按照age和name逆序排序
// SELECT id,user_name,password,name,age,email FROM tb_user ORDER BY age ASC,name ASC
wrapper.orderBy(true, true, "age", "name");
List<User> users = this.userMapper.selectList(wrapper);
for (User user : users) {
System.out.println(user);
}
}
生成的sql
为:com.tian.springbootmybatisplus.SpringbootMybatisplusApplicationTests#testOrderByAgeDesc
5. 逻辑查询
示例代码:
@Test
public void testOr() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 查询name为王五 或者 age为21的用户
wrapper.eq("name", "王五").or().eq("age", 21);
List<User> users = this.userMapper.selectList(wrapper);
for (User user : users) {
System.out.println(user);
}
}
生成的sql
为:SELECT id,user_name,password,name,age,email FROM tb_user WHERE (name = ? OR age = ?)
6. select(指定查询的字段:默认所有)
在Mybatis-Plus
查询中,默认查询所有的字段,如果有需要也可以通过select
方法进行指定字段。
示例代码:
查询 name 为 王五 或者 age 为 21 的用户的 id和name和age
@Test
public void testSelect() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 查询 name 为 王五 或者 age 为 21 的用户的 id和name和age
wrapper.eq("name", "王五")
.or()
.eq("age", 21)
.select("id", "name", "age"); //指定查询的字段
List<User> users = this.userMapper.selectList(wrapper);
for (User user : users) {
System.out.println(user);
}
}
生成的sql
为:SELECT id,name,age FROM tb_user WHERE (name = ? OR age = ?)