条件构造器

条件字段
说明

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条件。

Drawing
BaseMapper

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方法在执行更新时只能对字段进行赋值,而不能对齐进行计算,对于一些复杂的需求就难以实现。

例如:扣除id1,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();

最后更新于

这有帮助吗?