SpringCloud 系列教程:微服务的未来(二)Mybatis-Plus的条件构造器、自定义SQL、Service接口基本用法

本篇博客将深入探讨 MyBatis-Plus 的三个核心功能:条件构造器自定义 SQLService 接口的基本用法。通过对这些功能的学习和掌握,开发者能够更加高效地使用 MyBatis-Plus 进行业务开发。

目录

前言

条件构造器

 自定义SQL

 Service接口基本用法

总结


前言

在现代 Java 开发中,MyBatis-Plus(简称 MP)作为 MyBatis 的增强工具,已经成为了开发者提高开发效率的利器。它通过简化 MyBatis 的操作,提供了多种便捷的功能,如自动生成 SQL、内置条件构造器、分页查询等。与 MyBatis 相比,MyBatis-Plus 更加简洁和高效,尤其适用于快速开发场景。

本篇博客将深入探讨 MyBatis-Plus 的三个核心功能:条件构造器自定义 SQLService 接口的基本用法。通过对这些功能的学习和掌握,开发者能够更加高效地使用 MyBatis-Plus 进行业务开发。


条件构造器

MyBatisPlus支持各种复杂的where条件,可以满足日常开发的所有需求。

查询名字中带o的,存款大于等于1000猿的人的id、username、info、balance字段

select id,username,info,balance from user where username like ? and balance >= ?
    @Testvoid testQueryUser() {//构造查询条件QueryWrapper<User> wrapper = new QueryWrapper<User>().select("id","username","info","balance").like("username","o").ge("balance",1000);//查询List<User> userList =  userMapper.selectList(wrapper);userList.forEach(System.out::println);}

 

更新用户名为jack的用户的余额为2000

update user set balance = 2000 where username = "jack"
    @Testvoid testUpdateByQueryMapper() {//需要更新的数据User user = new User();user.setBalance(2000);//更新的条件QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username","jack");//执行更新userMapper.update(user,wrapper);}
    @Testvoid testUpdateByQueryMapper() {//更新的条件UpdateWrapper<User> wrapper = new UpdateWrapper<User>().set("balance",20).eq("username","Jack");//执行更新userMapper.update(null,wrapper);}

 

 更新id为1,2,4的用户的余额,扣200

update user set balance = balance - 200 where id in (1,2,4);
    @Testvoid testUpdateWrapper(){List<Long> ids = List.of(1L, 2L, 4L);UpdateWrapper<User> wrapper = new UpdateWrapper<User>().setSql("balance = balance - 200").in("id",ids);userMapper.update(null,wrapper);}

查询表中username模糊匹配o和balance >= 100的user中id、username、info、balance。

    @Testvoid testLambdaWrapper(){//构造查询条件LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().select(User::getId,User::getUsername,User::getInfo,User::getBalance).like(User::getUsername,"o").ge(User::getBalance,100);List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}

 

条件构造器的用法:

  • QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分
  • UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
  • 尽量使用LambdaQueryWrapper和LambdaUpdateWrapper避免硬编码 

 自定义SQL

我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。

将id在指定范围内的用户(例如1,2,4)的余额扣减指定值。

<update id = "updateBalanceByIds">update user set balance = balance - #{amount}where id in<foreach collection="ids" separator=",",item="id" open="(" close=")">#{id}</foreach>
</update>

我们可以利用MvBatis Plus的包装器来构建复杂的Where条件,然后自己定义SOL语句中剩下的部分。

(1)基于包装器构建其中条件

        List<Long> ids = List.of(1L, 2L, 4L);//构建条件LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId,ids);//自定义SQL方法调用userMapper.updateBalanceByIds(wrapper,amount);

(2)在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew

void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper,@Param("amount") int amount);

(3)自定义SQL,并使用Wrapper条件

<update id="updateBalanceByIds">update user set balance = balance - #{amount} ${ew.customSqlSegment}
</update>

userMapper类

package com.itheima.mp.mapper;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.itheima.mp.domain.po.User;
import org.apache.ibatis.annotations.Param;public interface UserMapper extends BaseMapper<User> {void updateBalanceByIds(@Param(Constants.WRAPPER)LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);
}

测试方法

    @Testvoid testCustomSqlUpdate(){//更新条件List<Long> ids = List.of(1L, 2L, 4L);int amount = 200;//定义条件LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId,ids);//自定义方法userMapper.updateBalanceByIds(wrapper,amount);}

 Service接口基本用法

自定义接口需要去继承IService接口,实现类需要继承ServiceImpl

IUserService接口

package com.itheima.mp.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.mp.domain.po.User;
import org.springframework.stereotype.Service;public interface IUserService extends IService<User> {
}

UserServiceImpl类

package com.itheima.mp.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.mapper.UserMapper;
import com.itheima.mp.service.IUserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}

 测试类

package com.itheima.mp.service;import com.itheima.mp.domain.po.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.time.LocalDateTime;@SpringBootTest
class IUserServiceTest {@Autowiredprivate IUserService userService;@Testvoid testsaveUser(){User user = new User();user.setUsername("XiaoHong");user.setPassword("123456");user.setPhone("18688990982");user.setBalance(1500);user.setInfo("{\"age\": 23, \"intro\": \"英文老师\", \"gender\": \"female\"}");user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());userService.save(user);}}

 


总结

通过本篇博客的讲解,开发者应该对 MyBatis-Plus 的三个核心功能有了一个清晰的认识:

  1. 条件构造器QueryWrapper)使得查询条件构建更加简洁,极大减少了编写 SQL 语句的复杂度。
  2. 自定义 SQL 使得在复杂的业务需求下能够灵活应对,提供了更大的自由度。
  3. Service 接口基本用法 通过继承 ServiceImpl,大大简化了 CRUD 操作的实现,提升了开发效率。

这些功能不仅能够帮助我们提高开发效率,还能够减少代码冗余,提升代码的可读性和维护性。在实际的开发中,MyBatis-Plus 提供的这些工具将是日常工作中的好帮手。

希望通过本篇博客,读者能够更好地理解 MyBatis-Plus,提升自己的开发技能,快速构建高效、优雅的业务系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/65134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知识增强式生成KAG

随着人工智能技术的不断发展&#xff0c;尤其是在自然语言处理领域&#xff0c;知识增强式生成&#xff08;KAG&#xff09;作为一种新兴的技术框架&#xff0c;正逐步脱颖而出。与其前身——检索增强式生成&#xff08;RAG&#xff09;相比&#xff0c;KAG在处理特定领域知识、…

Nginx区分PC端和移动端访问

在使用Nginx时&#xff0c;可以通过$http_user_agent变量来判断用户访问的客户端类型&#xff0c;从而提供不同的内容或服务。下面是一个基于$http_user_agent变量来判断是否为PC访问的Nginx配置示例。 1. 理解$http_user_agent变量的含义及其在Nginx中的用途 $http_user_agen…

1.监督学习(上)

一.线性回归(Linear Regression Model): 输出无限多可能的数字。 【示例1】房价预测: 【图一】 假设您想根据房屋的大小预测房屋的价格,横轴:以平方英尺为单位的房屋大小,纵轴:是以千美元为单位的房屋价格。这里的小十字字中的每一个都是一所房子,其大小和价格是最…

前端编程图表化助手!Echarts入门

Echarts-一个基于javaScript的开源可视化图表库 在日常编程中&#xff0c;我们经常会用到类似饼图、柱状图等&#xff0c;而在网页中使用原生html和css很难做到类似效果。那么作为前端工程师&#xff0c;我们如何做出来一份好看而且实用的图标呢&#xff1f; 那么接下来&…

C#WPF基础介绍/第一个WPF程序

什么是WPF WPF&#xff08;Windows Presentation Foundation&#xff09;是微软公司推出的一种用于创建窗口应用程序的界面框架。它是.NET Framework的一部分&#xff0c;提供了一套先进的用户界面设计工具和功能&#xff0c;可以实现丰富的图形、动画和多媒体效果。 WPF 使用…

FPC在智能眼镜中的应用探索【新立电子】

在智能穿戴设备领域&#xff0c;智能眼镜具有独特的便携性、交互性和功能性等特点&#xff0c;智能眼镜的设计追求轻薄、美观与高度集成化。传统刚性电路板因体积庞大、难以弯曲&#xff0c;无法满足智能眼镜的复杂结构需求&#xff0c;而FPC其轻薄、柔软、可弯曲的特性&#x…

51c大模型~合集96

我自己的原文哦~ https://blog.51cto.com/whaosoft/12930135 #SnapGen 终于等来能塞进手机的文生图模型&#xff01;十分之一体量&#xff0c;SnapGen实现百分百的效果 本文的共同一作为墨尔本大学的胡冬庭和香港科技大学的陈捷润和黄悉偈&#xff0c;完成于在 Snap 研究院…

知识图谱+大模型:打造全新智慧城市底层架构

在数字化时代&#xff0c;智慧城市的建设正迎来新一轮的变革。本文将探讨如何结合知识图谱和大模型技术&#xff0c;构建智慧城市的全新底层架构&#xff0c;以应对日益增长的数据量和复杂性&#xff0c;提升城市管理的智能化水平。 知识图谱&#xff1a;智慧城市的知识库 知识…

webrtc获取IceCandidate流程

在WebRTC(Web Real-Time Communication)中,ICECandidate是一个关键概念,它用于描述在建立点对点(P2P)连接时可以考虑的潜在通信端点。以下是关于WebRTC中ICECandidate的详细解释: 一、ICECandidate的定义 ICECandidate对象通常包含以下关键属性: foundation:用于唯一…

Unity 实现Canvas显示3D物体

新建一个UI相机&#xff0c;选择渲染层为UI 将主相机的渲染层去掉UI层 、 将Canvas的RenderMode设置为Screen Space - Camera,将RenderCamera设置为UI相机 新建3D物体的UI父物体&#xff0c;并将3D物体的层级设置为UI层 适当的放缩3DObjParent&#xff0c;让3D物体能显示出来…

“鞋履数据库”:运动鞋店产品信息管理系统

2.1 SSM框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SSM&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c;SSM框架也可以&#xff0c;SpringMVC也可以。SSH框架是属于重量级…

[源码解析] 模型并行分布式训练Megatron (2) --- 整体架构

link [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构 目录 [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构 0x00 摘要0x01 启动 1.1 分布式启动1.2 构造基础 1.2.1 获取模型1.2.2 获取数据集1.2.3 步进函数 1.2.3.1 广播数据0x02 Pretrain0x03 初始化 3.1 …

【Go】Go数据类型详解—map

1. 前言 本篇博客将会介绍Go语言当中的另一大核心数据类型——map&#xff08;映射&#xff09;&#xff0c;当然在介绍这个数据类型之前我们还是要思考引入这个数据类型的原因&#xff1a; ❓ 需求&#xff1a;要求完成对一个班级所有同学的信息管理&#xff08;包括但不限于…

自动驾驶---Parking端到端架构

​​​​​​1 背景 自动泊车也是智能驾驶低速功能中比较重要的一部分&#xff0c;低速功能其中还包括记忆泊车&#xff0c;代客泊车等。传统的泊车算法通常使用基于规则或者搜索优化的方案来实现。然而&#xff0c;由于算法的复杂设计&#xff0c;这些方法在复杂的泊车场景中效…

USB接口实现CDC(usb转串口功能)

主控&#xff1a;stm32f429 PHY芯片&#xff1a;usb3320 Cubemx System Core-RCC connectivity-USB_OTG_HS Middleware and Software Packs-USB_DEVICE 时钟配置&#xff1a;根据自己使用的MCU工作频率设置 Generate Code Keil5 打开工程 usbd_cdc_if.c这个文件&…

软件测试框架有什么作用?好用的测试框架分享

在当今软件开发中&#xff0c;软件测试框架扮演着至关重要的角色。测试框架是指用于支持自动化测试及测试管理的环境或平台。它提供了一系列的规则、标准和工具&#xff0c;以确保软件产品的质量。框架涵盖了测试的所有层面&#xff0c;包括单元测试、集成测试和系统测试等。更…

2.1.2 select poll epoll reactor

1. select 的使用方法 fd_set rdset; FD_ZERO(&rdset); // 清空 rdset rdset fdset; // 将 fdset 拷贝到 rdset&#xff0c;准备传给 select select(maxFd 1, &rdset, NULL, NULL, NULL);参数说明&#xff1a; maxFd: 被监控的文件描述符中最大的一个。maxFd 1…

vscode安装fortran插件配置

本章教程,主要介绍如何在vscode上安装fortran插件,以便于使用vscode运行fortran编写的程序。 一、安装插件 首先在插件商店安装这个扩展插件 然后再把Code Runner扩展插件装上 二、下载mingw64 通过网盘分享的文件:mingw64 链接: https://pan.baidu.com/s/1fwS-CwC7dgI

企业该如何进行合格文件外发管理

随着信息技术的迅猛发展&#xff0c;企业间的文件交换变得越来越频繁。但是&#xff0c;如何确保文件传输的安全性与效率&#xff0c;成为企业管理者面临的一个重大挑战。镭速&#xff08;Raysync&#xff09;文件外发管理方案以其独特的优势&#xff0c;成为众多企业的首选。本…

(Python+selenium)UI自动化测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 我们在进行UI自动化测试时&#xff0c;一般采用javaselenium或者pythonselenium的方式。由于python比较简单&#xff0c;上手快&#xff0c;因此建议大家采用pyt…