• 条件构造器~wapper


    目录

    1 wapper介绍

    2 条件查询

    2.1 组装查询条件

    2.2 组装排序条件

    2.3 组装删除条件

    2.4 queryWrapper实现修改功能

    2.5 条件的优先级

    2.6 组装select语句

    2.7 组装子查询

    2.8 使用updateWrapper实现修改功能

    2.9 使用condition组装条件

    2.10  LambdaQueryWrapper

    2.11 LambdaUpdateWrapper

    1 wapper介绍

    Wrapper: 条件构造抽象类,最顶端父类

            AbstractWrapper:用于查询条件封装,生成sql的where条件

    •                 QueryWrapper:查询条件封装
    •                 UpdateWrapper:Update条件封装
    •                 AbstractLambdaWrapper:使用Lambda语法

                                    LambdaQueryWrapper:用于Lambda语法使用的查询Wrapper

                                    LambdaUpdateWrapper:用于Lambda更新封装Wrapper

    2 条件查询

    2.1 组装查询条件

    1. @Test
    2. public void test01(){
    3. //查询用户名包含a,年龄在20到30之间,邮箱信息不为null的用户信息
    4. //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)
    5. QueryWrapper queryWrapper = new QueryWrapper<>();
    6. queryWrapper.like("user_name", "a")
    7. .between("age", 20, 30)
    8. .isNotNull("email");
    9. List list = userMapper.selectList(queryWrapper);
    10. list.forEach(System.out::println);
    11. }

    sql拼接如下:

    1. ==> 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)
    2. ==> Parameters: %a%(String), 20(Integer), 30(Integer)
    3. <== Total: 0

    2.2 组装排序条件

    1. @Test
    2. public void test02(){
    3. //查询用户信息,按照年龄的降序排序,若年龄相同,则按照id升序排序
    4. //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
    5. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    6. queryWrapper.orderByDesc("age")
    7. .orderByAsc("uid");
    8. List<User> list = userMapper.selectList(queryWrapper);
    9. list.forEach(System.out::println);
    10. }

    sql拼接如下:

    1. ==> 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
    2. ==> Parameters:
    3. <== Columns: id, name, age, email, is_deleted
    4. <== Row: 6, ybc6, 26, null, 0
    5. <== Row: 5, ybc5, 25, null, 0
    6. <== Row: 3, ybc3, 23, null, 0
    7. <== Row: 2, ybc2, 22, null, 0
    8. <== Row: 4, ybc4, 22, null, 0
    9. <== Row: 1, ybc1, 21, null, 0
    10. <== Total: 6

    可见是按照年龄的降序排列,当年龄相同的时候,则按照id的升序排列。

    2.3 组装删除条件

    1. @Test
    2. public void test03(){
    3. //删除邮箱地址为null的用户信息
    4. //UPDATE t_user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)
    5. QueryWrapper queryWrapper = new QueryWrapper<>();
    6. queryWrapper.isNull("email");
    7. int result = userMapper.delete(queryWrapper);
    8. System.out.println("result:"+result);
    9. }

    sql拼接如下:

    1. ==> Preparing: UPDATE t_user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)
    2. ==> Parameters:
    3. <== Updates: 6
    4. Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5aaaa446]
    5. result:6

    注意:这其实只是一个逻辑删除。

    2.4 queryWrapper实现修改功能

    1. @Test
    2. public void test04(){
    3. //将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
    4. //UPDATE t_user SET user_name=?, email=? WHERE is_deleted=0 AND (age > ? AND user_name LIKE ? OR email IS NULL)
    5. QueryWrapper queryWrapper = new QueryWrapper<>();
    6. queryWrapper.gt("age", 20)
    7. .like("user_name", "a")
    8. .or()
    9. .isNull("email");
    10. User user = new User();
    11. user.setName("小明");
    12. user.setEmail("test@atguigu.com");
    13. int result = userMapper.update(user, queryWrapper);
    14. System.out.println("result:"+result);
    15. }

    sql拼接如下:

    1. ==> Preparing: UPDATE t_user SET user_name=?, email=? WHERE is_deleted=0 AND (age > ? AND user_name LIKE ? OR email IS NULL)
    2. ==> Parameters: 小明(String), test@atguigu.com(String), 20(Integer), %a%(String)
    3. <== Updates: 0
    4. Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7dd611c8]
    5. result:0

    可见:update(@Param("et") T entity, @Param("ew") Wrapper updateWrapper)

    执行此条语法时,前面的需要被修改的值,后面是符合条件的数据。

    2.5 条件的优先级

    有些时候,我们虽然拼接了很多条件,但是合理的安排条件的执行顺序可以在很大程度上帮我们优化查询速度。

    1. @Test
    2. public void test05(){
    3. //将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
    4. //lambda中的条件优先执行
    5. //UPDATE t_user SET user_name=?, email=? WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
    6. QueryWrapper queryWrapper = new QueryWrapper<>();
    7. queryWrapper.like("user_name", "a")
    8. .and(i->i.gt("age",20).or().isNull("email"));
    9. User user = new User();
    10. user.setName("小红");
    11. user.setEmail("test@atguigu.com");
    12. int result = userMapper.update(user, queryWrapper);
    13. System.out.println("result:"+result);
    14. }

    sql拼接如下:

    1. ==> Preparing: UPDATE t_user SET user_name=?, email=? WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
    2. ==> Parameters: 小红(String), test@atguigu.com(String), %a%(String), 20(Integer)
    3. <== Updates: 0
    4. Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@35f639fa]
    5. result:0

    注意:在mybatisplus中,lambda中的条件优先执行。因为可以看到拼接的sql语句中age和email在一个小括号内。

    2.6 组装select语句

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

    拼接sql如下: 

    1. ==> Preparing: SELECT user_name,age,email FROM t_user WHERE is_deleted=0
    2. ==> Parameters:
    3. <== Total: 0

    2.7 组装子查询

    1. @Test
    2. public void test07(){
    3. //查询id小于等于100的用户信息
    4. //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))
    5. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    6. queryWrapper.inSql("uid", "select uid from t_user where uid <= 100");
    7. List<User> list = userMapper.selectList(queryWrapper);
    8. list.forEach(System.out::println);
    9. }

    拼接sql如下:

    1. ==> 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))
    2. ==> Parameters:
    3. <== Total: 0

    2.8 使用updateWrapper实现修改功能

    1. @Test
    2. public void test08(){
    3. //将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
    4. UpdateWrapper updateWrapper = new UpdateWrapper<>();
    5. updateWrapper.like("user_name", "a")
    6. .and(i -> i.gt("age", 20).or().isNull("email"));
    7. updateWrapper.set("user_name", "小黑").set("email","abc@atguigu.com");
    8. int result = userMapper.update(null, updateWrapper);
    9. System.out.println("result:"+result);
    10. }

    拼接sql如下:

    1. ==> Preparing: UPDATE t_user SET user_name=?,email=? WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
    2. ==> Parameters: 小黑(String), abc@atguigu.com(String), %a%(String), 20(Integer)
    3. <== Updates: 0
    4. Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3e47a03]
    5. result0

    2.9 使用condition组装条件

    1. @Test
    2. public void test10(){
    3. String username = "a";
    4. Integer ageBegin = null;
    5. Integer ageEnd = 30;
    6. QueryWrapper queryWrapper = new QueryWrapper<>();
    7. queryWrapper.like(StringUtils.isNotBlank(username), "user_name", username)
    8. .ge(ageBegin != null, "age", ageBegin)
    9. .le(ageEnd != null, "age", ageEnd);
    10. List list = userMapper.selectList(queryWrapper);
    11. list.forEach(System.out::println);
    12. }

    拼接sql如下:

    1. ==> 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 <= ?)
    2. ==> Parameters: %a%(String), 30(Integer)
    3. <== Total: 0

    2.10  LambdaQueryWrapper

    1. @Test
    2. public void test11(){
    3. //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 <= ?)
    4. String username = "a";
    5. Integer ageBegin = null;
    6. Integer ageEnd = 30;
    7. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    8. queryWrapper.like(StringUtils.isNotBlank(username), User::getName, username)
    9. .ge(ageBegin != null, User::getAge, ageBegin)
    10. .le(ageEnd != null, User::getAge, ageEnd);
    11. List list = userMapper.selectList(queryWrapper);
    12. list.forEach(System.out::println);
    13. }

    拼接sql如下:

    1. ==> 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 <= ?)
    2. ==> Parameters: %a%(String), 30(Integer)
    3. <== Total: 0

    2.11 LambdaUpdateWrapper

    1. @Test
    2. public void test12(){
    3. //将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
    4. LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
    5. updateWrapper.like(User::getName, "a")
    6. .and(i -> i.gt(User::getAge, 20).or().isNull(User::getEmail));
    7. updateWrapper.set(User::getName, "小黑").set(User::getEmail,"abc@atguigu.com");
    8. int result = userMapper.update(null, updateWrapper);
    9. System.out.println("result:"+result);
    10. }

    拼接sql如下:

    1. ==> Preparing: UPDATE t_user SET user_name=?,email=? WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
    2. ==> Parameters: 小黑(String), abc@atguigu.com(String), %a%(String), 20(Integer)
    3. <== Updates: 0
    4. Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3f702946]
    5. result0

  • 相关阅读:
    Quartz 的启动流程分析
    ES6 面试题
    个性化纹身设计,Midjourney带你探索独一无二的艺术之美
    17、Mybatis获取参数值的情况3(若mapper接口方法的参数为多个时,可以手动将这些参数放入map中存储)
    Flutter中TextField使用详情
    python reportlab 生成多页pdf
    FullCalendarDemo5 控件的实例讲解—拖拽实现值班排班(一)
    任意微信公众号短链实时获取阅读量、点赞数爬虫方案(不会Hook可用)
    node版本切换
    Linux ARM平台开发系列讲解(原子操作) 3.2.1 Linux内核原子操作
  • 原文地址:https://blog.csdn.net/qq_50652600/article/details/126100810