初识MP

简介: 本文介绍了 MyBatis-Plus 在复杂应用中的使用技巧,涵盖条件构造器(如 QueryWrapper、UpdateWrapper 及其 Lambda 表达式版本)、自定义 SQL 的优化方式,以及分页和多表查询的处理方法。重点比较了 LambdaQueryWrapper 与 QueryWrapper 的适用场景,推荐单表操作优先使用 Lambda 方式以提升类型安全性,而多表联查则更适合使用 QueryWrapper 的灵活性。同时,通过示例说明了如何结合 Wrapper 与自定义 SQL 来构建高效、可维护的数据库操作逻辑。

针对MyBatis-Plus 复杂应用

简单可以直接使用内置方法解决,

复杂一点的(查询、修改、删除的SQL语句都需要指定where条件)

1.使用条件构造器

(本质上就是就是把条件给整合成一个对象,再调用内置方法
1.写死字段名称

  • QueryWrapper:用于查询、删除条件(侧重 WHERE 子句构建)。
  • UpdateWrapper:用于更新条件(可同时设置更新字段和 WHERE 条件)。
  • 使用方法:1.定义方法的对象,2.链式法则


等价于:update emp set salary = salary + 2000 where id in (5, 6, 7);
public void testUpdateWrapper() {
    // 更新id为5, 6, 7的员工的薪水,加2000
    UpdateWrapper<Emp> updateWrapper = new UpdateWrapper<>(); 创建对象
    updateWrapper.in("id", 5, 6, 7)
            .setSql("salary = salary + 2000"); 字段对应的都是sql中的字段名
    empMapper.update(updateWrapper);  //把结果封装传过去,调用的仍是mp的内置方法
}
.in .setsql(是链式的一些用法,不同场景不同用法)

2.使用实体类反射给字段名

  • LambdaQueryWrapper
  • LambdaUpdateWrapper
@Test
public void testLambdaUpdateWrapper() {
    // 更新id为5, 6, 7的员工的薪水,加2000
    LambdaUpdateWrapper<Emp> updateWrapper = new LambdaUpdateWrapper<>();
    updateWrapper.in(Emp::getId, 5, 6, 7) 指的是对象属性????
            .setSql("salary = salary + 2000");
    empMapper.update(updateWrapper);
}

总结 :

  • 核心差异QueryWrapper 用数据库字段名(字符串),LambdaQueryWrapper 用实体类属性(方法引用)
  • Lambda 优势:类型安全,编译期校验,自动处理驼峰映射,适合单表操作。
  • QueryWrapper 优势:灵活,支持多表联查的外部字段,写法更简洁(对熟悉字段名的场景)。

实际开发中,单表操作优先用 LambdaQueryWrapper(减少错误),多表联查用 QueryWrapper(灵活处理跨表字段)。

2.自定义sql(为了解决更新中对于set部分的优化)

  1.融合where条件(使用条件构造器)在service

   2.在mapper自定义方法(不是重写,自定义,参数,包括两部分,条件构造器对象,需修改的属性)

3.创建xml文件 ,进行绑定

示例:

sql示例:update emp set name='zhangsan', age=18 where id in(1,2,3) and salary > 1000 and sex = 1;
(1) 构建wrapper(融合条件)在service层
LambdaQueryWrapper<Emp> wrapper = new LambdaQueryWrapper<Emp>()
    .in(Emp::getId, ids)
    .eq(Emp::getSex, 1)
    .gt(Emp::getSalary, 1000);
    ****************************************************************************
 (2) 修改mapper入参(自定义方法)在mapper层
 void updateSalaryByIds(@Param("ew") LambdaQueryWrapper<Emp> wrapper, 
 @Param("amount") int amount, @Param("age") int age);
*************************************************************************** 
 (3) 动态sql:不影响where部分的语法,只需要调整set的字段  在xml文件中
 <update id="updateBalanceByIds">
    UPDATE emp SET amount = amount- #{amount} , age = #{age} ${ew.customSqlSegment} 固定写法(红色字体)
</update>
***********************************************************************
必须使用 ${} 而非 #{},因为它是直接拼接 SQL 片段,而非预编译参数。
@Param("ew") 固定不能改(用作标识) 通过 @Param 注解指定参数名,确保与 XML 中的 #{参数名} 对应。


分页查询(原来使用mybatis改用mp基础遵循原来的):

1.引入配置文件(分页配置文件)

2.使用page进行分页,并返回结果

3.使用条件进行判断(太麻烦)

多表(两张表)

调用基础方法即可(一个表中包含另一张表,与表中有另一个表中的字段不同)

相关文章
|
4月前
|
存储 安全 NoSQL
基础的数据结构
线性结构包括动态数组、链表、栈和队列,适用于顺序存储与操作。非线性结构如优先级队列、哈希表、红黑树、跳表和B+树,适用于复杂数据组织与高效查找。不同结构适用于不同场景,如HashMap适合快速查找,B+树用于数据库索引。
|
存储 缓存 算法
【ROS】如何让ROS中节点获取数据 III --参数服务器通信及ros常用工具指令介绍
相较于之前的通信模型,参数服务器是最为简单的。在之前的模型中,ROSMASTER都是扮演一个帮二者连接在一起的桥梁。
715 0
|
Java Spring 容器
【二十二】springboot整合拦截器实战并对比过滤器
【二十二】springboot整合拦截器实战并对比过滤器
247 0
|
4月前
|
存储 新零售 监控
一文揭开神秘的RFID技术面纱
RFID(射频识别)技术是物联网的重要组成部分,通过无线电信号自动识别目标并读写数据。广泛应用于门禁卡、公交卡、无人超市、物流仓储、智慧医疗等领域。本文详解其原理、组成、分类、特点及应用,带你全面了解这项高效、智能的识别技术。
6、Mybatis-Plus wrapper的使用
这篇文章详细介绍了Mybatis-Plus中Wrapper的使用,包括QueryWrapper和UpdateWrapper的基本概念、组装查询、排序、删除、修改条件的方法,以及如何设置条件优先级、组装SELECT子句和实现子查询等高级用法。
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
1030 6
|
存储 Java Spring
Spring Batch:让你的数据洪流化作涓涓细流,批量处理的魔法盛宴!
【8月更文挑战第31天】在现代软件开发中,批量处理对于金融交易、数据仓库加载等数据密集型应用至关重要。Spring Batch作为Spring生态的一部分,提供了一套全面的框架,支持事务管理、错误处理、日志记录等功能,帮助开发者高效构建可靠且可扩展的批处理应用。本文将深入探讨其核心概念、关键特性和实际应用,并通过示例代码展示如何配置作业、步骤及读取器、处理器和写入器,帮助读者更好地理解和应用Spring Batch。
376 1
|
XML JSON Java
@PostMapping 必须加上@RequestBody吗
@PostMapping 必须加上@RequestBody吗
561 2
|
机器学习/深度学习 数据采集 人工智能
2024年AI辅助研发:技术进展与行业应用展望
2024年AI辅助研发:技术进展与行业应用展望
883 0
|
Java Spring 数据格式
Controller和RestController的区别
1. Controller, RestController的共同点      都是用来表示Spring某个类的是否可以接收HTTP请求   2.  Controller, RestController的不同点      @Controller:  标识一个Spring类是Spring MVC controller处理器      @RestController:    @RestController是@Controller和@ResponseBody的结合体,两个标注合并起来的作用。
7256 0