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

devtools/2024/12/29 1:41:06/

本篇博客将深入探讨 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 >= ?
java">    @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"
java">    @Testvoid testUpdateByQueryMapper() {//需要更新的数据User user = new User();user.setBalance(2000);//更新的条件QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username","jack");//执行更新userMapper.update(user,wrapper);}
java">    @Testvoid testUpdateByQueryMapper() {//更新的条件UpdateWrapper<User> wrapper = new UpdateWrapper<User>().set("balance",20).eq("username","Jack");//执行更新userMapper.update(null,wrapper);}

 

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

java">update user set balance = balance - 200 where id in (1,2,4);
java">    @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。

java">    @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)的余额扣减指定值。

java"><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)基于包装器构建其中条件

java">        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

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

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

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

userMapper类

java">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);
}

测试方法

java">    @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接口

java">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类

java">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 {
}

 测试类

java">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.ppmy.cn/devtools/145451.html

相关文章

《Java核心技术I》Swing的网格包布局

复杂的布局管理 网格包布局 行列大小可改变&#xff0c;先建立表格&#xff0c;合并相邻单元格&#xff0c;组件指定在格内的对齐方式。 字体选择器组件&#xff1a; 另个指定字体和字体大小的组合框两个组合框标签两个选择粗体和斜体的复选框一个显示示例字符串的文本区 将容…

【STM32】RTT-Studio中HAL库开发教程十:EC800M-4G模块使用

文章目录 一、简介二、模块测试三、OneNet物联网配置四、完整代码五、测试验证 一、简介 EC800M4G是一款4G模块&#xff0c;本次实验主要是进行互联网的测试&#xff0c;模块测试&#xff0c;以及如何配置ONENET设备的相关参数&#xff0c;以及使用STM32F4来测试模块的数据上报…

深度学习-77-大模型量化之Post Training Quantization训练后量化PTQ

文章目录 1 PTQ1.1 动态量化1.2 静态量化2 四位量化的领域2.1 GPTQ2.2 GGUF(可用CPU)2.3 定点量化技术3 参考附录1 PTQ 训练后量化 :Post-Training Quantization (PTQ),模型训练完成后进行量化。 较流行的量化技术的方法之一是post-training quantization(PTQ),是指在训练后…

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

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

【Java数据结构】LinkedList

认识LinkedList LinkedList就是一个链表&#xff0c;它也是实现List接口的一个类。LinkedList就是通过next引用将所有的结点链接起来&#xff0c;所以不需要数组。LinkedList也是以泛型的方法实现的&#xff0c;所以使用这个类都需要实例化对象。 链表分为很多种&#xff0c;比…

在【Arduino IDE】中在线下载和离线下载【ESP系列开发板的SDK】

在线下载 打开Arduino IDE&#xff0c;依次点击 文件➔首选项➔其他开发板管理器地址&#xff0c;复制粘贴以下的开发板管理地址&#xff1a; https://arduino.me/packages/esp8266.json https://git.oschina.net/dfrobot/FireBeetle-ESP32/raw/master/package_esp32_index.j…

OpenEuler 22.03 安装 flink-1.17.2 集群

零&#xff1a;规划 本次计划安装三台OpenEuler 22.03 版本操作系统的服务器&#xff0c;用于搭建 flink 集群。这里使用flink1.17.2 的原因&#xff0c;是便于后续与springboot的整合 服务器名IP地址作用其他应用flink01192.168.159.133主jdk11、flink-1.17.2flink02192.168.…

C++map、set

1.引言 不同于之前介绍过的string、vector、list、deque、等容器&#xff0c;它们在逻辑结构上是线性的&#xff0c;并且两个位置存储的值之间没有紧密的关联&#xff0c;比如说交换或修改一下&#xff0c;还是原来的容器结构&#xff1b;今天要介绍的map和set在逻辑结构上是非…