MybatisPlus【SpringBoot】

【【尚硅谷】2022版MyBatisPlus教程(一套玩转mybatis-plus)】

5 条件构造器和常用接口

5.1 wrapper 介绍

在这里插入图片描述

  • Wrapper : 条件构造抽象类,最顶端父类
    • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
      • QueryWrapper : 查询条件封装
      • UpdateWrapper : Update 条件封装
      • AbstractLambdaWrapper : 使用Lambda 语法
        • LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
        • LambdaUpdateWrapper : Lambda 更新封装Wrapper
5.2 QueryWrapper
5.2.1 例1:组装查询条件

查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (username LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)

//查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
@Test
public void test01(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("username","a")
            .between("age",20,30)
            .isNotNull("email");

    List<User> list = userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

测试结果:

在这里插入图片描述

在这里插入图片描述

这是因为数据库中,唯一一条满足条件的记录已经被我们逻辑删除了。

把第一条数据的逻辑删除手动改成0,再试一次

在这里插入图片描述

5.2.2 例2:组装排序条件

按年龄降序查询用户,如果年龄相同则按id升序排列
SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 ORDER BY age DESC,id ASC

//按年龄降序查询用户,如果年龄相同则按id升序排列
@Test
public void test02(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.orderByDesc("age")
            .orderByAsc("id");

    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

测试结果

在这里插入图片描述

5.2.3 例3:组装删除条件

删除email为空的用户
DELETE FROM t_user WHERE (email IS NULL)【因为我们设置了逻辑删除,所以只是更新操作】

//删除email为空的用户
@Test
public void test03(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.isNull("email");
    int result = userMapper.delete(queryWrapper);
    System.out.println("受影响的行数:" + result);
}

测试结果:

在这里插入图片描述

5.2.4 例4:条件的优先级

将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
UPDATE t_user SET age=?, email=? WHERE (username LIKE ? AND age > ? OR email IS NULL)

//将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
@Test
public void test04(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("username","a")
            .gt("age",20)
            .or()
            .isNull("email");

    User user = new User();
    user.setAge(18);
    user.setEmail("user@atguigu.com");
    int result = userMapper.update(user,queryWrapper);
    System.out.println("受影响的行数:" + result);
}

测试结果:

在这里插入图片描述

将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
UPDATE t_user SET age=?, email=? WHERE (username LIKE ? AND (age > ? OR email IS NULL))
lambda表达式内的逻辑优先运算

//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
@Test
public void test05() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("username", "a")
            .and(i -> i.gt("age", 20).or().isNull("email"));

    User user = new User();
    user.setAge(18);
    user.setEmail("hah@atguigu.com");
    int result = userMapper.update(user,queryWrapper);
    System.out.println("受影响的行数:" + result);
}

测试结果

在这里插入图片描述

OK。

5.2.5 例5:组装select子句

查询用户信息的username和age字段
SELECT username,age FROM t_user

//查询用户信息的username和age字段
@Test
public void test06(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("username","age");
    List<Map<String , Object>> maps = userMapper.selectMaps(queryWrapper);

    maps.forEach(System.out::println);
}

在这里插入图片描述

5.2.6 例6:实现子查询

查询id小于等于3的用户信息
SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (id IN
(select id from t_user where id <= 3))

//查询id小于等于3的用户信息
@Test
public void test07(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();

    queryWrapper.inSql("uid","select uid from t_user where uid <= 3");
    List<User> list = userMapper.selectList(queryWrapper);

    list.forEach(System.out::println);
}

测试结果:

在这里插入图片描述

OK。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐