MyBatisPlus - 4. Conditional constructors and common interfaces

content

1. Introduction to Wrapper

2、QueryWrapper

2.1. Assemble query conditions

2.2, assembly sorting conditions

2.3. Assembly deletion conditions

2.4. Use QueryWrapper to implement modification functions

2.5. Precedence of Conditions: Using lambda expressions

2.6. Assemble the select statement: only query the required fields

2.7. Implementing subqueries

3、UpdateWrapper

4. Simulate the situation of assembly conditions in development

4.1. Idea 1: Use if statement to judge  

4.2. Idea 2: Use condition

5、LambdaQueryWrapper

6、LambdaUpdateWrapper


1. Introduction to Wrapper

  • Wrapper: Conditional construction abstract class, the top parent class

    • AbstractWrapper: used to encapsulate query conditions and generate sql where conditions

      • QueryWrapper: Query condition encapsulation

      • UpdateWrapper : Update condition wrapper

      • AbstractLambdaWrapper : Using Lambda syntax

        • LambdaQueryWrapper : Query Wrapper for Lambda syntax usage

        • LambdaUpdateWrapper : Lambda update wrapper wrapper

2、QueryWrapper

2.1. Assemble query conditions

testing method:

    @Test
    public void test01(){
        // 查询用户名包含a,年龄在20到30之间,邮箱不为null的用户信息
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("user_name", "a")
                        .between("age", 20, 30)
                                .isNotNull("email");
        // SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (user_name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

Output result:

==>  Preparing: SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (user_name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
==> Parameters: %a%(String), 20(Integer), 30(Integer)
<==    Columns: id, name, age, email, is_deleted
<==        Row: 2, Jack, 20, [email protected], 0
<==        Row: 4, Sandy, 21, [email protected], 0
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@75361cf6]
User(id=2, name=Jack, age=20, [email protected], isDeleted=0)
User(id=4, name=Sandy, age=21, [email protected], isDeleted=0)

2.2, assembly sorting conditions

testing method:

    @Test
    public void test02(){
        // 查询用户信息,按照年龄降序排序,若年龄相同,按照uid升序排序
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("age").orderByAsc("uid");
        // SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 ORDER BY age DESC,uid ASC
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

Output result:

==>  Preparing: SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 ORDER BY age DESC,uid ASC
==> Parameters: 
<==    Columns: id, name, age, email, is_deleted
<==        Row: 6, 王五, 46, [email protected], 0
<==        Row: 7, 王五, 46, [email protected], 0
<==        Row: 8, 王五, 46, [email protected], 0
<==        Row: 3, Tom, 28, [email protected], 0
<==        Row: 5, Billie, 24, [email protected], 0
<==        Row: 4, Sandy, 21, [email protected], 0
<==        Row: 2, Jack, 20, [email protected], 0
<==        Row: 1, Jone, 18, [email protected], 0
<==      Total: 8
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@43d38654]
User(id=6, name=王五, age=46, [email protected], isDeleted=0)
User(id=7, name=王五, age=46, [email protected], isDeleted=0)
User(id=8, name=王五, age=46, [email protected], isDeleted=0)
User(id=3, name=Tom, age=28, [email protected], isDeleted=0)
User(id=5, name=Billie, age=24, [email protected], isDeleted=0)
User(id=4, name=Sandy, age=21, [email protected], isDeleted=0)
User(id=2, name=Jack, age=20, [email protected], isDeleted=0)
User(id=1, name=Jone, age=18, [email protected], isDeleted=0)

2.3. Assembly deletion conditions

testing method:

    @Test
    public void test03(){
        // 删除邮箱为[email protected]的用户
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("email", "[email protected]");
        // UPDATE t_user SET is_deleted=1 WHERE is_deleted=0 AND (email = ?)
        int ret = userMapper.delete(queryWrapper);
        System.out.println("ret = " + ret);
    }

Output result:

==>  Preparing: UPDATE t_user SET is_deleted=1 WHERE is_deleted=0 AND (email = ?)
==> Parameters: [email protected](String)
<==    Updates: 3

2.4. Use QueryWrapper to implement modification functions

testing method:

    @Test
    public void test04(){
        // 将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.gt("age", 20)
                .like("user_name", "a")
                .or()
                .isNull("email");
        User user = new User();
        user.setName("小明");
        user.setEmail("[email protected]");
        // UPDATE t_user SET user_name=?, email=? WHERE is_deleted=0 AND (age > ? AND user_name LIKE ? OR email IS NULL)
        int ret = userMapper.update(user, queryWrapper);
        System.out.println("ret = " + ret);
    }

Output result:

==>  Preparing: UPDATE t_user SET user_name=?, email=? WHERE is_deleted=0 AND (age > ? AND user_name LIKE ? OR email IS NULL)
==> Parameters: 小明(String), [email protected](String), 20(Integer), %a%(String)
<==    Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@a518813]
ret = 1

2.5. Precedence of Conditions: Using lambda expressions

For example the following two cases 

    @Test
    public void test04(){
        // 将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.gt("age", 20)
                .like("user_name", "a")
                .or()
                .isNull("email");
        User user = new User();
        user.setName("小明");
        user.setEmail("[email protected]");
        // UPDATE t_user SET user_name=?, email=? WHERE is_deleted=0 AND (age > ? AND user_name LIKE ? OR email IS NULL)
        int ret = userMapper.update(user, queryWrapper);
        System.out.println("ret = " + ret);
    }
    @Test
    public void test05(){
        // 将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
        // lambda中的条件优先执行
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("user_name", "a")
                .and(i->i.gt("age", 20).or().isNull("email"));
        User user = new User();
        user.setName("小红");
        user.setEmail("[email protected]");
        // UPDATE t_user SET user_name=?, email=? WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
        int ret = userMapper.update(user, queryWrapper);
        System.out.println("ret = " + ret);
    }

2.6. Assemble the select statement: only query the required fields

testing method:

    @Test
    public void test06(){
        // 查询用户的用户名、年龄、邮箱信息
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("user_name", "age", "email");
        // SELECT user_name,age,email FROM t_user WHERE is_deleted=0
        List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
        maps.forEach(System.out::println);
    }

Output result:

==>  Preparing: SELECT user_name,age,email FROM t_user WHERE is_deleted=0
==> Parameters: 
<==    Columns: user_name, age, email
<==        Row: Jone, 18, [email protected]
<==        Row: Jack, 20, [email protected]
<==        Row: Tom, 28, [email protected]
<==        Row: 小明, 21, [email protected]
<==        Row: Billie, 24, [email protected]
<==        Row: 小红, null, [email protected]
<==      Total: 6
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@790a251b]
{user_name=Jone, age=18, [email protected]}
{user_name=Jack, age=20, [email protected]}
{user_name=Tom, age=28, [email protected]}
{user_name=小明, age=21, [email protected]}
{user_name=Billie, age=24, [email protected]}
{user_name=小红, [email protected]}

2.7. Implementing subqueries

testing method:

    @Test
    public void test07(){
        // 子查询: 查询id小于等于100的用户信息
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.inSql("uid", "select uid from t_user where uid <= 100");
        // SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (uid IN (select uid from t_user where uid <= 100))
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

Output result:

==>  Preparing: SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (uid IN (select uid from t_user where uid <= 100))
==> Parameters: 
<==    Columns: id, name, age, email, is_deleted
<==        Row: 1, Jone, 18, [email protected], 0
<==        Row: 2, Jack, 20, [email protected], 0
<==        Row: 3, Tom, 28, [email protected], 0
<==        Row: 4, 小明, 21, [email protected], 0
<==        Row: 5, Billie, 24, [email protected], 0
<==        Row: 9, 小红, null, [email protected], 0
<==      Total: 6
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2dfe5525]
User(id=1, name=Jone, age=18, [email protected], isDeleted=0)
User(id=2, name=Jack, age=20, [email protected], isDeleted=0)
User(id=3, name=Tom, age=28, [email protected], isDeleted=0)
User(id=4, name=小明, age=21, [email protected], isDeleted=0)
User(id=5, name=Billie, age=24, [email protected], isDeleted=0)
User(id=9, name=小红, age=null, [email protected], isDeleted=0)

3、UpdateWrapper

testing method:

    @Test
    public void test08(){
        // 将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.like("user_name", "a")
                .and(i -> i.gt("age", 20).or().isNull("email"));
        updateWrapper.set("user_name", "小黑").set("email", "[email protected]");
        // UPDATE t_user SET user_name=?,email=? WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
        int ret = userMapper.update(null, updateWrapper);
        System.out.println("ret = " + ret);
    }

Output result:

==>  Preparing: UPDATE t_user SET user_name=?,email=? WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
==> Parameters: 小黑(String), [email protected](String), %a%(String), 20(Integer)
<==    Updates: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@55d9b8f0]
ret = 0

4. Simulate the situation of assembly conditions in development

In the actual development process, assembly conditions are common functions, and these conditions are derived from user input and are optional. Therefore, when assembling these conditions, we must first determine whether the user has selected these conditions, and if so, we need to Assemble this condition. If there is no selection, it must not be assembled, so as not to affect the result of SQL execution 

4.1. Idea 1: Use if statement to judge  

    @Test
    public void test09(){
        // 模拟开发中组装条件的情况,思路一:if语句判断,较麻烦
        String username = "a";
        Integer ageBegin = null;
        Integer ageEnd = 30;
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        if(StringUtils.isNotBlank(username)){
            // isNotBlank:判断某个字符串是否不为空字符串、不为null、不为空白符
            queryWrapper.like("user_name", username);
        }
        if(ageBegin != null){
            queryWrapper.ge("age",ageBegin);
        }
        if(ageEnd != null){
            queryWrapper.le("age", ageEnd);
        }
        // SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (user_name LIKE ? AND age <= ?)
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

4.2. Idea 2: Use condition

    @Test
    public void test10(){
        // 模拟开发中组装条件的情况:使用condition
        String username = "a";
        Integer ageBegin = null;
        Integer ageEnd = 30;
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // isNotBlank:判断某个字符串是否不为空字符串、不为null、不为空白符
        queryWrapper.like(StringUtils.isNotBlank(username), "user_name", username)
                .ge(ageBegin != null, "age", ageBegin)
                .le(ageEnd != null, "age", ageEnd);
        // SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (user_name LIKE ? AND age <= ?)
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

5、LambdaQueryWrapper

    @Test
    public void test11(){
        String username = "a";
        Integer ageBegin = null;
        Integer ageEnd = 30;
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
        // LambdaQueryWrapper中使用的是lambda的函数式接口
        lambdaQueryWrapper.like(StringUtils.isNotBlank(username), User::getName, username)
                .ge(ageBegin != null, User::getAge, ageBegin)
                .le(ageEnd != null, User::getAge, ageEnd);
        // SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (user_name LIKE ? AND age <= ?)
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        users.forEach(System.out::println);
    }

6、LambdaUpdateWrapper

    @Test
    public void test12(){
        // 将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
        LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        lambdaUpdateWrapper.like(User::getName, "a")
                .and(i -> i.gt(User::getAge, 20).or().isNull(User::getEmail));
        lambdaUpdateWrapper.set(User::getName, "小黑").set(User::getEmail, "[email protected]");
        // UPDATE t_user SET user_name=?,email=? WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
        int ret = userMapper.update(null, lambdaUpdateWrapper);
        System.out.println("ret = " + ret);
    }

Guess you like

Origin blog.csdn.net/Mr_zhangyj/article/details/124094931