MyBatis-Plus核心功能详解:条件构造器、自定义SQL与Service接口
在Java的Web开发中,MyBatis-Plus作为MyBatis的增强工具,提供了许多实用的功能,极大地简化了数据库操作的开发过程。下面,我们将详细探讨MyBatis-Plus的三大核心功能:条件构造器、自定义SQL以及Service接口。
一、条件构造器
条件构造器(Wrapper)是MyBatis-Plus中的一个重要功能,它使得我们能够以面向对象的方式构建SQL查询条件,而无需手动拼接SQL语句。这不仅提高了代码的可读性和可维护性,还降低了出错的可能性。
MyBatis-Plus的条件构造器主要包括Wrapper、QueryWrapper和UpdateWrapper三个类。其中,Wrapper是一个抽象类,QueryWrapper和UpdateWrapper分别是它的两个实现类。QueryWrapper用于构建查询条件,而UpdateWrapper则用于构建更新条件。
在QueryWrapper中,我们可以使用各种方法来添加查询条件,如eq(等于)、ne(不等于)、gt(大于)、lt(小于)等。这些方法都接受两个参数:字段名和字段值。通过这些方法,我们可以轻松地构建出各种复杂的查询条件。
此外,QueryWrapper还支持使用lambda表达式来构建查询条件。这可以进一步简化代码,并提高代码的可读性。例如,我们可以使用lambda表达式来指定字段名,而无需手动拼写字段名的字符串。
条件构造器(Wrapper)允许我们以面向对象的方式构建SQL查询条件。以下是一个使用QueryWrapper的示例:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> selectUsersByNameAndAge(String name, Integer age) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); if (name != null) { queryWrapper.eq("name", name); } if (age != null) { queryWrapper.eq("age", age); } return userMapper.selectList(queryWrapper); } // 使用Lambda表达式的方式 public List<User> selectUsersByLambda(String name, Integer age) { QueryWrapper<User> lambdaQueryWrapper = new QueryWrapper<User>().lambda(); if (name != null) { lambdaQueryWrapper.eq(User::getName, name); } if (age != null) { lambdaQueryWrapper.eq(User::getAge, age); } return userMapper.selectList(lambdaQueryWrapper); } }
在上面的示例中,我们定义了一个UserService类,并在其中注入了UserMapper。selectUsersByNameAndAge方法使用传统的字段名字符串来构建查询条件,而selectUsersByLambda方法则使用Lambda表达式来指定字段,这种方式更加类型安全且易于阅读。
案例
(1)基于QueryWrapper的查询
@Testvoid testQueryWrapper() {//1.构造查询条件QueryWrapper<User> wrapper = new QueryWrapper<User>().select("id", "username", "info", "balance").like("username", "o").ge("balance", 1000);//2.查询List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}
@Testvoid testUpdateByQueryWrapper() {//1.要更新的数据User user = new User();user.setBalance(2000);//2.更新的条件QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username","jack");//3.执行更新userMapper.update(user,wrapper);}
(2)基于UpdateWrapper的更新
@Testvoid testUpdateWrapper() {List<Long> ids = List.of(1L,2L,4L);UpdateWrapper<User> wrapper = new UpdateWrapper<User>().setSql("balance = blance - 200").in("id",ids);userMapper.update(null,wrapper);}
(3)基于Lambda的格式
@Testvoid testLambdaQueryWrapper() {//1.构造查询条件LambdaQueryWrapper<User> wrapper = new QueryWrapper<User>().lambda().select(User::getId, User::getUsername, User::getInfo, User::getBalance).like(User::getUsername, "o").ge(User::getBalance, 1000);//2.查询List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}
二、自定义SQL
虽然MyBatis-Plus提供了丰富的CRUD操作功能,但在某些特殊场景下,我们仍然需要编写自定义的SQL语句。MyBatis-Plus允许我们在Mapper接口中直接编写自定义的SQL语句,并通过注解或XML文件的方式指定。
在Mapper接口中,我们可以使用MyBatis提供的注解来定义SQL语句,如@Select、@Insert、@Update和@Delete等。这些注解可以接受一个SQL语句作为参数,该SQL语句将被直接执行。通过这种方式,我们可以轻松地实现自定义的数据库操作。
除了使用注解外,我们还可以使用XML文件来定义SQL语句。在XML文件中,我们可以编写完整的SQL语句,并通过命名空间(namespace)和ID来标识不同的SQL语句。然后,在Mapper接口中,我们可以使用@Mapper注解来指定XML文件的位置,并通过方法名来引用XML文件中的SQL语句。
案例:
自定义SQL
① 基于Wrapper构建Where条件
@Testvoid testCustomSqlUpdate() {//1.更新条件List<Long> ids = List.of(1L,2L,4L);int amount = 200;//2.定义条件LambdaQueryWrapper<User> wrapper = new QueryWrapper<User>().lambda().in(User::getId,ids);//3.调用自定义SQL方法userMapper.updateBalanceByIds(wrapper,amount);}
② 在mppper方法参数中用Param注解声明的wrapper变量名称,必须是ew
public interface UserMapper extends BaseMapper<User> {void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);}
③ 自定义SQL,并使用Wrapper条件
<update id="updateBalanceByIds">update userset balance = balance - #{amount} ${ew.customSqlSegment}</update>
三、Service接口
Service接口是MyBatis-Plus中用于封装业务逻辑的接口。在Service接口中,我们可以定义与业务相关的方法,并调用Mapper接口中的方法来执行数据库操作。通过Service接口,我们可以将业务逻辑与数据访问逻辑进行分离,使得代码更加清晰和易于维护。
在MyBatis-Plus中,我们通常会创建一个与Mapper接口相对应的Service接口,并在Service接口中实现具体的业务逻辑。Service接口的实现类需要继承MyBatis-Plus提供的ServiceImpl类,并注入Mapper接口的实例。通过这种方式,我们可以轻松地访问Mapper接口中的方法,并执行相应的数据库操作。
除了基本的CRUD操作外,Service接口还可以实现更加复杂的业务逻辑,如数据校验、事务控制等。这些业务逻辑可以在Service接口的实现类中进行编写和封装,以便于在其他地方进行调用和使用。
IService是MyBatis-Plus提供的一个通用Service接口,它包含了基本的CRUD操作。例如:
@Servicepublic interface UserService extends IService<User> {}
实现类
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}
在上述代码中,IUserService接口继承了IService<User>
接口,表示它是一个通用的User业务处理接口。除了继承自IService的CRUD方法外,我们还可以根据业务需求在UserService接口中添加自定义的业务方法。
IService接口的实现类(如UserServiceImpl)通常由MyBatis-Plus自动生成,我们只需要继承它并实现自定义的业务方法即可。
测试
@SpringBootTestpublic class IUserServiceTest {@Autowiredprivate UserService userService;@Testvoid testSaveUser(){User user = new User();user.setId(6L);user.setUsername("Lucy");user.setPassword("123");user.setPhone("18688990011");user.setBalance(200);user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());userService.save(user);}}
MyBatis-Plus作为MyBatis的增强工具,提供了丰富的核心功能,包括条件构造器、自定义SQL以及Service接口等。这些功能使得我们在进行Java持久层开发时更加高效和便捷。通过合理地使用这些功能,我们可以提高开发效率,减少错误率,并提升代码的可维护性和可扩展性。
相关文章:

MyBatis-Plus核心功能详解:条件构造器、自定义SQL与Service接口
在Java的Web开发中,MyBatis-Plus作为MyBatis的增强工具,提供了许多实用的功能,极大地简化了数据库操作的开发过程。下面,我们将详细探讨MyBatis-Plus的三大核心功能:条件构造器、自定义SQL以及Service接口。 一、条件…...

莆田市C++专项选拔第二轮题4
题4:变换阵型 【题目描述】 盛隆同学刚学完C的二维数组和函数部分,于是他自己写了2个函数对二维数组进行练习。两个函数如下: int n, a[1005][1005]; // 注意,这里的n和数组a是全局变量 void f1() {for (int i 1; i < n; i)…...
AtCoder Regular Contest 177
A - Excange 题意 用这些零钱能否不找零地买这些物品 思路 因为 500 5 100 10 50 50 10 500 1 5005\times 10010\times 5050\times 10500\times 1 5005100105050105001。 所以说,我们这道题可以采用贪心算法,优先取大的减去目前零钱最大的…...

【C++】 C++ 编写 鸡兔同笼程序
文章目录 “鸡兔同笼”问题是一个经典的数学问题,要求根据总头数和总腿数来计算鸡和兔的数量。假设鸡有 2 条腿,兔有 4 条腿。可以通过以下步骤求解这个问题: 1 .设鸡的数量为 x,兔的数量为 y。2.根据题意,我们有以下…...

[动画详解]LeetCode151.翻转字符串里的单词
💖💖💖欢迎来到我的博客,我是anmory💖💖💖 又和大家见面了 欢迎来到动画详解LeetCode算法系列 用通俗易懂的动画让算法题不再神秘 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成…...

如何使用 ArcGIS Pro 制作地震动画
在做某些汇报的时候,除了图文,如果有动画肯定会成为加分项,这里为大家介绍一下如何使用 ArcGIS Pro 制作地震动画,希望能对你有所帮助。 添加时间 在图层属性内,选择时间选项卡,图层时间选择每个要素具有…...
Unity 初步了解
1.Unity 是啥 Unity是一个实时3D互动内容创作和运营平台。它可以帮助游戏开发、美术、建筑、汽车设计、影视等行业的创作者将创意变为现实。Unity平台提供了一套完善的软件解决方案,用于创作、运营和变现任何实时互动的2D和3D内容,支持的平台包括手机、…...

爬虫学习(4)每日一笑
代码 import requests import re import osif __name__ "__main__":if not os.path.exists("./haha"):os.makedirs(./haha)url https://mlol.qt.qq.com/go/mlol_news/varcache_article?docid6321992422382570537&gameid3&zoneplat&webview…...
生产环境节点扩容方案
datanode节点扩缩容(1人天) 注意:新增节点需要走商务,节点扩容需要申请新的license 制品包下载 #内网下载(环境检查脚本) wget --user=admin --password=Y!bC2hx0TN@21cal http://10.69.71.180:8082/artifactory/product/qiudongyang/precheck/os-check20221127.tar…...
Spring线程池配置
配置Spring线程池,特别是ThreadPoolTaskExecutor,通常涉及设置一些关键参数以控制线程池的行为和性能。以下是一些基本的配置步骤: 定义配置类 首先,需要创建一个配置类,使用@Configuration注解标记,并启用异步执行功能,使用@EnableAsync注解。 @Configuration @Enab…...
Unity学习笔记---物理引擎
RigidBody 刚体 1,Gravity Scale 重力参数,是一个乘量参数,调整为0则不受重力影响。 2,Sleeping Mode 睡眠模式,分为永不睡眠/开始时睡眠/开始时不睡眠3种。如需要一直碰撞检测可以选择永不睡眠。 BoxCollider 碰撞…...
Vue与Java使用AES加密与解密
CBC模式(通过偏移值进行加密,更具安全性) 一、VUE: 1、安装 npm install crypto-js 2、编写公用js(在common文件夹下创建一个crypto.js) 注意:key最少要有16个字符,iv最少6个字符…...

B/S版+java开发的医院绩效考核系统maven+Visual Studio Code 医院绩效考核管理系统 提升医疗服务质量的关键
B/S版java开发的医院绩效考核系统mavenVisual Studio Code 医院绩效考核管理系统 提升医疗服务质量的关键 医院绩效评价系统的建设,优化医院绩效管理体系,规范化工作目标的设计、沟通、评价与反馈,改进和提供医院管理人员的管理能力和成效&am…...

汇昌联信科技:拼多多电商的运营流程有哪些?
在当今互联网高速发展的时代,电商平台层出不穷,其中拼多多以其独特的团购模式和低价策略迅速崛起,成为众多消费者和商家的新宠。那么,拼多多电商的运营流程究竟包含哪些环节呢?接下来,我们将从商品上架、营销推广、订…...

AI大模型探索之路-训练篇20:大语言模型预训练-常见微调技术对比
系列篇章💥 AI大模型探索之路-训练篇1:大语言模型微调基础认知 AI大模型探索之路-训练篇2:大语言模型预训练基础认知 AI大模型探索之路-训练篇3:大语言模型全景解读 AI大模型探索之路-训练篇4:大语言模型训练数据集概…...
现代 c++ 一:c++11 ~ c++23 新特性汇总
所谓现代 c,指的是从 c11 开始的 c,从 c11 开始,加入一些比较现代的语言特性和改进了的库实现,使得用 c 开发少了很多心智负担,程序也更加健壮,“看起来像一门新语言”。 从 c11 开始,每 3 年发…...

【c++】全面理解C++多态:虚函数表深度剖析与实践应用
🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,通过本篇文章,来详细理解多态的内容 目录 1.多态的定义及实现1.1多态的构成条件1.2虚函数的重写1.3 C11 override 和 final1.4重载、覆盖(重写)、隐藏…...

分享四种免费获取SSL的方式
SSL证书目前需要部署安装的网站很多,主要还是基于国内目前对证书的需求度在不断的升高,网站多了、服务器多了之后。网络安全问题就成为了大家不得不面对的一个重要的问题了。SSL证书的作用有很多,这里就不一一详述了,本期作品主要…...
2024.5.14晚训题解
非线性结构没懂的同学多去看看课程回放。 A题Overall Winner 题解 很基础的题目,输入字符串,用计数器去统计一下就好了。 因为赢的次数一样的时候优先判断前面的那个人赢,所以说两个人赢的次数相同的时候我们不必 去记录胜者。 #include<…...
jQuery的选择器与自带函数详解
在前端开发中,jQuery是一个广泛使用的JavaScript库,它极大地简化了HTML文档遍历、事件处理、动画以及AJAX交互等操作。本文将通过一个示例页面,详细介绍jQuery的选择器和一些常用的自带函数。 示例代码优化 首先,我们来优化和完…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...

高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...
起重机起升机构的安全装置有哪些?
起重机起升机构的安全装置是保障吊装作业安全的关键部件,主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理: 一、超载保护装置(核心安全装置) 1. 起重量限制器 功能:实时监测起升载荷&a…...