Mybatis-Plus Wrapper条件构造器超详细使用教程

目录
  • Wrapper条件构造器
    • 1 queryWrapper构造器
      • 1.1 组装删改查条件
      • 1.2 条件优先级
      • 1.3 实现子查询
    • 2 updateWrapper构造器
      • 2.1 升级修改方法(无需创建对象)
      • 2.2 实际开发时的应用
    • 3 lambdaXxxWrapper构造器
      • 3.1 lambdaQueryWrapper构造器
      • 3.2 lambdaUpdateWrapper构造器

Wrapper条件构造器

条件构造器wrapper就是用来封装CRUD方法参数条件的一个接口,其底层有很多的子类,最主要的就是最下面的四个子类:

  • queryWrapper可以用来删改查
  • updateWrapper可以在修改操作时不必创建实体类对象的操作
  • LambdaQueryWrapper和LambdaUpdateWrapper则是在字段参数的调用上进行了升级,其他都一样

因为增删改查中的增加记录不需要条件即可完成,所以增加方法无需条件构造器wrapper,其他的删改查则是有这个条件构造器参数的

1 queryWrapper构造器

1.1 组装删改查条件

组装查询条件

查询条件为:名字里包含a字母、年龄在20~30之间、email不为空的所有值,且查询到的值按照年龄降序排序,若年龄相同则按照id升序排序

查询返回name、age、email字段

@Test
public void selectListTest() {
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
   queryWrapper.select("name", "age", "email")
   		  .like("name", "a")
           .between("age", 20, 30)
           .isNotNull("email")
           .orderByDesc("age")
           .orderByAsc("id");
   // SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL) ORDER BY age DESC,id ASC
   List<Map<String, Object>> maps = mapper.selectMaps(queryWrapper);
   maps.forEach(System.out::println);
   System.out.println("========================================================================================");
   List<User> users = mapper.selectList(queryWrapper);
   users.forEach(System.out::println);
}

  selectMaps和selectList的区别在于:selectMaps会将查询到的结果封装在一个元素类型为map集合的list集合中,集合中只有查询返回字段所对应的键值对;而selectList的返回值也是一个list集合,只不过元素类型为对应的泛型,包含泛型所有的字段,查询返回字段之外的值都为null

组装删除条件

删除条件:email不为空

@Test
public void deleteTest() {
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
   queryWrapper.isNull("email");
   // UPDATE user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)
   int result = mapper.delete(queryWrapper);
   System.out.println("删除的行数为" + result);
}

组装修改条件

修改条件:(年龄大于20并且用户名中包含有a)或邮箱为null

@Test
public void updateTest() {
   User user = new User();
   user.setAge(20);
   user.setEmail("temporary.com");

   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
   queryWrapper.gt("age", 20)
           .like("name", "a")
           .or()
           .isNull("email");

   // UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
   int result = mapper.update(user, queryWrapper);
   System.out.println("修改的行数为" + result);
}

1.2 条件优先级

  使用queryWrapper组装复杂条件的时候,存在一个且或条件的优先级问题,也就是说在实现多条件拼接的时候且或条件该如何拼接到一起,接下来就挑取两个例子来了解一下

// (年龄大于20并且用户名中包含有a) 或 邮箱为null
// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
queryWrapper.gt("age", 20)
                .like("name", "a")
                .or()
                .isNull("email");

// 用户名中包含有a 且 (年龄大于18或邮箱为null)
// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
queryWrapper.like("name", "a")
                .and(i -> i.gt("age", 18).or().isNull("email"));

  总结一下:Lambda表达式中的条件会被当做一个整体优先执行,如果不括起来影响结果的话就需要使用Lambda表达式的写法,具体的使用要根据业务SQL语句来定

1.3 实现子查询

@Test
public void sonSelectTest() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.inSql("id", "select id from user where id <= 100");

    // SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (id IN (select id from user where id <= 100))
    List<User> users = mapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

2 updateWrapper构造器

2.1 升级修改方法(无需创建对象)

组装修改条件 修改条件:用户名中包含有a并且(年龄大于20或邮箱为null)

@Test
public void updateWrapperTest() {

   UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
   updateWrapper.like("name", "a")
           .and(i -> i.gt("age", 20).or().isNull("email"));
   updateWrapper.set("name", "小黑").set("email", "dhsjfghr");

   // UPDATE user SET name=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
   int result = mapper.update(null, updateWrapper);
   System.out.println("修改的行数为" + result);
}

由SQL可见,使用updateWrapper和queryWrapper完成的修改功能一样,且调用的方法也一样(mapper.update),二者的区别就是updateWrapper不用创建实体类对象,直接使用set方法就可以设置修改的字段值

2.2 实际开发时的应用

  在实际开发中,不管是queryWrapper还是updateWrapper都应该在一定的判断下再去使用条件构造器拼接条件,比如说请求传过来的值在不为空的情况下才去对这个字段进行条件设置,比如下面的这段代码

@Test
public void ifTest() {

    String userName = "";
    Integer ageBegin = 20;
    Integer ageEnd = 30;

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();

    if (StringUtils.isNotBlank(userName)) {
        queryWrapper.like("name", userName);
    }
    if (ageBegin != null) {
        queryWrapper.ge("age", ageBegin);
    }
    if (ageEnd != null) {
        queryWrapper.le("age", ageEnd);
    }

    List<User> users = mapper.selectList(queryWrapper);
}

  然而,上面的代码使用了很多的if判断显得过于冗余,于是许多的方法都带有一个condition参数,当这个参数为true的时候才会拼接查询条件,下面的代码用来代替上面一堆的if判断

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(userName), "name", userName)
        .ge(ageBegin != null, "age", ageBegin)
        .le(ageEnd != null, "age", ageEnd);

3 lambdaXxxWrapper构造器

  lambdaXxxWrapper与xxxWrapper的区别就是:他们可以使用Lambda的方式直接调用对象的getter方法来指定字段,而不用对照数据库中的字段名,这样就乐意避免参数对应不上数据库字段的问题。除了在调用字段时的写法不一样之外,其他的写法上二者的方式都一样

3.1 lambdaQueryWrapper构造器

@Test
public void lambdaQueryWrapperTest() {

    String userName = "";
    Integer ageBegin = 20;
    Integer ageEnd = 30;

    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.like(StringUtils.isNotBlank(userName), User::getName, userName)
            .ge(ageBegin != null, User::getAge, ageBegin)
            .le(ageEnd != null, User::getAge, ageEnd);

    List<User> users = mapper.selectList(lambdaQueryWrapper);
}

3.2 lambdaUpdateWrapper构造器

@Test
public void lambdaUpdateWrapperTest() {

    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, "dhsjfghr");

    // UPDATE user SET name=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
    int result = mapper.update(null, lambdaUpdateWrapper);
    System.out.println("修改的行数为" + result);
}

到此这篇关于Mybatis-Plus Wrapper条件构造器超详细使用教程的文章就介绍到这了,更多相关Mybatis-Plus Wrapper条件构造器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mybatis-Plus 条件构造器 QueryWrapper 的基本用法

    前言 记录下Mybatis-Plus中条件构造器Wrapper 的一些基本用法. 查询示例 表结构 CREATE TABLE `product` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`)

  • mybatis-plus中wrapper的用法实例详解

    目录 一.条件构造器关系介绍 条件构造器关系介绍 : wapper介绍 : 二.项目实例 1.根据主键或者简单的查询条件进行查询 2.MyBatis-Plus还提供了Wrapper条件构造器,具体使用看如下代码: 三.具体使用操作 1.ge.gt.le.lt.isNull.isNotNull 2.eq.ne 3.between.notBetween 4.allEq 5.like.notLike.likeLeft.likeRight 6.in.notIn.inSql.notinSql.exists

  • 基于mybatis-plus QueryWrapper 排序的坑

    目录 QueryWrapper排序的坑 条件构造器QueryWrapper 案例一 案例二 案例三 案例四 QueryWrapper排序的坑 大致可以总结成上面的两句话. 条件构造器QueryWrapper 我们再搞几个实例来深入理解下条件构造器QueryWrapper的用法: 案例一 查询姓李的,并且出生日期范围是1993-02-09到1994-04-09的员工 sql实现: SELECT * FROM t_employee WHERE DATE_FORMAT(birthday,'%Y-%m-

  • mybatis-plus QueryWrapper 添加limit方式

    目录 QueryWrapper 添加limit mybatis分页出现limit错误 QueryWrapper 添加limit 其实是在sql的最后加上 limit 相关的语句. QueryWrapper wrapper = new QueryWrapper<>(); wrapper.last("limit 1"); mybatis分页出现limit错误 在反复没有问题代码时,请检查你的SQL语句!!!!(细心检查) <mapper namespace="c

  • mybatis-plus QueryWrapper自定义查询条件的实现

    mybatis-plus框架功能很强大,把很多功能都集成了,比如自动生成代码结构,mybatis crud封装,分页,动态数据源等等,附上官网链接https://mp.baomidou.com/,github上有代码例子,国内小伙伴推荐码云https://gitee.com/baomidou/mybatis-plus.  但是,其中还是有些小坑,文档也没有涉及的很全面,碰到问题,百度或者发issue,能力强的还是直接看源码好,一切答案都在源码中. 版本推荐用3.1.0,3.1.1及以上版本有bu

  • mybatis-plus QueryWrapper and or 连用并且实现分页

    目录 QueryWrapper and or 连用并分页 and or 拼完后的结果是这样的 使用or和and的问题 比如下面这种 QueryWrapper and or 连用并分页 Page<TestEntity> rpage = baseMapper.selectPage( new Page<>(pageBean.getPageSize(), pageBean.getPageNum()), new QueryWrapper<TestEntity>() .eq(&qu

  • 详解MyBatis-Plus Wrapper条件构造器查询大全

    一.引言 那么那么那么今天来说下MP中强大的条件查询功能. 本章是基于上个案例来讲的:MyBaits-Plus 快速入门案例 二.具体操作 首先来说说基本的查询吧,根据主键或者简单的查询条件进行查询. /** * 通过单个ID主键进行查询 */ @Test public void selectById() { User user = userMapper.selectById(1094592041087729666L); System.out.println(user); } /** * 通过多

  • MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用详解

    目录 QueryWrapper LambdaQueryWrapper 链式查询 假如我们有一张banner_item表,现需要通过banner_id查出所有数据(查询List) @Data public class BannerItem {     private Long id;     private String name;     private String img;     private String keyword;     private Integer type;     p

  • MyBatis-Plus实现2种分页方法(QueryWrapper查询分页和SQL查询分页)

    目录 1 MyBatisPlusConfig 2 UserPagination 3 Mapper 3.1 UserMapper.java 3.2 UserMapper.xml 4 Service 4.1 UserService 4.2 UserServiceImpl 5 UserController 6 调试结果 6.1 QueryWrapper查询分页 6.2 SQL查询分页 1 MyBatisPlusConfig MyBatisPlus配置类. package com.config; imp

  • Mybatis-Plus Wrapper条件构造器超详细使用教程

    目录 Wrapper条件构造器 1 queryWrapper构造器 1.1 组装删改查条件 1.2 条件优先级 1.3 实现子查询 2 updateWrapper构造器 2.1 升级修改方法(无需创建对象) 2.2 实际开发时的应用 3 lambdaXxxWrapper构造器 3.1 lambdaQueryWrapper构造器 3.2 lambdaUpdateWrapper构造器 Wrapper条件构造器 条件构造器wrapper就是用来封装CRUD方法参数条件的一个接口,其底层有很多的子类,最

  • mybatis-plus Wrapper条件构造器updateForSet更新方式

    目录 Wrapper条件构造器updateForSet更新 简单示例 条件参数说明 mybatis-plus中update更新使用注意事项 update(pojo,Wrapper)方法 更新的字段比较少 updateById(mcTemplate)方法 Wrapper条件构造器updateForSet更新 官方文档:https://baomidou.gitee.io/mybatis-plus-doc/#/wrapper 实体包装器,用于处理 sql 拼接,排序,实体参数查询等! 补充说明: 使用

  • PHP Session条件竞争超详细讲解

    PHP SESSION 的存储 Session会话存储方式 PHP将session以文件的形式存储服务器的文件中,session.save_path来控制 默认路径 /var/lib/php/sess_PHPSESSID/var/lib/php/sessions/sess_PHPSESSID/tmp/sess_PHPSESSID/tmp/sessions/sess_PHPSESSID session文件默认是/var/lib/php/sessions目录下,文件名是sess_加上sessionI

  • IDEA 2020 2全家桶安装激活超详细图文教程

    IDEA-2020-2 全家桶激活超详细教程,详细步骤如下所示: 步骤一:  点击安装 步骤二: 进入安装页面, 直接Next 步骤三: 安装可能有两种情况,一种是新电脑刚安装,一种是电脑已安装旧版本,就版本的值需要如下图,就可以直接使用以前的配置,不需要卸载旧版本 如果是新电脑,就可能跳出不一样页面,没有设置存储,只需要如下选择即可 步骤四:选择安装位置 步骤五:创建桌面快捷 步骤六: 点击Install 安装 步骤七: 安装完成 步骤七点五:直接双击桌面快捷启动,弹框选择 步骤八: 然后进行

  • Idea配置超详细图文教程(2020.2版本)

    Idea配置(2020.2版本)1.Idea 设置字体2.Idea配置Maven3.不区分大小写4.自动导包功能及相关优化功能5.自动编译6.多行显示7.单词拼写检查8.idea中 类中显示成员变量和方法9.idea中 查看 类的关系图10.idea中 切换背景图片11.idea中 File Type 过滤12.手动加入快捷键设置 1.Idea 设置字体 settings --> Editor --> Font 2.Idea配置Maven Settings --> Build Tools

  • windows安装python超详细图文教程

    一.下载安装包 官网下载:python 3.6.0 打开链接滑到页面最下方 二. 开始安装 1.双击下载好的安装文件python-3.6.0-amd64.exe Install Now :默认安装 Customize Installation:自定义安装 Add Python 3.6 to PATH: 将python 加入环境变量 2.勾选Add Python 3.6 to PATH后,选择Customize Installation自定义安装 3.点击Next进行下一步 Install for

  • IDEA 2020 2全家桶安装激活超详细图文教程

    推荐阅读: 最新idea2020注册码永久激活(激活到2100年) https://www.jb51.net/article/178193.htm IntelliJ IDEA 2020最新激活码(亲测有效,可激活至 2089 年) https://www.jb51.net/article/184631.htm IDEA-2020-2 全家桶激活超详细教程,详细步骤如下所示: 步骤一:  点击安装 步骤二: 进入安装页面, 直接Next 步骤三: 安装可能有两种情况,一种是新电脑刚安装,一种是电脑

  • windows系统下SQL Server 2008超详细安装教程

    目录 1.解压文件后,双击setup.exe安装文件 2.打开后点击界面左侧的[安装],然后点击右侧的[全新SQL Server 独立安装或向现有安装添加功能] 3.进入[SQL Server 2008 安装程序]界面,首先是[安装程序支持规则] 4.无异常后点击“确定” 5.进入“产品密钥”页面 6.阅读软件许可条款,选择我接受许可条款,否则将无法使用此软件,点击下一步 7.点击安装 8.安装成功后点击下一步 9.点击“全选”并下一步 10.进入[实例配置],全部选择默认,点击[下一步] 11

  • SPSS连接mysql数据库的超详细操作教程

    目录 安装MySQL ODBC驱动 SPSS连接MySQL数据库的步骤 总结 安装MySQL ODBC驱动 官方说法:MySQL ODBC 驱动程序负责在开放式数据库连接 API (ODBC API) 的帮助下访问 MySQL数据库通俗说法:MySQL ODBC负责连接MySQL数据库 注意: 要根据本机安装的MySQL版本下载对应的ODBC驱动程序. MySQL数据库创建表插入数据 create database spss_db charset=utf8; use spss_db; creat

随机推荐