Mybatis-Plus高级查询LambdaQueryWrapper&QueryWrapper

这篇具有很好参考价值的文章主要介绍了Mybatis-Plus高级查询LambdaQueryWrapper&QueryWrapper。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

Wrapper

查询构造器

查询条件

前期准备

查询条件

allEq

eq

ne

gt

ge

lt

le

between,notBetween

like,notLike

likeLeft

likeRight

isNull 空值查询

isNotNull 非空值查询

in

notIn

inSql、notInSql

groupBy

orderBy、orderByAsc、orderByDesc

or、and

解决方法

last

exists、notExists

总结

附加MySQL语句执行顺序


前言

我刚刚毕业开始进入项目组的时候,从未使用过Mybatis-Plus,只用过Mybatis,Mybatis还是老套的xml配置化,已经快转正了,所以做个总结,现在SpringBoot里面的JPa可以注解实现SQL的增删改查,针对单表查询现在实际项目开发过程中根本不使用原生Hibernate或者Mybatis了,目前使用的是Mybatis-Plus,使用轻便友好,开发代码段少且完美的实现,在这里写一个文档针对我进入工作时是如何开发使用的!

优势单表查询的话,可以直接的使用对象操作,其实实现起来极其方便而且简单!

如果多表联查的话,一般四张表以上关联或者是很复杂的sql,那就建议使用xml格式的配置化进行关联!

目前在重构一个项目的时候要针对原有的SQL进行重写,所以针对一个好用的Mybatis的插件使用。在这里做一些总结,然后通过我们组内人员使用,统一的改用LambdaQueryWrapper&QueryWrapper

简单对象查询方式用起来极为方便!涉及到单表查询的是该该对象查询继承;

推荐使用:LambdaQueryWrapper

LambdaQueryWrapper使用lambda表达式可以直接通过实体类get()属性,而QueryWrapper必须要与数据库的中表名一致,由于表名可能会很复杂,这时候相较而言LambdaQueryWrapper会比QueryWrapper便捷不少

Wrapper

条件 说明
allEq 基于 map 的比较
eq 等于 =
ne 不等于 <> 或者 !=
gt 大于 >
ge 大于等于 >=
lt 小于 <
le 小于等于 <
between BETWEEN 值1 AND 值2
notBetween NOT BETWEEN 值1 AND 值2
like LIKE ‘%值%’
notLike NOT LIKE ‘%值%’
likeLeft LIKE ‘%值’
likeRight LIKE ‘值%’
isNull 字段 IS NULL
isNotNull 字段 IS NOT NULL
in 字段 IN (value1, value2, …)
notIn 字段 NOT IN (value1, value2, …)
inSql 字段 IN (sql 语句)
inSql(“age”, “1,2,3”) -> age in (1,2,3)
inSql(“id”, “select id from student where id < 3”) -> id in (select id from student where id < 3)
notInSql 字段 NOT IN (sql 语句)
groupBy GROUP BY 字段
orderByAsc 升序 ORDER BY 字段, … ASC
orderByDesc 降序 ORDER BY 字段, … DESC
orderBy 自定义字段排序
orderBy(true, true, “id”, “name”) -> order by id ASC, name ASC
having 条件分组
or OR 语句,拼接 + OR 字段=值
and AND 语句,拼接 + AND 字段=值
apply 拼接 sql
last 在 sql 语句后拼接自定义条件
exists 拼接 EXISTS(sql语句)
exists(“selece id from student where age = 1”) -> exists(selece id from student where age = 1)
notExists 拼接 NOT EXISTS(sql语句)
nested 正常嵌套 不带 AND 或者 OR

查询构造器

查询条件

前期准备

  • 创建一个数据库 mybatisplus

  • 创建 user

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
);
  •  创建 springboot 工程
    • 导入对应 maven 坐标
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.cmy</groupId>
    <artifactId>mybatis_plus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatis_plus</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>

        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
    • mysql数据库相关配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1/mybatisplus?useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
    • mybatis-plus 日志信息配置
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    • 创建实体类 User
package com.cmy.mybatis_plus.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

/**
 * 实体类 user
 */
public class User {
    /**
     * 指定主键id生成的方式
     * value 是主键字段的名称,如果是id,可以不用写
     * type 指定主键的类型,主键的值如何生成。idType.AUTO 自动增长
     */
    @TableId(
            value = "id",
            type = IdType.AUTO
    )
    private Long id;
    private String name;
    private String email;
    private Integer age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
}

    • 自定义 User 的 Mapper 接口
package com.cmy.mybatis_plus.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cmy.mybatis_plus.entity.User;

/**
 * 自定义 Mapper 接口,就是 dao 接口
 * 1. 实现BaseMapper
 * 2. 指定实体类(泛型)
 *
 * BaseMapper 是 MP 框架中的对象,定义了 17 个操作方法(CRUD)
 */
public interface UserMapper extends BaseMapper<User> {
}

查询条件

allEq

条件用 Map 进行封装

“name” -> “张三”

“age” -> 20

public void testAllEq() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // 封装条件
    Map<String, Object> hashMap = new HashMap<>();
    hashMap.put("name", "张三");
    hashMap.put("age", 20);

    queryWrapper.allEq(hashMap);

    List<User> userList = userMapper.selectList(queryWrapper);
    userList.forEach(user -> {
        System.out.println(user);
    });
}

eq

eq("列名", 值) -> 列名 = 

    public List<Dict> listByDictCode(DictCode dictCode) {
        LambdaQueryWrapper<Dict> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(Dict::getDictCode, dictCode.getCode())
               .eq(Dict::getEnabled, DictEnableEnum.VALID.getType());
        return this.baseMapper.selectList(wrapper);
    }

ne

ne("列名", 值) -> 列名 != 

    public List<Dict> listByDictCode(DictCode dictCode) {
        LambdaQueryWrapper<Dict> wrapper = Wrappers.lambdaQuery();
        wrapper.ne(Dict::getDictCode, dictCode.getCode())
               .ne(Dict::getEnabled, DictEnableEnum.VALID.getType());
        return this.baseMapper.selectList(wrapper);
    }

gt

gt("age", 20) -> age > 20

    public List<User> userList() {
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
        wrapper.gt(User::getAge, 20);            
        return this.baseMapper.selectList(wrapper);
    }

ge

ge("age", 20) -> age >= 20

    public List<User> userList() {
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
        wrapper.ge(User::getAge, 20);            
        return this.baseMapper.selectList(wrapper);
    }

lt

lt("age", 20) -> age < 20

    public List<User> userList() {
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
        wrapper.lt(User::getAge, 20);            
        return this.baseMapper.selectList(wrapper);
    }

le

le("age", 21) -> age <= 21

    public List<User> userList() {
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
        wrapper.le(User::getAge, 20);            
        return this.baseMapper.selectList(wrapper);
    }

between,notBetween

between("age", 18, 25) -> age BETWEEN 18 AND 25 ,年龄在18到25之

notBetween就是不在18到25之间

    public List<User> userList() {
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
        wrapper.between(User::getAge, 18,25);                
        return this.baseMapper.selectList(wrapper);
    }

like,notLike

like 匹配值 -> "%值%" 模糊查询

notLike 模糊查询不匹配"%值%"

    public List<User> userList() {
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
         wrapper.like(User::getName, "张");           
        return this.baseMapper.selectList(wrapper);
    }

likeLeft

likeLeft 匹配值 -> "%值"

    public List<User> userList() {
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
         wrapper.likeLeft(User::getName, "张");           
        return this.baseMapper.selectList(wrapper);
    }

likeRight

likeRight 匹配值 -> "值%"

    public List<User> userList() {
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
        wrapper.likeRight(User::getName, "张");           
        return this.baseMapper.selectList(wrapper);
    }

isNull 空值查询

isNotNull 非空值查询

    public List<User> userList() {
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
        wrapper.isNull(User::getName);
        //wrapper.isNotNull(User::getName);              
        return this.baseMapper.selectList(wrapper);
    }

in

in("name", "张三", "李四") -> name in ("张三", "李四") 姓名是张三或李四的用户

notIn

notIn("name", "张三", "李四") -> name not in ("张三", "李四") 姓名不是张三或李四的用户

    public List<User> userList() {
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
        wrapper.in(User::getName, "张三","李四");
        //wrapper.in(User::getName, "张三","李四");           
        return this.baseMapper.selectList(wrapper);
    }

inSql、notInSql

public List<User> userList() {
    LambdaQueryWrapper<User> wrapper= new LambdaQueryWrapper<>();
    // SELECT id,name,email,age FROM user WHERE (age IN (select age from user where id = 1))
    wrapper.inSql(User::getAge, "select age from user where id = 1");
    return this.baseMapper.selectList(wrapper);
}

groupBy

分组

public List<User> userList() {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.groupBy(User::getName);
    return this.baseMapper.selectList(wrapper);
}

orderBy、orderByAsc、orderByDesc

public List<User> userList() {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    // SELECT id,name,email,age FROM user ORDER BY name ASC,age DESC
    wrapper.orderBy(true, true, User::getName).orderBy(true, false, User::getAge);
    
    // SELECT id,name,email,age FROM user ORDER BY name ASC,age ASC
    wrapper.orderByAsc(User::getName, User::getAge);

    // SELECT id,name,email,age FROM user ORDER BY name DESC,age DESC
    wrapper.orderByDesc(User::getName, User::getAge);

    return this.baseMapper.selectList(wrapper);
}

or、and

    public List<User> userList() {
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();

        // SELECT id,name,email,age FROM user WHERE (name = ? AND id = ?)
        wrapper.eq(User::getName, "张三").and().eq(User::getId,1);

        // SELECT id,name,email,age FROM user WHERE (name = ? OR id = ?)       
        wrapper.eq(User::getName, "张三").or().eq(User::getId,1);     
        return this.baseMapper.selectList(wrapper);
    }

这里说明一下or和and的问题

错误代码

public List<User> userList() {

    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(User::getId,1);
    wrapper.like(User::getName,"张")
           .or()
           .like(User::getEmail,"163")
           .or()
           .like(User::getAge,1);
}

根据上面的写法写出的sql语句如下:

WHERE id = '1' 
	AND name LIKE '%张%'
	OR email LIKE '%163%'
    OR age LIKE '%1%'

这样明显是不对的,根据mysql语句执行顺序or最后执行 ,这会导致一旦[name like '%张%']条件成立后面的or条件就会失效,所以第一个条件 并没有起到and的作用。

解决方法

public List<User> userList() {

    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(User::getId,1);
    wrapper.and(wrapper->wrapper.like(User::getName,"张")
                                .or()
                                .like(User::getEmail,"163")
                                .or()
                                .like(User::getAge,1)
               );
}

这样得到的sql语句如下

WHERE id = '1' 
	AND (name LIKE '%张%'
	OR email LIKE '%163%'
    OR age LIKE '%1%')

这样就解决了,这个问题在我的公司中新人(包括我在内)貌似都遇到这个问题,在此说明一下

last

在末尾拼接sql语句

注:last()有sql注入的风险,请谨慎使用!

public List<User> userList() {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    // SELECT id,name,email,age FROM user WHERE (name = ? OR age = ?) limit 1
    wrapper.eq(User::getName, "张三").or().eq(User::getAge, 20).last("limit 1");
    return this.baseMapper.selectList(wrapper);
}

exists、notExists

public List<User> userList() {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();

    // SELECT id,name,email,age FROM user WHERE (EXISTS (select name from user where age > ?))
    wrapper.exists("select name from user where age > 21");

    // SELECT id,name,email,age FROM user WHERE (NOT EXISTS (select name from user where age > ?))
    wrapper.notExists("select name from user where age > 21");

    return this.baseMapper.selectList(wrapper);
}

总结

附加MySQL语句执行顺序

1、from
2、where (or 最后执行)
3、group by
4、having
5、DISTINCT
6、order by
7、limit文章来源地址https://www.toymoban.com/news/detail-443888.html

到了这里,关于Mybatis-Plus高级查询LambdaQueryWrapper&QueryWrapper的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mybatis-plus之排序查询

    一、orderByAsc 排序:ORDER BY 字段, ... ASC 例:  orderByAsc(\\\"id\\\", \\\"name\\\") --- order by id ASC,name ASC #二、orderByDesc 排序:ORDER BY 字段, ... DESC 例:  orderByDesc(\\\"id\\\", \\\"name\\\") --- order by id DESC,name DESC #三、orderBy 排序:ORDER BY 字段, ... 例:  orderBy(true, true, \\\"id\\\", \\\"name\\\") --- order by id ASC,name ASC  倒叙排序  

    2024年02月15日
    浏览(42)
  • MyBatis-Plus条件查询问题解决

    问题描述 系统中有用户注册的功能,但是会出现重复注册的现象,代码中有做过重复校验,但是没有生效。 问题解决 首先排查数据生成时间点不同,相差时间有长有短,不是用户同时多次点击的原因,应该是用户这边不同时间重复多次注册导致的,但是程序中防止重复校验

    2024年02月16日
    浏览(47)
  • spring boot集成mybatis-plus——Mybatis Plus 查询数据(图文讲解)

     更新时间 2023-01-03 16:07:12 大家好,我是小哈。 本小节中,我们将学习如何通过 Mybatis Plus 查询数据库表中的数据。 在前面小节中,我们已经定义好了一个用于测试的用户表, 执行脚本如下: 定义一个名为  User  实体类: 不明白 Mybatis Plus 实体类注解的小伙伴,可参考前面

    2024年02月02日
    浏览(62)
  • mybatis-plus实现分页查询

    分页查询使用的方法是: IPage:用来构建分页查询条件 Wrapper:用来构建条件查询的条件,目前我们没有可直接传为Null IPage:返回值,你会发现构建分页条件和方法的返回值都是IPage IPage是一个接口,我们需要找到它的实现类来构建它,具体的实现类,可以进入到IPage类中按ctrl+

    2023年04月08日
    浏览(51)
  • MyBatis-Plus(三.Wrapper条件查询)

    Wrapper是Mybatis-plus中特有的 条件封装接口 也就是把 查询的条件 封装到Wrapper实现类中 它的各个实现类有什么作用呢, 我觉得直接 顾名思义 吧  QueryWrapper(删,查) 因为参数一般都从前端传来的数据中得到, 所以必须用条件封装的第一个参数确认它不为null UpdateWrapper(改) LambdaQuer

    2024年02月04日
    浏览(37)
  • MyBatis-Plus分页查询(快速上手运用)

    Mybatis-Plus知识点[MyBatis+MyBatis-Plus的基础运用]_心态还需努力呀的博客-CSDN博客   Mybatis-Plus+SpringBoot结合运用_心态还需努力呀的博客-CSDN博客 MyBaits-Plus中@TableField和@TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus中的更新操作(通过id更新和条件更新)_心态还需努力呀的博

    2024年02月16日
    浏览(52)
  • Mybatis-plus中的DML编程控制--增删改的高级操作

    1.1、id生成策略控制 不同的表应用不同的id生成策略 日志:自增(1,2,3,4,…) 购物订单:特殊规则( FQ23948AK3843) 外卖单:关联地区日期等信息(10 04 20200314 34 91) 关系表:可省略id ······ 名称: @TableId 类型: 属性注解 位置:模型类中用于表示主键的属性定义上方 作用:设置当前类中主

    2024年02月16日
    浏览(43)
  • mybatis-plus 查询数据为null问题解决

    首先数据库能查询到数据, 不过查询到的字段都是 null 值, 因为业务上就用到这3个字段 代码中使用 mybatis-plus 精确字段查询, select方法可以精确查询字段 之后debug看到 orderMain 对象为 null, 因为 这 3 个字段在数据库表中都是 null 解决方式是把 select方法需要查询一个数据库中不为

    2024年02月11日
    浏览(54)
  • mybatis-plus分页查询三种方法

    说明: 1、mybatis-plus中分页接口需要包含一个IPage类型的参数。 2、多个实体参数,需要添加@Param参数注解,方便在xml中配置sql时获取参数值。 注意这里我虽然加了@Param但是我并没有使用 这是控制台打印的查询语句,大家发现最后的LIMIT 函数没,正常来说mybatis-plus里是没有写

    2024年01月25日
    浏览(69)
  • Mybatis-plus动态条件查询QueryWrapper的使用

    queryWrapper是mybatis plus中实现查询的对象封装操作类,可以封装sql对象,包括where条件,order by排序,select哪些字段等等,他的层级关系如下图: 2.1-案例一:根据name模糊查看未删除的用户列表信息 过滤条件: queryWrapper实现: 2.2-案例二:查看姓李的并且邮箱不为空的用户列表

    2024年02月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包