条件构造器
setSqlSele
设置 SELECT 查询字段
where
WHERE 语句,拼接 + WHERE 条件
and
AND 语句,拼接 + AND 字段=值
andNew
AND 语句,拼接 + AND (字段=值)
or
OR 语句,拼接 + OR 字段=值
orNew
OR 语句,拼接 + OR (字段=值)
eq
等于=
allEq
基于 map 内容等于=
ne
不等于
gt
大于
ge
大于等于>=
lt
小于<
le
小于等于<=
like
模糊查询LIKE
notLike
模糊查询 NOT LIKE
in
IN查询
notIn
NOT IN 查询
isNull
NULL 值查询
isNotNull
IS NOT NULL
groupBy
分组 GROUP BY
having
HAVING 关键词
orderBy
排序 ORDER BY
orderAsc
ASC 排序 ORDER BY
orderDesc
DESC 排序 ORDER BY
exists
EXISTS 条件语句
notExists
NOT EXISTS 条件语句
between
BETWEEN 条件语句
notBetween
NOT BETWEEN 条件语句
addFilter
自由拼接 SQL
last
拼接在最后,例如:last("LIMIT 1")
除新增以外,修改、删除、查询的 SQL 语句都需要指定where
条件,因此BaseMapper
中提供了除id
作为where
条件以外的其他查询方法,支持更加复杂的where
条件。
QueryWrapper
继承自 AbstractQueryWrapper
,自身的内部属性 entity
也用于生成条件及 LambdaQueryWrapper,可以通过 new QueryWrapper().lambda()
的方式获取。
select(String... sqlSelect)
select(Predicate<TableFieldInfo> predicate)
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
设置查询字段
以上方法分为两类,一类是直接传入字段名,另一类是传入一个 Predicate 函数式接口,用于过滤字段。
例如:·
select("id", "name", "age")
select(User.class, field -> !field.getColumn().equals("name"))
无论是修改、删除、查询,都可以使用QueryWrapper
来构造查询条件。
查询:查询名字中带o
的用户,存款大于等于1000
的人。
@Test
void testDbList2() {
// 1.构建查询条件 where name like "%o%" AND balance >= 1000
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("username", "o").ge("balance", 1000);
// 2.执行查询
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
更新:更新用户名为李小明的用户余额为2000
元。
@Test
void testDbUpdate() {
// 1.构建更新条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", "李小明");
// 2.构建更新内容
User user = new User();
user.setBalance(BigDecimal.valueOf(2000));
// 3.执行更新
int rows = userMapper.update(user, queryWrapper);
System.out.println("影响行数: " + rows);
}
删除:删除名字中带o
的用户,存款大于1000的用户
@Test
void testDbDelete() {
// 1.构建删除条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("username", "o").ge("balance", 1000);
// 2.执行删除
int rows = userMapper.delete(queryWrapper);
System.out.println("影响行数: " + rows);
}
UpdateWrapper
继承自 AbstractUpdateWrapper
,自身的内部属性 entity
也用于生成条件及 LambdaUpdateWrapper
,可以通过 new UpdateWrapper().lambda()
的方式获取。
set
set(String sql)
设置 SET 部分 SQL
例如:
set("name = 'Tom', age = 1")
lambda
获取 LambdaWrapper
,在 QueryWrapper
中是获取 LambdaQueryWrapper
,在 UpdateWrapper
中是获取 LambdaUpdateWrapper
。
基于BaseMapper
中提供的update
方法在执行更新时只能对字段进行赋值,而不能对齐进行计算,对于一些复杂的需求就难以实现。
例如:扣除id
为1,2,3
的用户200元。
UPDATE user SET balance = balance - 200 WHERE id in (1, 2, 4)
这种情况下就要利用UpdateWrapper
中的setSql
功能来实现。
@Test
void testUpdateWrapper() {
List<Long> ids = List.of(1L, 2L, 4L);
// 1. 生成SQL
UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
.setSql("balance = balance - 200") // SET balance = balance - 200
.in("id", ids); // WHERE id in (1, 2, 4)
// 2.更新,注意第一个参数可以给null,也就是不填更新字段和数据,而是基于UpdateWrapper中的setSQL来更新
userMapper.update(null, wrapper);
}
LambdaQueryWrapper
上述的示例中,我们都是在构造条件的时候写死了字段名称,会出现字符串魔法值,这在编程规范中是不推荐的。那么怎么才能不写字字段名,又能准确知道字段名呢?
其中一种办法是基于变量的gettter
方法结合反射技术。因此我们只要将条件对应的字段的getter
方法传递给 MybatisPlus,它就能计算出对应的变量名了。而传递方法可以使用JDK8中的方法引用
和Lambda
表达式。
LambdaQueryWrapper
LambdaUpdateWrapper
@Test
void testLambdaQueryWrapper() {
// 1.构建条件 WHERE username LIKE "%o%" AND balance >= 1000
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.lambda()
.select(User::getId, User::getUsername, User::getIdCardNumber, User::getBalance)
.like(User::getUsername, "o")
.ge(User::getBalance, 1000);
// 2.查询
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
LambdaQueryChainWrapper
以前是创建一个条件构造器,在通过 mapper 或 service 一条件构造器为参数进行查询,LambdaQueryChainWrapper 将前两步合并,直接通过链式调用进行查询。
List<User> list = new LambdaQueryChainWrapper<>(userMapper)
.like(User::getName, "雨")
.ge(User::getAge, 20)
.list();
LambdaQueryChainWrapper 有以下方法获取结果:
list:返回 List
one:返回一条数据
map:返回 Map
count:返回 count
remove:删除
update:更新
page:分页查询
select:自定义查询
使用 Wrapper 自定义SQL
链式调用lambda式
// 链式调用
UpdateChinWrapper<T> update();
// 链式调用 lambda 表达式
LambdaUpdateChainWrapper<T> lambdaUpdate();
// 等价示例
query().eq("name", value).list();
lambdaQuery().eq(User::getName, value).list();
// 等价示例
update().eq("name", value).remove();
lambdaUpdate().eq(User::getName, value).remove();
最后更新于
这有帮助吗?