【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范

06-01 1016阅读

【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范

【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范

【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


条件构造器


UpdateWrapper


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


set( )


刚刚煮啵讲解了条件构造器 QueryWrapper,那怎么使用 UpdateWrapper构造更新语句呢?

【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范

两种更新方式的对比说明:

以下是简化后的对比表格,突出核心区别:

对比维度QueryWrapper 更新方式UpdateWrapper 更新方式(推荐)
更新值设置通过实体对象设置通过wrapper.set()方法直接设置
条件构建需单独创建QueryWrapper直接在同个Wrapper中构建条件和设置值
参数传递需传递实体对象 + QueryWrapper仅需传递UpdateWrapper(实体对象传null)
代码简洁性需要维护两个对象一站式完成设置和条件构建
推荐场景需要复用已有实体对象时简单字段更新或动态条件更新

核心区别:UpdateWrapper通过内置的set()方法实现了条件构造和值更新的统一处理,避免了实体对象的创建。


基础更新:完成下述 SQL 查询。

UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)

测试代码:

    @Test
    void testUpdateByUpdateWrapper(){
        UpdateWrapper updateWrapper = new UpdateWrapper();
        updateWrapper.set("delete_flag", 0).set("age",25)
                .in("id", List.of(1,2,3));
        userInfoMapper.update(updateWrapper);
    }

【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


setSql( )


基于 SQL 更新:完成下述 SQL 查询。

UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)

对于条件不是一个固定值,而是一个语句,就不能使用 set(),而是使用 setSql()

	@Test
    void testUpdateByUpdateWrapper(){
        UpdateWrapper updateWrapper = new UpdateWrapper();
        updateWrapper.setSql("age = age + 10")
                .in("id", List.of(1,2,3));
        userInfoMapper.update(updateWrapper);
    }

LambdaQueryWrapper


QueryWrapper 和 UpdateWrapper 存在一个问题,就是需要写死字段名;如果字段名发生变更,可能会因为测试不到位酿成事故。

MyBatis-Plus 提供了一种基于 Lambda 表达式的条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名,也提高了代码的可读性和可维护性。

  • LambdaQueryWrapper
  • LambdaUpdateWrapper

    分别对应上述的 QueryWrapper 和 UpdateWrapper。


    接下来我们看下具体使用:

    SELECT id, username, password, age 
    FROM user_info 
    WHERE age = 18 AND username 
    LIKE "%min%"
    

    下列分别是QueryWrapper和LambdaQueryWrapper的 SQL 代码实现:

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    通过日志,也可以看出来拼接的 SQL 是否正确:

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    LambdaUpdateWrapper


    LambdaUpdateWrapper 用法和 LambdaQueryWrapper 相似。

        @Test
        void testLamdaUpdateByUpdateWrapper(){
            UpdateWrapper updateWrapper = new UpdateWrapper();
            updateWrapper.lambda()
                    .set(UserInfo::getDeleteFlag, 0)
                    .set(UserInfo::getAge, 5)
                    .in(UserInfo::getId, List.of(1,2,3));
            userInfoMapper.update(updateWrapper);
        }
    

    MyBatis-Plus Wrapper类对比表格


    以下是整理后的 MyBatis-Plus Wrapper 类对比表格:

    Wrapper 类名继承关系主要用途核心特点适用场景
    AbstractWrapper所有 Wrapper 的基类提供通用的条件构造方法包含 eq(), ne(), gt(), lt() 等通用条件方法,支持链式调用作为其他 Wrapper 的父类使用
    QueryWrapper继承 AbstractWrapper构造查询条件新增 select() 方法可指定查询字段,支持 SQL 函数操作需要动态构建查询条件的场景
    UpdateWrapper继承 AbstractWrapper构造更新条件支持 set() 方法直接指定更新字段和值,可结合条件更新部分数据需要条件更新的场景
    LambdaQueryWrapper继承 AbstractWrapperLambda 表达式风格的查询构造器通过 Lambda 方法引用(如 User::getName)避免字段名硬编码,编译期类型检查需要类型安全且避免硬编码的场景
    LambdaUpdateWrapper继承 AbstractWrapperLambda 表达式风格的更新构造器结合 Lambda 表达式和 set() 方法,在避免字段名硬编码的同时构建更新条件需要类型安全的条件更新场景

    补充说明:

    1. 所有 Wrapper 都支持链式调用(如 .eq().gt().orderBy())
    2. Lambda 系 Wrapper 需基于实体类(如 new LambdaQueryWrapper())
    3. 官网链接:条件构造器 | MyBatis-Plus

    接下来通过代码来看下如何使用。


    自定义 SQL


    在实际的开发中,MyBatis-Plus 提供的操作不能满足我们的实际需求,MyBatis-Plus 也提供了自定义 SQL 的功能,我们可以利用 Wrapper 构造查询条件,再结合 Mapper 编写 SQL。

    条件构造器 | MyBatis-Plus

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    代码示例 1


    完成下述 SQL 查询。

    select id,username,password,age FRoM user_info WHERE username = "admin"
    

    Mapper:

    导入正确的 wrapper 包:

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    ${} 虽然会有 SQL 注入的问题,但是 MyBatis-Plus 已经考虑到了这个问题并且解决了,所以这里我们可以正常使用 ${ew.customSqlSegment}

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    package com.bit.mybatis.plus.mapper;
    import com.baomidou.mybatisplus.core.conditions.Wrapper;
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.baomidou.mybatisplus.core.toolkit.Constants;
    import com.bit.mybatis.plus.model.UserInfo;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    import java.util.List;
    @Mapper
    public interface UserInfoMapper extends BaseMapper {
        @Select("select id,username,password,age from user_info ${ew.customSqlSegment}")
        List selectUserInfoByCondition(@Param(Constants.WRAPPER) Wrapper queryWrapper);
    }
    

    测试代码:

        @Test
        void selectUserInfoByCondition() {
            QueryWrapper queryWrapper = new QueryWrapper();
            queryWrapper.lt("age",20);
            userInfoMapper.selectUserInfoByCondition(queryWrapper).forEach(System.out::println);
        }
    

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    观察打印日志:

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    代码示例 2


    完成下述 SQL 查询。

    UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)
    

    Mapper:

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    测试代码:

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    观察打印日志:

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    代码示例 3


    MyBatis-Plus 在 MyBatis 的基础上只做增强不做改变,所以也支持 XML 的实现方式。上述功能也可以使用 XML 的方式完成:

    配置 mapper 路径

    mybatis-plus:
      mapper-locations: "classpath*:/mapper/**.xml" # Mapper.xml
    

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    定义方法

    创建并初始化 XML 文件

    
    
    
    

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    编写 XML

    
    
        
            select id,username,password,age FROM user_info ${ew.customSqlSegment}
        
    
    

    测试

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    查看打印日志

    【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范


    总结


    • MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,可以用更少的代码实现数据库表的 CRUD,让我们的开发变得更加简单。
    • MyBatis-Plus 支持自定义 SQL,版本不低于 3.0.7,传递 Wrapper 对象作为参数时,参数名必须为 ew,在 SQL 语句中,使用 ${ew.customSqlSegment} 来引用 Wrapper 对象生成的 SQL 片段。

      【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范

      【MyBatis-Plus】深入解析 MP:UpdateWrapper、LambdaQueryWrapper 、LambdaUpdateWrapper 构造动态 SQL 和自定义 SQL 的方法及规范

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码