MyBatisPlus-QueryWrapper多条件查询及修改方式

目录
  • gt、ge、lt、le、isNull、isNotNull
  • eq、ne
  • between、notBetween
  • allEq
  • like、notLike、likeLeft、likeRight
  • in、notIn、inSql、notinSql、exists、notExists
  • or、and
  • 嵌套 or、嵌套 and
  • orderBy、orderByDesc、orderByAsc
  • last
  • 指定要查询的列
  • set、setSql

gt、ge、lt、le、isNull、isNotNull

大于 >

例: gt("age", 18) → age > 18

ge 大于等于 >=

例: ge("age", 18) → age >= 18

lt 小于 <

例: lt("age", 18) → age < 18

le 小于等于 <=

例: le("age", 18) → age <= 18

isNUll 字段 IS NULL

例: isNull("name") → name is null

isNotNull 字段 IS NOT NULL

例: isNotNull("name") → name is not null

@Test
public void queryWrapperOne() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.
            isNull("name")
            .ge("age", 23)
            .isNotNull("email");
    // 逻辑删除
    int result = userMapper.delete(queryWrapper);
    System.out.println(result);
    // 最终的语句为:UPDATE user SET deleted=1 WHERE deleted=0 AND name IS NULL AND age >= ? AND email IS NOT NULL
}

eq、ne

eq 等于 =

例: eq("name", "老王") → name = '老王'

ne 不等于 <>

例: ne("name", "老王") → name <> '老王'

@Test
public void queryWrapperTwo() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "BNTang");
    // selectOne:返回的是一条记录,当出现多条时会报错
    User user = userMapper.selectOne(queryWrapper);
    System.out.println(user);
}

between、notBetween

BETWEEN 值1 AND 值2

例: between("age", 18, 30) → age between 18 and 30

NOT BETWEEN 值1 AND 值2

例: notBetween("age", 18, 30) → age not between 18 and 30

allEq

allEq 全部 eq(或个别 isNull)

个别参数说明:

params: key 为数据库字段名, value 为字段值

如果想表示 null isNull,则在 value 取值的时候传入一个 null, 为 null 时调用 isNull 方法, 为false时则忽略value为null的,也就是不拼接 value 为 null 的查询条件字段

例1: allEq({id:1,name:"老王",age:null})→id = 1 and name = '老王' and age is null

例2: allEq({id:1,name:"老王",age:null}, false)→id = 1 and name = '老王'

@Test
public void queryWrapperFour() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    Map<String, Object> queryParamsMap = new HashMap<>();
    queryParamsMap.put("id", 1373266771933462530L);
    queryParamsMap.put("name", "BNTang");
    queryParamsMap.put("age", 23);
    queryWrapper.allEq(queryParamsMap);
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

个别参数说明

filter: 过滤函数, 是否允许字段传入比对条件中

params 与 null、IsNull 同上

例1: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null})→name = '老王' and age is null

例2: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null}, false)→name = '老王'

如上图可看到,只添加了一个 id 查询的条件因为我写的过滤条件为要包含 i 这个字符串,所以只有第一个 key, value 包含了所以就只添加了 id

like、notLike、likeLeft、likeRight

LIKE '%值%'

例: like("name", "王")→name like '%王%'

NOT LIKE '%值%'

例: notLike("name", "王")→name not like '%王%'

LIKE '%值'

例: likeLeft("name", "王")→name like '%王'

LIKE '值%'

例: likeRight("name", "王")→name like '王%'

@Test
public void queryWrapperFive() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
            .notLike("name", "BNTang")
            .likeRight("email", "zq");
    // 返回值是Map列表
    List<Map<String, Object>> users = userMapper.selectMaps(queryWrapper);
    users.forEach(System.out::println);
}

in、notIn、inSql、notinSql、exists、notExists

字段 IN (value.get(0), value.get(1), ...)

例: in("age",{1,2,3})→age in (1,2,3)

字段 NOT IN (value.get(0), value.get(1), ...)

例: notIn("age",{1,2,3})→age not in (1,2,3)

字段 IN ( sql语句 )

例: 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)

字段 NOT IN ( sql语句 )

例: notInSql("age", "1,2,3,4,5,6")→age not in (1,2,3,4,5,6)

例: notInSql("id", "select id from table where id < 3")→id not in (select id from table where id < 3)

拼接 EXISTS ( sql语句 )

例: exists("select id from table where age = 1")→exists (select id from table where age = 1)

拼接 NOT EXISTS ( sql语句 )

例: notExists("select id from table where age = 1")→not exists (select id from table where age = 1)

@Test
public void queryWrapperSix() {
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.in("id", 1, 2, 3);
    queryWrapper.inSql("id", "select id from user where id < 3");
    // 返回值是Object列表
    List<Object> users = userMapper.selectObjs(queryWrapper);
    users.forEach(System.out::println);
}

or、and

拼接 OR

注意事项:

主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)

例: eq("id",1).or().eq("name","老王")→id = 1 or name = '老王'

OR 嵌套

例: or(i -> i.eq("name", "李白").ne("status", "活着"))→or (name = '李白' and status <> '活着')

AND 嵌套

例: and(i -> i.eq("name", "李白").ne("status", "活着"))→and (name = '李白' and status <> '活着')

@Test
public void queryWrapperSeven() {
    // 修改值
    User user = new User();
    user.setAge(99);
    user.setName("BNTang6666");
    // 修改条件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
            .like("name", "BNTang")
            .or()
            .between("age", 20, 30);
    int result = userMapper.update(user, userUpdateWrapper);
    System.out.println(result);
}

嵌套 or、嵌套 and

@Test
public void queryWrapperEight() {
    // 修改值
    User user = new User();
    user.setAge(99);
    user.setName("BNTang6666");
    // 修改条件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
            .like("name", "A")
            .or(i -> i.eq("name", "BNTang6666").ne("age", 20));
    int result = userMapper.update(user, userUpdateWrapper);
    System.out.println(result);
}

orderBy、orderByDesc、orderByAsc

排序:ORDER BY 字段, ...

例: orderBy(true, true, "id", "name")→order by id ASC,name ASC

排序:ORDER BY 字段, ... DESC

例: orderByDesc("id", "name")→order by id DESC, name DESC

排序:ORDER BY 字段, ... ASC

例: orderByAsc("id", "name")→order by id ASC,name ASC

@Test
public void queryWrapperNine() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.orderByDesc("id");
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

last

无视优化规则直接拼接到 sql 的最后

注意事项:

只能调用一次, 多次调用以最后一次为准有 sql 注入的风险, 请谨慎使用

例: last("limit 1")

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

指定要查询的列

@Test
public void queryWrapperEleven() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("id", "name", "age");

    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

set、setSql

SQL SET 字段

例: set("name", "老李头")

例: set("name", "")→数据库字段值变为空字符串

例: set("name", null)→据库字段值变为null

设置 SET 部分 SQL

例: setSql("name = '老李头'")

@Test
public void queryWrapperTwelve() {
    // 修改值
    User user = new User();
    user.setAge(10);
    // 修改条件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
            .like("name", "A")
            // 除了可以查询还可以使用set设置修改的字段
            .set("name", "BNTang")
            // 可以有子查询
            .setSql(" email = '303158131@qq.com'");
    int result = userMapper.update(user, userUpdateWrapper);
    System.out.println(result);
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 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、updateWrapper

    注明:上篇文章介绍了springboot+mybatis-plus通用CRUD的用法,这篇文章我们来介绍一下mybatis-plus强大的条件构造器.mybatis-plus的版本为最新版3.0.3 .条件构造器咱们讲述queryWrapper和updateWrapper的用法.关系.以及强大之处. 首先在这里写下官方文档的链接位置,官方文档说的很详细.如果还想知道在项目中的具体用法请往下看. 一.条件构造器关系介绍 介绍 : 1.上图绿色框为抽象类abstract 2.蓝色框为正常class类

  • 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`)

  • MyBatisPlus-QueryWrapper多条件查询及修改方式

    目录 gt.ge.lt.le.isNull.isNotNull eq.ne between.notBetween allEq like.notLike.likeLeft.likeRight in.notIn.inSql.notinSql.exists.notExists or.and 嵌套 or.嵌套 and orderBy.orderByDesc.orderByAsc last 指定要查询的列 set.setSql gt.ge.lt.le.isNull.isNotNull 大于 > 例: gt

  • mybatis批量新增、删除、查询和修改方式

    目录 前期说明: 主要有一下3种情况: (1)mybatis批量新增 (2)mybatis批量删除 (3)mybatis批量查询 (4)mybatis批量修改 mySql Case函数 动态批量修改:DeviceMapper.xml 动态批量修改:DeviceMapper.java 控制层(xxxxController) 每次写批量的时候,都要在网上搜索一下,虽然都做过多次了,但具体的自己还是记不住(汗颜),所以索性今天就记录下来. 前期说明: foreach的主要用在构建in条件中,它可以在S

  • 关于QueryWrapper,实现MybatisPlus多表关联查询方式

    目录 QueryWrapper实现MybatisPlus多表关联查询 1.dao层接口使用Select注解写SQL 2.service层代码示例 3.反射工具类 4.判空工具类 MybatisPlus QueryWrapper简单用法 QueryWrapper实现MybatisPlus多表关联查询 1.dao层接口使用Select注解写SQL 重点:@Param("ew") Wrapper参数是必须,因为${ew.customSqlSegment} 底层其实就是where 条件,所以为

  • MybatisPlus分页查询与多条件查询介绍及查询过程中空值问题的解决

    目录 前言 一.分页处理 1.调用方法传入参数获取返回值 2.设置分页拦截器 二.条件查询 2.1通过QueryWrapper对象来执行分页查询 2.2在QueryWrapper对象的基础上使用lambda表达式 2.3直接通过LambdaQueryWrapper对象 三.多条件查询 3.1且的情况 3.2或的情况 四.null判定 前言 MP这样一款强大的持久层框架处理起来复杂的SQL来也是得心应手,效率极高,快快与我一同领略Plus的独特魅力吧 一.分页处理 1.调用方法传入参数获取返回值

  • Mybatis-plus动态条件查询QueryWrapper的使用案例

    目录 一.queryWrapper介绍 二.环境搭建 1.创建数据库表并添加几条数据: 2.创建Springboot项目 三.queryWrapper示例 1.案例一:根据name模糊查看未删除的用户列表信息 2.案例二:查看姓李的并且邮箱不为空的用户列表 3.案例三:年龄范围查询(20-30之间的) 4.案例四:根据createTime查看当日的用户列表 5.案例五:查看某个时间段内的用户列表 6.案例六:查询姓李的并且邮箱不为空或者是年龄大于16的用户 7.案例七:查询id为1,2,3的用户

  • Mybatis-plus selectByMap条件查询方式

    目录 selectByMap条件查询 selectMaps方法返回值字段为空不显示问题 1.application.yaml设置mybayisPlus 2.添加call-setters-on-nulls: true之后 selectByMap条件查询 List<T> selectByMap(@Param("cm") Map<String, Object> columnMap); 如上,可以看到BaseMapper中的selectByMap接口需要的参数是Map&

  • MyBatis-Plus 条件查询器的实现

    目录 一.常用注解 1.1 @TableName 1.2 @TableId 1.3 @TableField 1.4 @TableLogic 二.条件构造器Wrapper 2.1 QueryWrapper 2.2 UpdateWrapper 三.MyBatis-Plus分页插件 3.1 实现步骤 四.通用枚举 4.1 数据库表添加字段sex 4.4 测试 五.多数据源 5.1 创建数据库及表 5.3 配置多数据源 5.4 创建新库中Product对应的类 本篇的主要代码依赖于之前的通用Mapper

  • MyBatisPlus超详细分析条件查询

    目录 解决日志冗长的问题 构建条件查询 多条件构建 null判定 解决日志冗长的问题 不过测试的时候,控制台打印的日志比较多,速度有点慢而且不利于查看运行结果,所以接下来我们把这个日志处理下: 取消初始化spring日志打印,resources目录下添加logback.xml,名称固定,内容如下: <?xml version="1.0" encoding="UTF-8"?> <configuration> </configuration

  • 如何利用反射生成 MyBatisPlus中QueryWrapper动态条件

    目录 1.问题 2.优化方案 1.问题 在MyBatisPlus中经常会用到如下所示的代码来构造查询条件: QueryWrapper<User> queryWrapper = new QueryWrapper<>(); if (userQuery.getId() != null) {     queryWrapper.eq("id", userQuery.getId()); } if (userQuery.getName() != null) {     que

随机推荐