06-条件构造器

十分重要:Wrapper 记住查看输出的SQL进行分析

AbstractWrapper

  1. 测试一:查询name不为空,email不为空,age大于18的数据
    @Test
    void testWrapper01() {
        //参数是一个wrapper ,条件构造器,和刚才的map对比学习!
        //查询name不为空,email不为空,age大于18的用户
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper
                .isNotNull("name")
                .isNotNull("email")
                .ge("age", 18);
        List<User> userList = userMapper.selectList(wrapper);
        userList.forEach(System.out::println);
    }

1665470983667.png

  1. 测试二:查询name为小芳的用户
    @Test
    void testWrapper02() {
        // 查询name为小芳的用户
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //查询一个数据selectOne,若查询出多个会报错
        //Expected one result (or null) to be returned by selectOne(), but found: *
        //若出现多个结果使用list或map
        wrapper.eq("name", "小芳");
        User user = userMapper.selectOne(wrapper); //查询一个数据,若出现多个结果使用selectList或selectMap
        System.out.println(user);
    }

1665471105058.png

  1. 测试三: 查询age在10-20之间的用户
    @Test
    void testWrapper03() {
        // 查询age在10-20之间的用户
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.between("age", 10 , 20);
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
        // 统计有多少数据
        Integer count = userMapper.selectCount(wrapper);
        System.out.println(count);
    }
  1. 模糊查询
    @Test
    void testWrapper04() {
        // 模糊查询
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // select * from user where name not like "%小%" and email like "t%"
        // 查询name字段不带小并且email字段t开头的数据
        wrapper.notLike("name", "小").likeRight("email", "t");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
  1. insql
    @Test
    void testWrapper05() {
        // 模糊查询
        // SELECT id,name,age,email,version,deleted,create_time,update_time
        //FROM user
        //WHERE deleted=0 AND id IN
        //(select id from user where id<5)
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //id 在子查询中查出来
        wrapper.inSql("id", "select id from user where id < 5");
        List<Object> users = userMapper.selectObjs(wrapper);
        users.forEach(System.out::println);
    }
  1. 排序
    @Test
    public void testWrapper6() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //通过id进行降序排序
        wrapper.orderByDesc("id");
        List<User> userList = userMapper.selectList(wrapper);
        userList.forEach(System.out::println);
    }
  1. 统计男女各多少人

实体类

private String sex;

添加字段
1665471477165.png

测试

 // 分组查询
    @Test
    public void testWrapper07() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // 统计男女各多少人
        wrapper.select("sex, count(*) as count");
        wrapper.groupBy("sex");
        List<User> userList = userMapper.selectList(wrapper);
        userList.forEach(System.out::println);
    }

1665472097576.png

  1. or
    // 查询id=1或者name=叶枫的数据
    @Test
    public void testWrapper08() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // select * from user where id = 1 or name = 小枫
        wrapper.eq("id", 1L).or().eq("name", "小枫");
        List<User> userList = userMapper.selectList(wrapper);
        userList.forEach(System.out::println);
    }

    // or()嵌套查询
    @Test
    public void testWrapper09() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // select * from user where and(name = 小枫 and id <> 1)
        wrapper.or(i -> i.eq("name", "小枫").ne("id", 1L)); // ne -> <>不等于
        List<User> userList = userMapper.selectList(wrapper);
        userList.forEach(System.out::println);
    }

QueryWrapper

queryWrapper的select可以设置要查询的列

基本使用

select(String... sqlSelect)
select(Predicate predicate)
select(Class entityClass, Predicate predicate)

SQL语句如下

select id, name from user

mp写法如下

    @Test
    public void testWrapper10() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.select("id", "name");
        List<User> userList = userMapper.selectList(wrapper);
        userList.forEach(System.out::println);
    }

UpdateWrapper

我们前面在使用update方法时需要创建一个实体类对象传入,用来指定要更新的列对应的值。但是如果要更新的列比较少,创建这么一个对象显得有点麻烦和复杂
我们可以使用updatewrapper的set方法来设置要更新的列及其值。同时这种方式也可以使用Wrapper去指定更复杂的更新条件

示例
Sql语句如下

update user set name = "小天" where id = 2;

写法如下

    @Test
    public void testWrapper10() {
        UpdateWrapper<User> wrapper = new UpdateWrapper<>();
        wrapper.eq("id", 1");
        wrapper.set("name", "小天");
        wrapper。update(null, wrapper);
    }

lambda

我们前面在使用条件构造器时列名都是用字符串的形式去指定。这种方式无法在编译期确定列名的合法性。
所以MP提供了一个Lambda条件构造器可以让我们直接以实体类的方法引用的形式来指定列名。这样就可以弥补上述缺陷。

示例
要执行的SQL

select * from user where age > 18 and name = "小枫";

构造器如下

    @Test
    public void testWrapper12() {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.gt(User::getAge, 18);
        List<User> userList = userMapper.selectList(wrapper);
        userList.forEach(System.out::println);
    }
posted @ 2022-10-26 16:12  ゐ叶う枫ゆ  阅读(28)  评论(0编辑  收藏  举报