引言

在开发 Java Web 应用程序时,我们经常需要进行大量的数据库操作,如创建、读取、更新和删除(CRUD)。MyBatis-Plus 作为一个强大的 MyBatis 增强工具,为我们提供了通用 Service 接口,极大地简化了这些操作。本文将详细介绍 MyBatis-Plus 通用 Service 的使用,结合具体代码示例,帮助大家更好地理解和应用。

1. 通用 Service 概述

MyBatis-Plus 的通用 Service CRUD 封装了IService接口,通过采用get查询单行、remove删除、list查询集合、page分页等前缀命名方式,进一步封装了 CRUD 操作,避免了 Mapper 层的混淆。同时,泛型T可以是任意实体对象,使得该接口具有很高的通用性。

如果我们在项目中可能存在自定义通用 Service 方法的需求,建议创建自己的IBaseService继承 MyBatis-Plus 提供的基类。官方文档地址为:[https://baomidou.com/pages/49cc81/#service-crud-接口](https://baomidou.com/pages/49cc81/#service-crud-%E6%8E%A5%E5%8F% A3)

2. 项目环境搭建

在开始之前,我们需要确保项目中已经引入了 MyBatis-Plus 的依赖。以 Maven 为例,在pom.xml中添加以下依赖:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>最新版本号</version>
</dependency>

 

3. 代码示例

3.1 定义实体类

首先,我们需要定义一个实体类User,用于表示数据库中的用户表。

package com.qcby.entity;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("user")
public class User {private Long id;private String name;private Integer age;private String email;
}

 

 

3.2 定义 Service 接口

接下来,我们定义一个UserService接口,继承自IService<User>

 

package com.qcby.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.qcby.entity.User;public interface UserService extends IService<User> {
}

3.3 实现 Service 接口

然后,我们实现UserService接口。

package com.qcby.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qcby.entity.User;
import com.qcby.mapper.UserMapper;
import com.qcby.service.UserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

 

3.4 测试 Service 方法

为了验证通用 Service 的功能,我们编写一些测试用例。

package com.qcby;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qcby.entity.User;
import com.qcby.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@SpringBootTest
public class MybatisPlusServiceTest {@Autowiredprivate UserService userService;/*** 保存单个用户*/@Testpublic void savetest(){User user = new User();user.setName("xiaoming");userService.save(user);System.out.println(user.getId());}/*** 批量保存用户*/@Testpublic void saveBatchTest(){List<User> userList = new ArrayList<>();User user1 = new User();user1.setName("xiaobai");userList.add(user1);User user2 = new User();user2.setName("xiaoli");userList.add(user2);userService.saveBatch(userList);System.out.println(userList.size());}/*** 根据ID删除用户*/@Testpublic void removeById(){userService.removeById(1949020695920902146L);}/*** 根据条件删除用户*/@Testpublic void remove(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.gt("id",6l);userService.remove(queryWrapper);}/*** 根据ID更新用户信息*/@Testpublic void updateById(){User user = new User();user.setId(1949019913414877186l);user.setName("xiaoming");user.setEmail("xiongda@qcby.com");user.setAge(18);userService.updateById(user);}/*** 根据ID查询用户信息*/@Testpublic void getById(){userService.getById(1949020696017371138L);}/*** 查询用户列表*/@Testpublic void list(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.gt("id",5l);List<User> list = userService.list(queryWrapper);System.out.println(list);}/*** 分页查询用户信息*/@Testpublic void pageNavigation() {// 创建分页对象,查询第1页,每页5条Page<User> page = new Page<>(1, 5);// 执行分页查询Page<User> resultPage = userService.page(page);// 打印分页信息System.out.println("当前页: " + resultPage.getCurrent());System.out.println("每页大小: " + resultPage.getSize());System.out.println("总记录数: " + resultPage.getTotal());System.out.println("总页数: " + resultPage.getPages());System.out.println("当前页数据: " + resultPage.getRecords());int i = 2;while(resultPage.hasNext()){System.out.println("\n=== 查询下一页 ===");page.setCurrent(i); // 设置为第i页Page<User> nextPage = userService.page(page);System.out.println("当前页: " + nextPage.getCurrent());System.out.println("当前页数据: " + nextPage.getRecords());i++;}}
}

4. 代码解释

4.1 保存操作

  • save方法用于保存单个实体对象。
  • saveBatch方法用于批量保存实体对象。

4.2 删除操作

  • removeById方法根据 ID 删除实体对象。
  • remove方法根据条件删除实体对象。

4.3 更新操作

  • updateById方法根据 ID 更新实体对象的信息。

4.4 查询操作

  • getById方法根据 ID 查询单个实体对象。
  • list方法根据条件查询实体对象列表。
  • page方法用于分页查询实体对象。

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

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

相关文章

聚类-一种无监督分类算法

目录 1、聚类任务 2、性能度量 &#xff08;1&#xff09;外部指标 &#xff08;2&#xff09;内部指标 3、具体聚类方法 &#xff08;1&#xff09;原型聚类 &#xff08;2&#xff09;密度聚类 &#xff08;3&#xff09;层次聚类 “无监督学习”(unsupervised learnin…

ES6 标签模板:前端框架的灵活利器

ES6&#xff08;ECMAScript 2015&#xff09;引入的模板字符串&#xff08;Template Literals&#xff09;为 JavaScript 开发者提供了更简洁的字符串处理方式&#xff0c;而模板字符串标签&#xff08;Tagged Template Literals&#xff09;则进一步扩展了其功能性。通过标签函…

解锁编程核心能力:深入浅出数据结构和算法

——为什么它们是你代码效率的终极武器&#xff1f; &#x1f31f; 引言&#xff1a;程序世界的基石 想象你正在建造摩天大楼&#xff1a;数据结构是钢筋骨架&#xff0c;决定建筑的结构与承重能力&#xff1b;算法则是施工蓝图&#xff0c;指导如何高效完成建造。两者结合&am…

Jenkins运行pytest时指令失效的原因以及解决办法

错误收集 Started by user 偷走晚霞的人 Running as SYSTEM Building in workspace C:\Users\Administrator\.jenkins\workspace\TestAAA [TestAAA] $ cmd /c call C:\Users\Administrator\AppData\Local\Temp\jenkins5821160869728612887.bat C:\Users\Administrator\.jenkins…

MySQL数据库本地迁移到云端完整教程

一、准备工作 安装MySQL客户端工具获取云端数据库连接信息&#xff1a; 主机地址端口号用户名密码数据库名二、本地数据库导出 mysqldump -h 127.0.0.1 -P 4406 -u root -p 数据库名 > backup.sql执行后会提示输入密码&#xff0c;完成后会在当前目录生成backup.sql文件 三、…

InvokeRepeating避免嵌套调用

InvokeRepeating嵌套这会导致指数级增长的重复调用堆叠。使用单一协程PeriodicActionRoutine替代所有InvokeRepeating避免方法间相互调用造成的堆叠如果需要多层级时间控制&#xff08;如主循环子循环&#xff09;&#xff1a;IEnumerator MultiLevelTimer() {float mainInterv…

【工具】好用的浏览器AI助手

&#x1f9e8; 一、什么是 Sider&#xff1f; Sider 是一个 Chrome 浏览器插件&#xff0c;你可以把它看作一个「网页边上的 AI 小助手」。 &#x1f5e3;️ 它就像你网页旁边的 AI 机器人&#xff0c;可以帮你回答问题、总结文章、翻译、写文案、改写内容、甚至帮你学习英文&…

C++:list(2)list的模拟实现

list的模拟实现一.list与vector1.底层结构的本质区别2.模拟实现的核心差异2.1数据存储的方式2.2 初始化的过程2.3 插入元素的操作2.4 删除元素的操作2.5 访问元素的效率3.总结二.头文件list.h1. **命名空间与模板**2. **核心数据结构**3. **构造函数**4. **模板参数设计**5. **…

【595驱动8*8点阵】2022-9-11

缘由LED点阵屏只能一次亮一列-嵌入式-CSDN问答 #include "REG52.h" sbit dsP1^0;//数据线 595的14脚 sbit shP1^1;//数据输入时钟线 595的11脚 sbit stP1^2;//输出存储器锁存时钟线 595的12脚 void QuDong595(unsigned char sj) {unsigned char aa8;while(aa--){ds…

AI总结视频以及谷歌浏览器插件安装步骤

本篇介绍用AI一键总结全网视频内容的独家方法&#xff0c;支持B站、抖音、小红书等任何平台的视频&#xff0c;提高学习效率&#xff0c;帮助一键提取视频文案、划分章节&#xff0c;还能生成双语翻译&#xff0c;这个方法直接在线总结所有视频。 一.准备工作&#xff1a; 需要…

网络协议HTTP、TCP

概述如何让数据具有自我描述性?为什么网络有层级的划分?交换机、路由器要不要阅读一个信息的头部&#xff1f;要不要阅读数据部分&#xff1f; 网卡&#xff1a;网卡可以完成帧的封装和解封装&#xff0c;工作在数据链路层。 中继器&#xff1a;中继器以比特方式将网络信号进…

Linux选择题

第12题&#xff08;多选题&#xff09;原题: 能够为逻辑卷增加容量的命令有( )。A. lvresize: 此命令可以用来调整逻辑卷的大小&#xff0c;既可以增大也可以缩小。例如&#xff0c;lvresize -L 1G /dev/vgname/lvname 会增加1GB&#xff0c;lvresize -L 10G /dev/vgname/lvnam…

使用钉钉开源api发送钉钉工作消息

在工作管理系统场景中&#xff0c;上下级和不同部门之间常常有请假&#xff0c;餐补等流程操作&#xff0c;而这些操作通常需要人员手动进行&#xff0c;这里我们引入一个钉钉的api&#xff0c;可以基于钉钉来发送工作消息通知1、导入钉钉sdk<dependency><groupId>…

拒绝SQL恐惧:用Python+pyqt打造任意Excel数据库查询系统

一、引言 在数字化转型浪潮中&#xff0c;超过76%的基层业务人员仍被困在"SQL恐惧症"的泥潭里——他们精通业务逻辑却受限于技术门槛&#xff0c;面对海量数据时只能反复请求IT部门协助。本项目通过PythonPyQt来构建基于Excel风格的查询系统&#xff0c;从而打破这种…

KubeKey安装KubeSphere、部署应用实践问题总结

使用KubeSphere的KubeKey 安装K8s 集群过程中&#xff0c;碰到了一些问题&#xff0c;现在都一一解决了&#xff0c;以此记录一下。 kubekey 安装k8s 集群报错 execute task timeout, Timeout1m error: Pipeline[CreateClusterPipeline] execute failed: Module[GreetingsModul…

基于粒子群优化的PID控制在药液流量控制系统中的应用

基于粒子群优化的PID控制在药液流量控制系统中的应用 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,觉得好请收藏。点击跳转到网站。 1. 引言 在现代工业控制系统中,精确的流量控制是许多生产过程的关键环节。本文针对药液流量控制…

不用电脑要不要关机?

1. 短时间不用&#xff08;午休、临时外出&#xff09;&#xff1a;建议「睡眠」或「休眠」睡眠&#xff1a;电脑暂停工作&#xff0c;唤醒速度快&#xff0c;耗电较少适合需要快速恢复工作的场景休眠&#xff1a;整机断电&#xff0c;唤醒速度比睡眠慢&#xff0c;但完全不耗电…

【Spring AI】SiliconFlow-硅基流动

硅基流动 https://docs.siliconflow.cn/cn/userguide/introduction

swagger基本注解@Tag、@Operation、@Parameters、@Parameter、@ApiResponse、@Schema

swagger基本注解 Tag 介绍&#xff1a;用于给接口分组&#xff0c;用途类似于为接口文档添加标签。用于&#xff1a;方法、类、接口。常用属性&#xff1a; name&#xff1a;分组的名称 RestController RequestMapping("/sysUser") Tag(name "管理员接口&quo…

Unity 实现帧率(FPS)显示功能

一、功能介绍本教程实现一个 FPS 显示脚本&#xff0c;支持 TextMeshProUGUI 组件。脚本会每秒更新一次帧率&#xff0c;并显示在 UI 上&#xff0c;便于开发和调试时观察性能变化。二、完整代码将以下代码保存为 FPS.cs 脚本&#xff1a;using UnityEngine; using TMPro;[Requ…