引言

在当今的 Java 开发领域,数据库操作是一个至关重要的环节。MyBatis 作为一款优秀的持久层框架,已经被广泛应用。而 MyBatis-Plus 则是在 MyBatis 基础上进行增强的工具,它简化了开发流程,提高了开发效率。本文将详细介绍 MyBatis-Plus 的使用,结合具体的代码示例,帮助你快速上手。

环境搭建

项目创建

首先,我们使用 Spring Boot 来创建一个基础项目。这里使用 Maven 作为项目管理工具,在 pom.xml 中添加必要的依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.qcby</groupId><artifactId>Mybatis-plus</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.4</version></parent><properties><java.version>1.8</java.version> <!-- 或更高版本 --></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><!-- 注解替代 get/set 方法 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

配置数据源

在 application.yml 中配置数据库连接信息:

spring:# 配置数据源信息datasource:# 配置数据源类型type: com.zaxxer.hikari.HikariDataSource# 配置连接数据库信息driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis_plususername: rootpassword: 123456
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

实体类定义

创建一个 User 实体类,使用 Lombok 注解简化代码

package com.qcby.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;@Data
public class User {@TableId(type = IdType.AUTO)private long id;private String name;private Integer age;private String email;
}

Mapper 接口定义

定义一个 UserMapper 接口,继承 BaseMapper<User>,MyBatis-Plus 会自动为我们提供基本的增删改查方法:

package com.qcby.mapper;import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.qcby.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;@Mapper
public interface UserMapper extends BaseMapper<User> {// 插入一条记录int insert(User user);int deleteById(int id);int deleteById(User entity);int deleteByMap(@Param("columnMap") Map<String, Object> columnMap);int delete(@Param("wrapper") Wrapper<User> queryWrapper);// 删除(根据 ID 批量删除)int deleteBatchIds(@Param("collection") Collection<?> idList);// 根据 ID 修改int updateById(@Param("entity") User user);int update(@Param("entity") User user, @Param("wrapper") Wrapper<User> updateWrapper);// 查询(根据 ID 批量查询)List<User> selectBatchIds(@Param("collection") Collection<? extends Serializable> idList);// 查询(根据 columnMap 条件)List<User> selectByMap(@Param("columnMap") Map<String, Object> columnMap);// 根据 entity 条件,查询一条记录default User selectOne(@Param("wrapper") Wrapper<User> queryWrapper) {List<User> ts = this.selectList(queryWrapper);if (ts != null && !ts.isEmpty()) {if (ts.size() != 1) {throw new RuntimeException("One record is expected, but the query result is multiple records");}return ts.get(0);}return null;}// 根据 Wrapper 条件,查询总记录数Long selectCount(@Param("wrapper") Wrapper<User> queryWrapper);// 根据 entity 条件,查询全部记录List<User> selectList(@Param("wrapper") Wrapper<User> queryWrapper);// 根据 Wrapper 条件,查询全部记录List<Map<String, Object>> selectMaps(@Param("wrapper") Wrapper<User> queryWrapper);// 根据 Wrapper 条件,查询全部记录(只返回第一个字段的值)List<Object> selectObjs(@Param("wrapper") Wrapper<User> queryWrapper);// 根据 entity 条件,查询全部记录(并翻页)<P extends IPage<User>> P selectPage(P page, @Param("wrapper") Wrapper<User> queryWrapper);
}

基本操作示例

插入数据

import com.qcby.entity.User;
import com.qcby.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class MybatisPlusTest {@Autowiredprivate UserMapper userMapper;@Testpublic void testInsert() {User user = new User();user.setAge(18);user.setEmail("test@qcby.com");int insert = userMapper.insert(user);System.out.println("受影响行数:" + insert);System.out.println("id 自动获取:" + user.getId());}
}

 删除数据

@Test
public void testDelete() {int delete = userMapper.deleteById(1948707997203062787L);System.out.println(delete);
}

修改数据

@Test
public void testUpdateById() {User user = new User();user.setId(5);user.setName("test");user.setAge(18);user.setEmail("test@qcby.com");int update = userMapper.updateById(user);System.out.println(update);
}

 查询数据

@Test
public void testSelectList() {userMapper.selectList(null).forEach(System.out::println);
}

分页查询

@Test
public void testSelectPage() {// 设置分页参数,这里查询第 1 页,每页 10 条记录Page<User> page = new Page<>(1, 10);// 构建查询条件,这里查询年龄大于 16 的用户QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.gt("age", 16);// 调用 selectPage 方法进行分页查询IPage<User> userPage = userMapper.selectPage(page, queryWrapper);// 输出分页信息System.out.println("当前页码: " + userPage.getCurrent());System.out.println("每页记录数: " + userPage.getSize());System.out.println("总记录数: " + userPage.getTotal());System.out.println("总页数: " + userPage.getPages());// 输出查询结果userPage.getRecords().forEach(System.out::println);
}

总结

通过以上的介绍和示例代码,我们可以看到 MyBatis-Plus 极大地简化了数据库操作的开发流程。它提供了丰富的方法和强大的条件构造器,让我们可以更高效地完成增删改查操作。无论是小型项目还是大型项目,MyBatis-Plus 都是一个值得选择的持久层框架。希望本文能帮助你快速掌握 MyBatis-Plus 的使用,在实际开发中发挥出它的优势。

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

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

相关文章

Hive【安装 01】hive-3.1.2版本安装配置(含 mysql-connector-java-5.1.47.jar 网盘资源)

我使用的安装文件是 apache-hive-3.1.2-bin.tar.gz &#xff0c;以下内容均以此版本进行说明。 以下环境测试安装成功&#xff1a; openEuler 22.03 (LTS-SP1)系统 MySQL-8.0.40 1.前置条件 MySQL数据库 我安装的是 mysql-5.7.28 版本的&#xff0c;安装方法可参考《Linux环境…

璞致 PZSDR-P101:ZYNQ7100+AD9361 架构软件无线电平台,重塑宽频信号处理范式

璞致电子 PZSDR-P101 软件无线电平台以 "异构计算 宽频射频 工业级可靠性" 为核心设计理念&#xff0c;基于 Xilinx ZYNQ7100 处理器与 ADI AD9361 射频芯片构建&#xff0c;为工程师提供从 70MHz 到 6GHz 的全频段信号处理解决方案。无论是频谱监测、无线通信原型…

【基础】go基础学习笔记

基础及关键字if for switch都支持使用隐形声明&#xff08;:&#xff09;来快速声明一个变量&#xff0c;无需在上面一行额外声明&#xff0c;这可以增加代码简洁性&#xff0c;但不太符合其他常规语言的写法&#xff0c;需要习惯一下if for switch都不需要使用&#xff08;&am…

AI驱动的企业知识管理革新

Baklib&#xff1a;人工智能引领的知识管理平台Baklib 是领先的 AI 驱动知识管理系统&#xff0c;专为企业打造智能化、模块化的知识共享平台。功能覆盖在线帮助中心、内联网、CMS 网站、客户支持系统、视频中心、活动教学平台和客户社区&#xff0c;全面提升组织在知识管理、员…

使用 FFmpeg 实现 RTP 音频传输与播放

&#x1f50a; 使用 FFmpeg 实现 RTP 音频传输与播放&#xff08;Ubuntu&#xff09; 在音视频开发或远程通信场景中&#xff0c;RTP&#xff08;Real-time Transport Protocol&#xff09; 是一种常用的实时音频传输协议。本文将介绍如何使用 FFmpeg 在 Ubuntu 上实现从一台主…

Android 导出联系人为 vCard(.vcf)

有时需要将联系人数据导出为可共享的标准格式&#xff1a;vCard&#xff08;.vcf&#xff09;格式&#xff0c;可被系统直接导入通讯录一、导出联系人为 vCard&#xff08;.vcf&#xff09;✅ 支持字段我们支持导出的字段包括&#xff1a;姓名个人电话家庭电话工作电话邮箱备注…

大模型-bacth之chunked prefills

一、chunked prefills 1.1 chunked prefills核心思想 ORCA虽然很优秀&#xff0c;但是依然存在两个问题&#xff1a;GPU利用率不高&#xff0c;流水线依然可能导致气泡问题。 我们来看sarathi-serve做的一个实验。左右两图分别刻画了在不同的batch size下&#xff0c;prefil…

multiprocessing模块使用方法(一)

结合Python代码示例说明multiprocessing模块的使用方法、Linux启动命令、服务部署及真实应用场景&#xff1a;一、multiprocessing基础用法 Python的multiprocessing模块通过创建子进程实现并行计算&#xff0c;核心步骤如下&#xff08;引用&#xff09;&#xff1a;创建进程对…

vector如何判断应该扩容?

std::vector 的扩容机制是 C 容器性能优化的一个核心点。它的判断标准、行为特征和实现细节如下所示&#xff1a;✅ 一、vector 的核心结构 std::vector 内部维护三个指针&#xff1a; begin -> 指向数据起始位置 end -> 指向当前已使用的元素末尾&#xff08;size…

ICMP考点

在网络工程师、运维工程师、安全工程师等岗位的面试中&#xff0c;​​ICMP&#xff08;Internet Control Message Protocol&#xff0c;互联网控制报文协议&#xff09;​​ 是高频必考知识点。ICMP作为IP协议的“辅助协议”&#xff0c;虽然不直接传输用户数据&#xff0c;但…

服务器带宽具体是指什么意思?

企业在选择服务器租用或托管服务时&#xff0c;需要根据自身的业务情况来选择合适的服务器带宽&#xff0c;以便于能够让其业务持续稳定的运行工作&#xff0c;做到及时响应用户的访问请求&#xff0c;但是很多用户对于带宽一词没有过多的概念&#xff0c;本文就来探讨一下服务…

CANape之ASAP2 Studio介绍

提到ECU的测量标定工具&#xff0c;很多小伙伴第一个想到的就是CANape。但其实&#xff0c;除了强大的测量标定功能之外&#xff0c;CANape还有很多其他功能。例如&#xff0c;CANape中集成的小工具——ASAP2 Studio&#xff0c;其支持对A2L文件&#xff08;由ASAM组织所定义&a…

【debug日记】MONAI SwinUNETR 目标检测项目调试总结(AI自动总结)

MONAI SwinUNETR 目标检测项目调试总结 日期: 2025年7月25日 项目: 使用 MONAI&#xff0c;以预训练的 SwinUNETR 为骨干网络&#xff0c;微调 RetinaNet 进行3D肺结节检测。 本文档旨在记录在项目配置、数据处理和模型训练过程中遇到的一系列问题及其解决方案&#xff0c;作为…

AI同传领域,字节跳动与科大讯飞激战进行时

在AI同声传译市场&#xff0c;行业巨头科大讯飞长期占据主导地位&#xff0c;但新晋玩家字节跳动正以迅猛姿态发起挑战。7月24日&#xff0c;字节旗下火山引擎正式发布豆包同声传译模型 Seed LiveInterpret 2.0&#xff0c;主打“人类级延迟”和“0样本声音复刻”&#xff0c;试…

[C++]string::substr

string substr (size_t pos 0, size_t len npos) const;substr() 主要功能是复制&#xff08;截取更准确&#xff09;子字符串&#xff0c;要求从指定位置 pos 开始&#xff0c;并具有指定的长度 len 。如果没有指定长度或者超出了源字符串的长度&#xff0c;则子字符串将延续…

KNN算法:从原理到实战全解析

一 算法介绍 K近邻&#xff08;K-Nearest Neighbors, KNN&#xff09;是一种基于实例的监督学习算法&#xff0c;适用于分类和回归任务。其核心思想是通过计算待预测样本与训练集中样本的距离&#xff0c;选取距离最近的K个邻居&#xff0c;根据这些邻居的标签进行投票&#xf…

医疗器械:DFEMA和PFEMA

在医疗器械行业&#xff0c;DFMEA&#xff08;Design FMEA&#xff0c;设计失效模式及影响分析&#xff09;和 PFMEA&#xff08;Process FMEA&#xff0c;过程失效模式及影响分析&#xff09;是核心的风险管理工具&#xff0c;旨在通过系统性识别潜在风险、分析影响并采取预防…

Qt 与 SQLite 嵌入式数据库开发

Qt 与 SQLite 的结合是开发轻量级、跨平台嵌入式数据库应用的理想选择。SQLite 作为一种零配置、文件型数据库&#xff0c;无需独立的服务器进程&#xff0c;非常适合集成到 Qt 应用中。本文将深入探讨 Qt 与 SQLite 的嵌入式数据库开发&#xff0c;包括基础操作、高级特性、性…

Oracle OMF 非OMF 文件 转化 不需要重建 file#.incarnation#

不需要重建就要重启&#xff0c; alter database datafile move 就可以在线 file#.incarnation# 是 incarnation 不是dbid Goal How to convert non OMF files to OMF files with ASM storage Datafiles are not deleted at dropping tablespace if files are non-OMF and …

大型微服务项目:听书——11 Redisson分布式布隆过滤器+Redisson分布式锁改造专辑详情接口

11 Redisson分布式布隆过滤器Redisson分布式锁改造专辑详情接口 11.1 缓存穿透解决方案&布隆过滤器 缓存穿透解决方案&#xff1a; 布隆过滤器&#xff1a; 布隆过滤器的使用&#xff1a; 11.2 远程调用查询所有的专辑id集合 修改&#xff1a; /*** 查询所有的专辑…