首页 > 其他分享 >【MyBatisPlus】MyBatisPlus条件查询

【MyBatisPlus】MyBatisPlus条件查询

时间:2024-06-05 09:33:11浏览次数:12  
标签:LambdaQueryWrapper MyBatisPlus age wrapper 查询 userList User 条件

【MyBatisPlus】MyBatisPlus条件查询


文章目录

1、查询条件方式

MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合

image-20210801181232962

方式一:按条件查询

查询年龄大于18岁的用户

@Test
void testQueryWrapper() {
    //1. 创建查询条件封装对象,可以指定泛型
    QueryWrapper<User> wrapper = new QueryWrapper();
    //2.字段age大于18
    wrapper.gt("age", 18);
    //3.执行查询
    List<User> users = userMapper.selectList(wrapper);
    //4.输出结果
    users.forEach(System.out::println);
}

方式二:lambda格式按条件查询(推荐)

查询年龄小于10的用户

@Test
void testLambdaQueryWrapper() {
    //1.创建lambda查询包装器,支持泛型
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper();
    //2. 使用lambda参数,相当于调用 user -> user.getAge()方法,获取列名
    wrapper.le(User::getAge, 10);
    //3.查询
    List<User> users = userMapper.selectList(wrapper);
    //4.输出结果
    users.forEach(System.out::println);
}
2、组合条件

并且关系(and)

查询年龄小于30岁,而且大于10岁的用户

@Test
void testAnd() {
    //并且关系
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    //支持链式写法
    wrapper.lt(User::getAge, 30).gt(User::getAge, 10);
    List<User> userList = userMapper.selectList(wrapper);
    System.out.println(userList);
}

生成的SQL语句

SELECT id,name,gender,password,age,tel FROM user WHERE (age < ? AND age > ?)

或者关系(or)

查询年龄小于10岁或者大于30岁的用户

@Test
void testOr() {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    //或者关系:小于10岁或者大于30岁
    wrapper.lt(User::getAge, 10).or().gt(User::getAge, 30);
    List<User> userList = userMapper.selectList(wrapper);
    System.out.println(userList);
}

生成的SQL语句

SELECT id,name,gender,password,age,tel FROM user WHERE (age < ? OR age > ?)
3、NULL值处理

在多条件查询中,有条件的值为空应该怎么解决?

  • 如果最小年龄不为空,则查询大于这个年龄的用户
  • 如果最大年龄不为空,则查询小于这个年龄的用户

if语句控制条件追加

@Test
void testNullValue() {
    Integer minAge = 10;  //将来有用户传递进来,此处简化成直接定义变量了
    Integer maxAge = null;  //将来有用户传递进来,此处简化成直接定义变量了
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    if (minAge != null) {
        wrapper.gt(User::getAge, minAge);  //大于
    }
    if (maxAge != null) {
        wrapper.lt(User::getAge, maxAge);  //小于
    }
    List<User> userList = userMapper.selectList(wrapper);
    userList.forEach(System.out::println);
}

条件参数控制

@Test
void testCondition() {
    Integer minAge=10;  //将来有用户传递进来,此处简化成直接定义变量了
    Integer maxAge=null;  //将来有用户传递进来,此处简化成直接定义变量了
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    //参数1:如果表达式为true,那么查询才使用该条件,也支持链式编程
    wrapper.gt(minAge != null, User::getAge, minAge);
    wrapper.lt(maxAge != null, User::getAge, maxAge);
    //查询
    List<User> userList = userMapper.selectList(wrapper);
    //输出
    userList.forEach(System.out::println);
}
4、查询投影-设置【查询字段、分组】

查询结果包含模型类中部分属性

查询所有用户,只显示id, name, age三个属性,不是全部列。

使用select(列名...)方法,查询的结果如果封装成实体类,则只有这三个属性有值,其它属性为NULL

@Test
void testSameColumn() {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    //查询所有用户,只显示id, name, age三个属性,不是全部列
    wrapper.select(User::getId, User::getName, User::getAge);
    List<User> userList = userMapper.selectList(wrapper);
    System.out.println(userList);
}

SQL语句

SELECT id,name,age FROM user

查询结果包含模型类中未定义的属性

如果查询结果包含模型类中未定义的属性,则将每个元素封装成Map对象。

需求:按性别进行分组,统计每组的人数。只显示统计的人数和性别这两个字段

使用QueryWrapper包装对象的select方法

@Test
void testCountGender() {
    //使用QueryWrapper包装对象
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //查询2列:人数, 性别。 将聚合函数定义别名做为Map中的键
    wrapper.select("count(*) as count, gender");
    //按sex分组
    wrapper.groupBy("gender");
    //这里的查询方法使用selectMaps
    List<Map<String, Object>> list = userMapper.selectMaps(wrapper);
    list.forEach(System.out::println);
}
5、查询条件

多条件查询有哪些组合?

  • 范围匹配(> 、 = 、between)
  • 模糊匹配(like)
  • 空判定(null)
  • 包含性匹配(in)
  • 分组(group)
  • 排序(order)
  • ……

查询

  • 购物设定价格区间、户籍设定年龄区间(le ge匹配 或 between匹配)
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>();
//范围查询 lt le gt ge eq between
wrapper.between(User::getAge, 10, 30);
List<User> userList = userMapper.selectList(wrapper);
System.out.println(userList);
  • 查信息,搜索新闻(非全文检索版:like匹配)
/**
     * 需求: 查询姓张的用户
     *    select * from user where name like '张%'
     */
@Test
public void testFindByLike(){
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.likeRight(User::getName,"张");
    List<User> userList = userMapper.selectList(lambdaQueryWrapper);
    userList.forEach(System.out::println);
}
  • 统计报表(分组查询聚合函数)
QueryWrapper<User> qw = new QueryWrapper<User>();
qw.select("gender", "count(*) as nums");
qw.groupBy("gender");
List<Map<String, Object>> maps = userMapper.selectMaps(qw);
System.out.println(maps);

排序和limit

题目:显示年龄最大的5个用户

  • 说明:

    ①:提示:对年龄进行降序排序

    ②:仅获取前5条数据(提示:使用分页功能控制数据显示数量)

  • last()方法的说明:

    无视优化规则直接拼接到 sql 的最后(有sql注入的风险,请谨慎使用),注意只能调用一次,多次调用以最后一次为准

     /**
         * 需求: 查询年龄大于18岁的前三位
         *      select * from user where age>18 order by age desc limit 3;
         *
         */
        @Test
        public void testFindByLimit(){
            LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
            lambdaQueryWrapper.gt(User::getAge,18).orderByDesc(User::getAge).last("limit 3");
            List<User> userList = userMapper.selectList(lambdaQueryWrapper);
            userList.forEach(System.out::println);
        }
    

    生成的SQL

    SELECT id,name,gender,password,age,tel FROM user WHERE (age > ?) ORDER BY age DESC limit 3
    
6、字段映射与表名映射问题导入

问题一:表字段与编码属性设计不同步

解决办法:

  • 在模型类属性上方,使用**@TableField**属性注解,通过==value==属性,设置当前属性对应的数据库表中的字段关系。

image-20210801182722773

生成的SQL语句,自动给pwd这一列定义了别名为password, 从而给实体类属性password封装数据

SELECT id,name,gender,pwd AS password,age,tel FROM user

问题二:编码中添加了数据库中未定义的属性

解决方法:

  • 在模型类属性上方,使用**@TableField注解,通过exist**属性,设置属性在数据库表字段中是否存在,默认为true。此属性无法与value同时使用。

image-20210801182809131

不会去查询online

User(id=4, name=NewBoy, gender=男, password=123456, age=19, tel=12345678910, online=null)

问题三:某些字段和属性不参与查询

需求:password这个字段不查询

  • 在模型类属性上方,使用**@TableField注解,通过select**属性:设置该属性是否参与查询。此属性与select()映射配置不冲突。

image-20210801220534494

查询的SQL语句中不包含pwd字段

SELECT id,name,gender,age,tel FROM user WHERE id=?

实体类的password属性中没有值

User(id=4, name=NewBoy, gender=男, password=null, age=19, tel=12345678910, online=null)

问题四:表名与实体类名不同

解决方法:

  • 模型类上方,使用**@TableName注解,通过value**属性,设置当前类对应的数据库表名称。

image-20210801220807882

@Data
@TableName("tbl_user")
public class User {

}

查询生成的SQL语句

 SELECT id,name,gender,age,tel FROM tbl_user WHERE id=?

标签:LambdaQueryWrapper,MyBatisPlus,age,wrapper,查询,userList,User,条件
From: https://blog.csdn.net/weixin_53961667/article/details/139429480

相关文章

  • FreeRTOS基础(十):FreeRTOS任务状态查询API函数介绍
         本篇博客较为基础,介绍时间片调度和常用的任务状态查询API函数接口使用。目录一、时间片调度简介二、任务状态查询API函数介绍2.1常用API函数总览2.2常用API函数介绍2.2.1获取指定任务优先级2.2.2 改变某个任务的任务优先级2.2.3 获取系统中任务的任......
  • MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅
    MongoDBCRUD操作:地理位置应用——通过地理空间查询查找餐厅文章目录MongoDBCRUD操作:地理位置应用——通过地理空间查询查找餐厅地图的扭曲搜索餐厅浏览数据查找当前邻居查找附近所有餐厅查找一定距离内的餐厅使用`$geoWithin`,不排序使用`$nearSphere`,排序MongoDB......
  • 使用Python连接到MySQL数据库并执行查询
    在当今数字化时代,数据是企业和组织中至关重要的资产之一。数据库是存储和管理数据的核心工具之一,而MySQL则是其中一种流行的关系型数据库管理系统。如何使用Python编程语言连接到MySQL数据库,并执行查询以检索所需的数据。首先,需要安装pymysql库:pipinstallpymysql下......
  • 【MySQL】表左连接操作,对右表添加过滤数据的条件时,容易忽略的坑(左关联统计右表数据不
     疑问:sql中,左关联,右边表中无对应的数据,那能对右边的列进行筛选吗 ?带着疑问,我们看一下下面的文章MySQL】表左连接,对右表过滤数据时的坑左关联统计右边数据sqlSELECTma.id,ma.model_id,ma.event_rules_id,ma.model_applicati......
  • MybatisPlus的分页插件
    在未引入分页插件的情况下,MybatisPlus是不支持分页功能的,IService和BaseMapper中的分页方法都无法正常起效。所以,我们必须配置分页插件。配置分页插件在项目中新建一个配置类:其代码如下:packagecom.itheima.mp.config;importcom.baomidou.mybatisplus.annotation.DbType......
  • spring boot mybatis mysql 对emoji表情的插入与查询支持
    在网上查了很多都是要求在数据层面修改比如userName字段的值有可能存emoji表情那就把字段改成字符集 utf8mb4我的排序规则是utf8mb4_unicode_ci,如果单个字段不行就整个表varchar字段都改成这样的到了这部,使用mysql客户端对这个字段增删改查是没问题的但是很少有人提到myb......
  • 批量查询必须进行批量操作
    批量新增IService中的批量新增功能使用起来非常方便,但有一点注意事项,我们先来测试一下。首先我们测试逐条插入数据:@TestvoidtestSaveOneByOne(){longb=System.currentTimeMillis();for(inti=1;i<=100000;i++){userService.save(buildUser(i......
  • LeetCode 2903.找出满足差值条件的下标I
    1.题目要求如图所示:由题意可知我们如果要满足差值条件,我们可以使用迭代法,让下标i从零开始,我们再设一个变量j,然后让j等于下标加上indexDifference,再用for循环遍历j,再采用abs(nums[i]-nums[j])是否大于等于valueDifference,如果大于则break;以上就是代码算法思路接下来......
  • tg机器人查询数据库在哪里:一文教你轻松定位数据库查询功能
    在使用TG机器人时,我们经常会需要查询数据库以获取所需的信息。但是,如何找到并定位这些数据库查询功能呢?本文将为你详细解答。一、理解机器人功能首先,你需要明确你正在使用的TG机器人是否具备数据库查询功能。这通常可以在机器人的介绍或官方文档中找到。如果机器人支持数据库......
  • AC自动机(查询)
        上面讲了AC自动机是如何建树和建自动机的,这里要讲的是AC自动机的查询和各个数组的功能和作用。    其实AC自动机的查询和KMP算法是及其相近的,都是一个指针跑主串,另一个指针跑ne串(这里就是回跳边)。    话都说到这了,不妨先来看看ne的真实用处吧。......