Mybatis-Plus--QueryWrapper--使用/实例

本文详细介绍了Mybatis-Plus中的QueryWrapper用法,包括全量查询、等值查询和多条件查询。通过设置实体类的值、Map和allEq方法,展示了如何进行SQL拼接和过滤null值的操作。示例代码演示了不同查询方式的实现和结果,帮助理解其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文网址:Mybatis-Plus--QueryWrapper--使用/实例_IT利刃出鞘的博客-CSDN博客

简介

本文介绍Mybatis-Plus中的QueryWrapper的用法。

全量查询

通过设置实体类的值来查询:若某一项设置为null,则不会拼接sql。

通过Map和allEq来查询:若某一项设置为null,则会拼接sql。(若想过滤null项,allEq的第二个参数设为false)

select示例:new QueryWrapper<>() .select("name", "age")......

等值查询

查询名字叫“Tony”的,年龄等于20的。

  1. seletOne返回的是一条实体记录,当出现多条时会报错。
  2. 如果需要有多条记录时只取一条,可以使用IService.java的getOne(Wrapper<T>, Boolean)方法,指定第二个参数为false。

方案1:直接用eq

    public void testSelectEqList() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();

        queryWrapper.eq("name", "张三");
        queryWrapper.eq("age", 28);
        queryWrapper.eq("last_name", null);

        // 这样也可以
        // queryWrapper.eq("name", "张三").eq("age", 28).eq("last_name", null);

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

执行结果 

==>  Preparing: SELECT id,name,last_name,email,gender,age FROM tb_user WHERE (name = ? AND age = ? AND last_name = ?) 
==> Parameters: 张三(String), 28(Integer), null
<==      Total: 0

方案2:传实体类 

    public void testSelectList() {
        User user = new User();
        user.setName("张");
        user.setAge(28);
        user.setLastName(null);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
        //User user = userMapper.selectOne(queryWrapper);  //查询一条记录
        //System.out.println(user);
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

执行结果

==>  Preparing: SELECT id,name,last_name,email,gender,age FROM tb_user WHERE name=? AND age=? 
==> Parameters: 张(String), 28(Integer)
<==      Total: 0

方案3:Map+allEq

    public void selectWrapper13() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        Map<String, Object> map = new HashMap<>();

        // 普通查询
        map.put("name", "张三");
        map.put("age",28);
        map.put("last_name",null);
        queryWrapper.allEq(map);   
        // queryWrapper.allEq(map, false);// 传入false自动过滤为null的

        // 自动过滤name参数
        //queryWrapper.allEq((key, value) -> !key.equals("name"), map);

        //User user = userMapper.selectOne(queryWrapper);  //查询一条记录
        //System.out.println(user);
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

 执行结果

==>  Preparing: SELECT id,name,last_name,email,gender,age FROM tb_user WHERE (name = ? AND last_name IS NULL AND age = ?) 
==> Parameters: 张三(String), 28(Integer)
<==      Total: 0

传入false执行结果

==>  Preparing: SELECT id,name,last_name,email,gender,age FROM tb_user WHERE (name = ? AND age = ?) 
==> Parameters: 张三(String), 28(Integer)
<==      Total: 0

多条件查询

上边是文章的部分内容,为便于维护,全文已转移到此网址:Mybatis-Plus-QueryWrapper-使用/实例 - 自学精灵

MyBatis Plus 中,`QueryWrapper<T>` 是一个用于构建查询条件的强大工具类。当你要表示“不等于”的条件时,可以使用 `ne` 方法。“所有方法不等于”这个表述可能存在一些歧义,我猜测您想了解的是如何设置字段值为 "不等于" 的查询条件。 下面我会详细解释一下如何通过 `QueryWrapper` 实现这一操作: ### 使用 ne() 方法 `ne()` 方法代表 Not Equal,即 “不等于”。其基本语法结构如下: ```java // 字段名、待比较的值 queryWrapper.ne("column_name", value); ``` 例如我们有一个名为 User 的实体对象以及对应的表 users,并希望找出年龄不是 20 岁的所有用户,则可以在 DAO 层编写类似如下的代码片段: ```java import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; ... public List<User> selectUsersNotEqualAge(){ QueryWrapper<User> queryWrapper = new QueryWrapper<>(); // 设置 age != 20 这样的过滤规则 queryWrapper.ne("age", 20); return userMapper.selectList(queryWrapper); } ``` 此外还支持链式调用,允许同时添加多个筛选条件。 如果您需要对同一个属性应用更复杂的判断逻辑 (比如排除几个特定数值),那么还可以借助自定义 SQL 表达式的功能来完成任务。 对于这种情况您可以尝试采用 notIn 或者 in 搭配集合的方式处理: ```java ArrayList<Integer> excludedAges = Arrays.asList(20,30,45); queryWrapper.notIn("age",excludedAges ); ``` 这将会生成类似于 WHERE age NOT IN (20, 30, 45) 的SQL语句. 最后请注意,在实际项目里一定要确保传入参数的有效性和合法性检查工作已经做好了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT利刃出鞘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值