← 返回首页
MybatisPlus基础教程(九)
发表时间:2020-04-01 01:02:59
讲解MybatisPlus的条件构造器

1.wrapper简介

Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 QueryWrapper : Entity 对象封装操作类,不是用lambda语法 UpdateWrapper : Update 条件封装,用于Entity对象更新操作 AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。 LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper LambdaUpdateWrapper : Lambda 更新封装Wrapper。

2.AbstractWrapper

1)ge、gt、le、lt、isNull、isNotNull

//注意是逻辑删除。 UPDATE user SET deleted=1 WHERE deleted=0 AND name IS NULL AND age >= ? AND email IS NOT NULL

    @Test
    public void testDelete() {
        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
        queryWrapper
                .isNull("name")
                .ge("age", 12)
                .isNotNull("email");
        int result = usersMapper.delete(queryWrapper);
        System.out.println("delete return count = " + result);

    }

2)eq、ne 注意:seletOne返回的是一条实体记录,当出现多条时会报错。

SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name = ?

    @Test
    public void testSelectOne() {
        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
        queryWrapper
                .eq("name", "admin")
                .eq("email", "admin@qq.com");
        Users user = usersMapper.selectOne(queryWrapper);
        System.out.println(user);

    }

3)between、notBetween

包含大小边界 SELECT COUNT(1) FROM user WHERE deleted=0 AND age BETWEEN ? AND ?

    @Test
    public void testSelectCount() {
        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
        queryWrapper.between("age", 20, 30);
        Integer count = usersMapper.selectCount(queryWrapper);
        System.out.println(count);
    }

4)allEq

SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name = ? AND id = ? AND age = ?

    @Test
    public void testSelectList2() {
        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
        Map<String, Object> map = new HashMap<>();
        map.put("id", 1);
        map.put("name", "admin");
        map.put("age", 21);
        queryWrapper.allEq(map);
        List<Users> users = usersMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

5)like、notLike、likeLeft、likeRight

方法 说明
like("name","张") %张%
likeLeft("name","张") %张
likeRight("name","张") 张%

selectMaps返回Map集合列表

SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name NOT LIKE ? AND email LIKE ?

    @Test

    public void testSelectMaps() {
        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
        queryWrapper
                .notLike("name", "admin")
                .likeRight("email", "zhang");
        List<Map<String, Object>> maps = usersMapper.selectMaps(queryWrapper);//返回值是Map列表
        maps.forEach(System.out::println);
    }

6)in、notIn、inSql、notinSql、exists、notExists

in、notIn: - notIn("age",{1,2,3})--->age not in (1,2,3) - notIn("age", 1, 2, 3)--->age not in (1,2,3)

inSql、notinSql:可以实现子查询 - 例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6) - 例: inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)

SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND id IN (select id from user where id < 5)

    @Test
    public void testSelectObjs() {
        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
        //queryWrapper.in("id", 10, 20, 30);
        queryWrapper.inSql("id", "select id from users where id < 5");
        List<Object> objects = usersMapper.selectObjs(queryWrapper);//返回值是Object列表
        objects.forEach(System.out::println);
    }

7)or、and

注意:这里使用的是 UpdateWrapper 不调用or则默认为使用and 连接。 UPDATE user SET name=?, age=?, update_time=? WHERE deleted=0 AND name LIKE ? OR age BETWEEN ? AND ?

    @Test
    public void testUpdate1() {
        //修改值
        Users user = new Users();
        user.setAge(99);
        user.setName("Jerry");
        //修改条件
        UpdateWrapper<Users> userUpdateWrapper = new UpdateWrapper<>();

        userUpdateWrapper
                .like("name", "张")
                .or()
                .between("age", 20, 30);
        int result = usersMapper.update(user, userUpdateWrapper);
        System.out.println(result);
    }

8)嵌套or、嵌套and 这里使用了lambda表达式,or中的表达式最后翻译成sql时会被加上圆括号。

UPDATE user SET name=?, age=?, update_time=? WHERE deleted=0 AND name LIKE ? OR ( name = ? AND age <> ? )

    @Test
    public void testUpdate2() {
        Users user = new Users();
        user.setAge(99);
        user.setName("Andy");
        //修改条件
        UpdateWrapper<Users> userUpdateWrapper = new UpdateWrapper<>();
        userUpdateWrapper
                .like("name", "Tom")
                .or(i -> i.eq("name", "Jerry").ne("age", 20));
        int result = usersMapper.update(user, userUpdateWrapper);
        System.out.println(result);
    }

9)orderBy、orderByDesc、orderByAsc

SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 ORDER BY id DESC

    @Test
    public void testSelectListOrderBy() {
        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("id");
        List<Users> users = usersMapper.selectList(queryWrapper);
        users.forEach(System.out::println);

    }

10)last 直接拼接到 sql 的最后 注意:只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用. SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 limit 1

    @Test
    public void testSelectListLast() {
        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
        queryWrapper.last("limit 1");
        List<Users> users = usersMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

11)指定要查询的列

SELECT id,name,age FROM user WHERE deleted=0

    @Test
    public void testSelectListColumn() {
        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("id", "name", "age");
        List<Users> users = usersMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

12)set、setSql 最终的sql会合并 user.setAge(),以及 userUpdateWrapper.set() 和 setSql() 中 的字段。

UPDATE user SET age=?, update_time=?, name=?, email = '123@qq.com' WHERE deleted=0 AND name LIKE ?

    @Test
    public void testUpdateSet() {
        Users user = new Users();
        user.setAge(99);
        UpdateWrapper<Users> userUpdateWrapper = new UpdateWrapper<>();
        userUpdateWrapper
                .like("name", "Andy")
                .set("name", "老李头")//除了可以查询还可以使用set设置修改的字段
                .setSql(" email = '123@qq.com'");//可以有子查询
        int result = usersMapper.update(user, userUpdateWrapper);
    }