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

 更新时间:2022年6月27日 11:18  点击:3746 作者:小和尚敲木头

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);
}

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

原文出处:https://blog.csdn.net/w710537643/article/details/124433994

[!--infotagslink--]

相关文章

  • Mybatis Plus select 实现只查询部分字段

    这篇文章主要介绍了Mybatis Plus select 实现只查询部分字段的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-01
  • MyBatisPlus-QueryWrapper多条件查询及修改方式

    这篇文章主要介绍了MyBatisPlus-QueryWrapper多条件查询及修改方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2022-06-27
  • Oracle使用like查询时对下划线的处理方法

    这篇文章主要介绍了Oracle使用like查询时对下划线的处理方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-16
  • 解决mybatis-plus 查询耗时慢的问题

    这篇文章主要介绍了解决mybatis-plus 查询耗时慢的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-04
  • MySQL中在查询结果集中得到记录行号的方法

    如果需要在查询语句返回的列中包含一列表示该条记录在整个结果集中的行号, ISO SQL:2003 标准提出的方法是提供 ROW_NUMBER() / RANK() 函数。 Oracle 中可以使用标准方法(8i版本以上),也可以使用非标准的 ROWNUM ; MS SQL...2015-03-15
  • Node实现搜索框进行模糊查询

    这篇文章主要为大家详细介绍了Node实现搜索框进行模糊查询,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-06-28
  • Mybatis用注解写in查询的实现

    这篇文章主要介绍了Mybatis用注解写in查询的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-13
  • PHP+Mysql+jQuery查询和列表框选择操作实例讲解

    本文讲解如何通过ajax查询mysql数据,并将返回的数据显示在待选列表中,再通过选择最终将选项加入到已选区,可以用在许多后台管理系统中。本文列表框的操作依赖jquery插件。HTML <form id="sel_form" action="post.php" me...2015-10-23
  • Element-ui 自带的两种远程搜索(模糊查询)用法讲解

    这篇文章主要介绍了Element-ui 自带的两种远程搜索(模糊查询)用法讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-29
  • Mybatis和Mybatis-Plus时间范围查询方式

    这篇文章主要介绍了Mybatis和Mybatis-Plus时间范围查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-06
  • mysql like查询字符串示例语句

    MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi、grep和sed的扩展正则表达式模式匹配的格式 一、SQL模式SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL...2013-10-04
  • JPA如何使用nativequery多表关联查询返回自定义实体类

    这篇文章主要介绍了JPA如何使用nativequery多表关联查询返回自定义实体类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-11-18
  • MybatisPlus实现逻辑删除功能

    这篇文章主要介绍了MybatisPlus实现逻辑删除功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-25
  • C#百万数据查询出现超时问题的解决方法

    这篇文章主要介绍了C#百万数据查询出现超时问题的解决方法,是非常实用的技巧,需要的朋友可以参考下...2020-06-25
  • Select下拉框模糊查询功能实现代码

    这篇文章主要介绍了Select下拉框模糊查询功能实现代码的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-07-29
  • postgresql数据库连接数和状态查询操作

    这篇文章主要介绍了postgresql数据库连接数和状态查询操作,具有很好的参考价值,对大家有所帮助。一起跟随小编过来看看吧...2021-02-01
  • postgresql的jsonb数据查询和修改的方法

    这篇文章主要介绍了postgresql的jsonb数据查询和修改的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-03
  • 解决mybatisplus插入报错argument type mismatch的问题

    这篇文章主要介绍了解决mybatisplus插入报错argument type mismatch的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-25
  • Mybatis-Plus根据时间段去查询数据的实现示例

    这篇文章主要介绍了Mybatis-Plus根据时间段去查询数据的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-18
  • rails常用数据库查询操作、方法浅析

    这篇文章主要介绍了rails常用数据库查询操作、方法浅析,总结的比较全,WEB开发种常用的数据库操作都列出了rails对应代码,需要的朋友可以参考下...2020-06-30