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

相关推荐
IvorySQL1 天前
PostgreSQL 技术日报 (3月9日)|EXPLAIN ANALYZE 计时优化与复制语法讨论
数据库·postgresql·开源
stark张宇2 天前
MySQL 核心内幕:从索引原理、字段选型到日志机制与外键约束,一篇打通数据库任督二脉
数据库·mysql·架构
倔强的石头_2 天前
融合数据库架构实践:关系型、JSON与全文检索的“一库多能”深度解析
数据库
星辰员2 天前
KingbaseES数据库:ksql 命令行用户与权限全攻略,从创建到删除
数据库
华仔啊2 天前
千万别给数据库字段加默认值 null!真的会出问题
java·数据库·后端
随风飘的云3 天前
MySQL的慢查询优化解决思路
数据库
IvorySQL3 天前
PostgreSQL 技术日报 (3月7日)|生态更新与内核性能讨论
数据库·postgresql·开源
赵渝强老师3 天前
【赵渝强老师】金仓数据库的数据文件
数据库·国产数据库·kingbase·金仓数据库
随逸1774 天前
《Milvus向量数据库从入门到实战,手把手搭建语义检索系统》
数据库
神秘的猪头4 天前
🚀 React 开发者进阶:RAG 核心——手把手带你玩转 Milvus 向量数据库
数据库·后端·llm