Mybatis(16)Mybatis-Plus条件构造器(1)

Mybatis(16)Mybatis-Plus条件构造器(1)

文章目录

观前提醒:

如果你是第一次点击这篇博客,需要你回看Mybatis-plus系列的这个博客:
Mybatis(15)@TableName注解 & @TableField注解 & @TableId注解

这篇博客的代码,都是需要自己敲一下的。

建议你看着我说的知识点,自己尝试一下,创建 Springboot项目,使用 Mybatis-plus 框架,访问数据库。

这里使用的数据库是 MySQL。

图形化工具:Navicat

sql文件获取:https://gitee.com/mrbgvhbhjv/java-ee-course

1. 条件构造器

1.1条件构造器(Wrapper)简单介绍:

MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件

Wrapper 类 允许开发者以链式调用的方式构造查询条件无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。

换句话说:条件构造器(Wrapper)配合 实体类接口继承BaseMapper<T> 后,提供的 select,delete,updata 方法,自动生成 select,delete,updata 语句

条件构造器(Wrapper )+ select,delete,updata 方法 == SQL中的 select,delete,updata 语句

在 MyBatis-Plus 中,Wrapper 类是构建 查询和更新条件 的核心工具。以下是主要的 Wrapper 类及其功能:

  • AbstractWrapper :这是一个抽象基类,提供了所有 Wrapper 类共有的方法和属性。它定义了条件构造的基本逻辑,包括字段(column)、值(value)、操作符(condition)等。所有的 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都继承自 AbstractWrapper。
  • QueryWrapper :专门用于构造查询条件 ,支持基本的等于、不等于、大于、小于等各种常见操作。它允许你以链式调用的方式添加多个查询条件,并且可以组合使用 andor 逻辑。
  • UpdateWrapper :用于构造更新条件,可以在更新数据时指定条件。与 QueryWrapper 类似,它也支持链式调用和逻辑组合。使用 UpdateWrapper 可以在不创建实体对象的情况下,直接设置更新字段和条件。
  • LambdaQueryWrapper :这是一个基于 Lambda 表达式的查询条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。这种方式提高了代码的可读性和可维护性,尤其是在字段名可能发生变化的情况下。
  • LambdaUpdateWrapper :类似于 LambdaQueryWrapper,LambdaUpdateWrapper 是基于 Lambda 表达式的更新条件构造器。它允许你使用 Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题。

MyBatis-Plus 的 Wrapper 类是构建复杂查询和更新条件的关键工具。

查询语句:select

查询条件,更新条件:where id = ?

它允许开发者以 链式调用 的方式构造 SQL 的 WHERE 子句,提供了极大的灵活性和便利性。

什么是链式调用?

方法调用方法,就可以认为是链式调用。

代码举例:

2. QueryWrapper 使用举例:

QueryWrapper并不只用于查询语句, 无论是 修改, 删除, 查询, 都可以使用QueryWrapper来构建查询条件(where)

注意:QueryWrapper 不用于 新增语句(insert)

QueryWrapper类 的常用方法:

• lt :"less than" 的缩写,表示 小于。

• le :"less than or equal to"的缩写, 表示 小于等于

• ge :"greater than or equal to" 的缩写, 表示大于等于。

• gt :"greater than" 的缩写, 表示大于。

• eq :"equals" 的缩写, 表示等于。

• ne :"not equals" 的缩写, 表示不等于.

2.1 查询:

代码:

java 复制代码
    @Test
    void selectByCondition(){
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("id","username","password","age","gender","phone")
                .eq("age",20)
                .like("username","min");
        List<UserInfo> userInfos = userInfoMapper.selectList(queryWrapper);
//        等价于 sql:select id,username,`password`,age,gender,phone from user_info where age=20 and username like "%min%";

//        第一种输出方式:lambda表达式
//        userInfos.forEach(System.out::println);
//        第二种:流(stream)
//        userInfos.stream().forEach(x -> System.out.println(x));
//        第三种:for each循环
        for (UserInfo userInfo : userInfos) {
            System.out.println(userInfo.toString());
        }
    }

等价于 sql:

sql 复制代码
select id,username,`password`,age,gender,phone from user_info where age=20 and username like "%min%";

运行结果:

代码解释:

2.2 删除:

代码:

java 复制代码
    @Test
    void deleteByCondition(){
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id",6);
        userInfoMapper.delete(queryWrapper);
//        等价于 sql:delete from user_info where id = 6;

    }

等价于 sql:

sql 复制代码
delete from user_info where id = 6;

运行效果:

代码解释:

2.3 更新(简单更新):

代码:

java 复制代码
    @Test
    void updateByCondition(){
        UserInfo userInfo = new UserInfo();
        userInfo.setDeleteFlag(1);

        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.lt("age",20);
//        等价于 sql:update user_info set delete_flag = 1 where age < 20;
        
        userInfoMapper.update(userInfo,queryWrapper);
        
        
    }

等价于 sql:

sql 复制代码
update user_info set delete_flag = 1 where age < 20;

运行结果:

代码解释:

上述代码,构成了一条完整的 sql语句:update user_info set delete_flag=1 where age < 20

这里的update,需要传两个参数:

  1. user_info表对应的实体类对象 userinfo
  2. QueryWrapper类 的对象:queryWrapper

第二种写法,使用 UpdateWrapper类。

QueryWrapper总结:

QueryWrapper,你可以这么理解它的用法:

  1. 实例化 QueryWrapper类 的对象,QueryWrapper对象,调用相应的方法,构建 where语句(相等,大于,小于等条件)
  2. 实体类接口(UserInfoMapper)的对象(userInfoMapper),调用对应的 select,delete,update 方法,表示这条 sql语句 是 select,delete,updata语句。

更简洁点:

QueryWrapper对象 ,构建 where语句

实体类接口的对象,调用方法确定 select,delete,updata 语句

3. UpdateWrapper 使用举例:

对于更新, 我们也可以直接使用 UpdateWrapper, 在不创建实体对象的情况下, 直接设置更新字段和条件。

UpdateWrapper类的常用逻辑判断方法:

• lt :"less than" 的缩写,表示 小于。

• le :"less than or equal to"的缩写, 表示 小于等于

• ge :"greater than or equal to" 的缩写, 表示大于等于。

• gt :"greater than" 的缩写, 表示大于。

• eq :"equals" 的缩写, 表示等于。

• ne :"not equals" 的缩写, 表示不等于.

3.1 简单更新(更新一条记录):

代码:

java 复制代码
    @Test
    void updateByCondition2(){
        UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("delete_flag",0).lt("age",20);
//        等价于 sql:update user_info set delete_flag = 0 where age < 20;
        
        userInfoMapper.update(updateWrapper);
    }

等价于 sql:

sql 复制代码
update user_info set delete_flag = 0 where age < 20;

运行结果:

代码解释:

这里的更新,用到的也是 update方法。

这个方法,只需要传入一个参数:UpdateWrapper类 的对象 updateWrapper

3.2 两种更新方式(推荐使用 UpdateWrapper):

更新操作,更推荐使用 UpdateWrapper,清晰明了,代码也足够简洁。

3.3 复杂更新(一次更新多条记录):

实现下面的 sql语句:

sql 复制代码
-- 一次更新多条记录
UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3) 

代码:

java 复制代码
@Test
void updateByCondition3(){
    UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();
    updateWrapper.set("delete_flag",0).set("age",5)
                    .in("id",List.of(1,2,3));

    userInfoMapper.update(updateWrapper);
}

运行结果:

代码解释:

3.4 拼接 sql字段:

sql 复制代码
UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)

代码:

java 复制代码
@Test
void updateByCondition4(){
    UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();
    updateWrapper.setSql("age = age+10")
            .in("id",List.of(1,2,3));

    userInfoMapper.update(updateWrapper);
}

运行结果:

代码解释:

3.4 UpdateWrapper 总结:

UpdateWrapper ,你可以这么理解它的用法:

  1. 实例化 UpdateWrapper 类 的对象,UpdateWrapper 对象,调用各种方法:

    构建 where语句(相等,大于,小于等条件),in 关键字;拼接 sql片段......

  2. 实体类接口(UserInfoMapper)的对象(userInfoMapper),调用 update 方法,表示这条 sql语句 是 updata语句。

UpdateWrapper 这个构造器,是为了 update语句 而设计的。

UpdateWrapper类的常用逻辑判断方法:

• lt :"less than" 的缩写,表示 小于。

• le :"less than or equal to"的缩写, 表示 小于等于

• ge :"greater than or equal to" 的缩写, 表示大于等于。

• gt :"greater than" 的缩写, 表示大于。

• eq :"equals" 的缩写, 表示等于。

• ne :"not equals" 的缩写, 表示不等于.

4. 总结

条件构造器:QueryWrapper 使用举例,UpdateWrapper 使用举例。

还有另外两种:LambdaQueryWrapperLambdaUpdateWrapper ,这两个的举例使用,在
Mybatis(17)Mybatis-Plus条件构造器(2)& 自定义 SQL中进行讲解。

这篇博客的代码,多练习几遍。

更详细的使用,建议看官方文档:MyBatis-Plus 🚀 为简化开发⽽⽣

最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢!

下一篇博客:Mybatis(17)Mybatis-Plus条件构造器(2)& 自定义 SQL

相关推荐
翔云1234562 小时前
在MySQL中,出现Executed_Gtid_Set 乱序增长的场景
数据库·mysql
志栋智能2 小时前
AI驱动的数据库自动化巡检:捍卫数据王国的“智能中枢”
大数据·运维·数据库·人工智能·云原生·自动化
Ama_tor3 小时前
Navicat|简介,安装与MySQL连接
数据库·navicat
l1t3 小时前
DeepSeek辅助生成的PostgreSQL 查询优化实战幻灯片脚本
大数据·数据库·postgresql
祢真伟大3 小时前
DM8单库使用DMDRS数据同步到dpc-步骤三
数据库
知识分享小能手3 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019 存储过程与自定义函数 — 语法知识点及使用方法详解(15)
数据库·学习·sqlserver
dinga198510263 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
Aric_Jones4 小时前
博客RBAC权限模型与安全认证全解析
数据库·安全·oracle
wfsm4 小时前
有向图的状态转换
数据库