Spring Boot与MyBatis-Plus的高效集成
Spring Boot与MyBatis-Plus的高效集成
引言
在现代 Java 开发中,MyBatis-Plus 作为 MyBatis 的增强工具,以其简化 CRUD 操作和无需编写 XML 映射文件的特点,受到了开发者的青睐。本篇文章将带你一步步整合 Spring Boot 与 MyBatis-Plus,并展示其在实际开发中的应用,包括事务管理、安全性考虑、性能优化等高级特性。

环境准备
1.1 导入依赖
在 pom.xml 文件中添加 MyBatis-Plus 的起步依赖:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version>
</dependency>
确保使用 Maven Helper 插件检查依赖冲突。
1.2 修改配置文件
在 application.yml 中配置数据库连接和 MyBatis-Plus 参数:
server:port: 8889
spring:datasource:url: jdbc:mysql://localhost:3306/boot_mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=Trueusername: rootpassword: 123456
mybatis-plus:mapper-locations: mapper/*.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: truetype-aliases-package: com.example.demo.entity
1.3 IUser 实体类
定义 IUser 实体类,映射数据库中的用户表:
@Data
@TableName("t_user")
public class IUser {@TableId(value = "u_id", type = IdType.AUTO)private Integer uId;@TableField("user_name")private String userName;private String email;private String passWord;private Date birth;private int gender;
}
1.4 UserMapper 接口
创建 UserMapper 接口,继承 BaseMapper:
@Mapper
public interface IUserMapper extends BaseMapper<IUser> {}
使用
2.1 基础增删改查
新增一条 User 数据
@Autowired
private IUserMapper userMapper;@Test
public void insertUser() {IUser user = new IUser();user.setUserName("曹操");user.setPassWord("88888888");user.setEmail("321@qin.com");userMapper.insert(user);
}
根据条件删除 User
@Test
public void deleteUserById() {userMapper.deleteById(1001);
}
2.2 批量操作
批量新增
@Test
public void batchInsertUsers() {List<IUser> users = Arrays.asList(new IUser().setUserName("关羽").setPassWord("258"),new IUser().setUserName("关公").setPassWord("7530"),new IUser().setUserName("关项").setPassWord("159"));userMapper.insertBatch(users);
}
2.3 查询条件构造器【QueryWrapper】使用
使用 QueryWrapper 构造查询条件:
@Test
public void selectUsersByQueryWrapper() {QueryWrapper<IUser> queryWrapper = new QueryWrapper<>();queryWrapper.eq("user_name", "项羽").like("email", "123@163.com");userMapper.selectList(queryWrapper);
}
2.4 修改条件构造器【UpdateWrapper】使用
使用 UpdateWrapper 构造更新条件:
@Test
public void updateUserByUpdateWrapper() {UpdateWrapper<IUser> updateWrapper = new UpdateWrapper<>();updateWrapper.eq("user_name", "王小五").set("email", "wxw@qq.com");userMapper.update(null, updateWrapper);
}
2.5 事务管理
事务的配置
在服务层方法上使用 @Transactional 注解来确保操作的原子性。
@Service
public class UserService {@Autowiredprivate IUserMapper userMapper;@Transactionalpublic void updateUserAndSendEmail(String userName, String newEmail) {// 更新用户信息IUser user = new IUser();user.setUserName(userName);user.setEmail(newEmail);userMapper.updateById(user);// 发送邮件操作(示例)sendEmailToUser(userName, newEmail);}private void sendEmailToUser(String userName, String email) {// 邮件发送逻辑}
}
事务的传播行为
Spring 支持多种事务传播行为,可以根据业务需求配置。
2.6 安全性考虑
防止 SQL 注入
MyBatis-Plus 通过预编译的语句防止 SQL 注入。
数据加密
在应用层对敏感数据进行加密,比如用户密码的存储和验证。
public class SecurityUtils {public static String encryptPassword(String password) {// 加密密码逻辑}public static boolean checkPassword(String rawPassword, String encryptedPassword) {// 验证密码逻辑}
}
代码生成器

3.1 准备项目和数据库表
准备一个 Spring Boot 空项目,并创建数据库表:
CREATE TABLE `t_user` (`u_id` int NOT NULL AUTO_INCREMENT COMMENT '主键',`user_name` varchar(10) NOT NULL COMMENT '用户登录名',`email` varchar(50) DEFAULT NULL COMMENT '邮箱',`pass_word` varchar(30) NOT NULL COMMENT '密码',...PRIMARY KEY (`u_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
3.2 引入依赖
在 pom.xml 中添加代码生成器的依赖:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.4.0</version>
</dependency>
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.0</version>
</dependency>
3.3 配置文件
在 application.yml 中配置数据库连接:
spring:datasource:url: jdbc:mysql://localhost:3306/generate?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=Trueusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver
3.4 测试工具类
创建一个测试工具类,用于自动生成代码:
public class CodeGenerator {public static void main(String[] args) {AutoGenerator mpg = new AutoGenerator();mpg.setDataSource(new DataSourceConfig.Builder().setUrl("jdbc:mysql://localhost:3306/generate?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=True").setDriverName("com.mysql.cj.jdbc.Driver").setUsername("root").setPassword("123456").build());mpg.setGlobalConfig(new GlobalConfig.Builder().setOutputDir(System.getProperty("user.dir") + "/src/main/java").setAuthor("Your Name").setOpen(false).build());mpg.setPackageInfo(new PackageConfig.Builder().setParent("com.example.demo").setEntity("entity").setMapper("mapper").setService("service").setController("controller").build());mpg.setStrategy(new StrategyConfig.Builder().setInclude("t_user").build());mpg.execute();}
}
3.5 生成目录结构
运行上述测试工具类,生成项目的目录结构。
3.6 调整和测试
调整生成的 Mapper XML 文件位置,并在 Mapper 接口上添加 @Mapper 注解。在启动类上添加 @MapperScan 注解。然后进行测试,例如新增一个用户:
@Autowired
private TUserMapper userMapper;@Test
public void testInsertUser() {TUser user = new TUser();user.setUserName("王中王");user.setPassWord("wzw123456");userMapper.insert(user);
}
总结与学习成果
本篇文章,您将能够获得以下知识和技能:
-
环境搭建:您将学会如何在 Spring Boot 项目中引入 MyBatis-Plus,并配置必要的依赖和数据库连接。
-
实体类与Mapper接口:您将了解如何创建实体类来映射数据库表,以及如何定义 Mapper 接口来操作数据库。
-
CRUD操作:您将掌握使用 MyBatis-Plus 进行基础的增删改查操作,包括单条记录和批量操作的处理。
-
条件构造器:您将学会使用 QueryWrapper 和 UpdateWrapper 来构建复杂的查询和更新条件,提高代码的可读性和维护性。
-
事务管理:您将了解如何在服务层方法上使用
@Transactional注解来确保数据库操作的原子性。 -
安全性实践:您将学到如何防止 SQL 注入攻击,并对敏感数据进行加密处理,增强应用的安全性。
-
性能优化:您将探索查询优化技巧和缓存策略,以提高数据库操作的性能。
-
版本兼容性与迁移:您将了解不同版本的 MyBatis-Plus 之间的差异,并学会如何将旧版本迁移到新版本。
-
实际应用场景:您将通过实际案例分析,了解 MyBatis-Plus 在解决实际问题中的应用。
-
监控与日志:您将学会如何配置和使用 MyBatis-Plus 的日志记录功能,以及如何监控数据库操作的性能。
-
代码生成器:您将掌握如何使用 MyBatis-Plus 提供的代码生成器来快速生成项目代码,提高开发效率。
通过这些内容,您不仅能够深入了解 MyBatis-Plus 的强大功能,还能够将这些知识应用到实际项目中,提升您的开发能力和项目质量。希望这篇文章能够帮助您在 Spring Boot 和 MyBatis-Plus 的学习之路上更进一步。
你掌握了那些或遇到那些问题,欢迎评论留言进行讨论!!!
相关文章:
Spring Boot与MyBatis-Plus的高效集成
Spring Boot与MyBatis-Plus的高效集成 引言 在现代 Java 开发中,MyBatis-Plus 作为 MyBatis 的增强工具,以其简化 CRUD 操作和无需编写 XML 映射文件的特点,受到了开发者的青睐。本篇文章将带你一步步整合 Spring Boot 与 MyBatis-Plus&…...
【Unity ShaderGraph实现流体效果之Function入门】
Unity ShaderGraph实现流体效果之Node入门(一) 前言Shader Graph NodePosition NodeSplit NodeSubtract NodeBranch Node 总结 前言 Unity 提供的Shader Graph在很大程度上简化了开发者对于编写Shader的工作,只需要拖拽即可完成一个视觉效果…...
Spark RDD sortBy算子执行时进行数据 “采样”是什么意思?
一、sortBy 和 RangePartitioner sortBy 在 Spark 中会在执行排序时采用 rangePartitioner 进行分区,这会影响数据的分区方式,并且这一步骤是通过对数据进行 “采样” 来计算分区的范围。不过,重要的是,sortBy 本身仍然是一个 tr…...
React-useRef与DOM操作
#题引:我认为跟着官方文档学习不会走歪路 ref使用 组件重新渲染时,react组件函数里的代码会重新执行,返回新的JSX,当你希望组件“记住”某些信息,但又不想让这些信息触发新的渲染时,你可以使用ref&#x…...
Mistral AI 发布 Pixtral Large 模型:多模态时代的开源先锋
Mistral AI 最新推出的 Pixtral Large 模型,带来了更强的多模态能力。作为一款开源的多模态模型,它不仅在参数量上达到 1240 亿,更在文本和图像理解上实现了质的飞跃。 模型亮点 1. 多模态能力再升级 Pixtral Large 配备了 123B 参数的解码器…...
Windows、Linux多系统共享蓝牙设备
Windows、Linux多系统共享蓝牙设备 近来遇到一个新问题,就是双系统共享蓝牙鼠标。因为一直喜欢在Windows、Linux双系统之间来回切换,而每次切换系统蓝牙就必须重新配对,当然,通过网络成功解决了问题。 通过这个问题,稍…...
C语言 | Leetcode C语言题解之第564题寻找最近的回文数
题目: 题解: #define MAX_STR_LEN 32 typedef unsigned long long ULL;void reverseStr(char * str) {int n strlen(str);for (int l 0, r n-1; l < r; l, r--) {char c str[l];str[l] str[r];str[r] c;} }ULL * getCandidates(const char * n…...
wsl虚拟机中的dockers容器访问不了物理主机
1 首先保证wsl虚拟机能够访问宿主机IP地址,wsl虚拟机通过vEthernet (WSL)的地址访问,着意味着容器也要通过此IP地址访问物理主机。 2 遇到的问题:wsl虚拟机中安装了docker,用在用到docker容器内的开发环境,但是虚拟机…...
Spark RDD 的宽依赖和窄依赖
通俗地理解 Spark RDD 的 宽依赖 和 窄依赖,可以通过以下比喻和解释: 1. 日常生活比喻 假设你在管理多个团队完成工作任务: 窄依赖:每个团队只需要关注自己的分工,完成自己的任务。例如,一个人将纸张折好&…...
二进制转十进制
解题思路分析 二进制转十进制原理:二进制数转换为十进制数的基本原理是按位权展开相加。对于一个二进制数,从右往左每一位的位权依次是将每一位上的数字(0 或 1)乘以其对应的位权,然后把所有结果相加,就得…...
深度学习:神经网络中的非线性激活的使用
深度学习:神经网络中的非线性激活的使用 在神经网络中,非线性激活函数是至关重要的组件,它们使网络能够捕捉和模拟输入数据中的复杂非线性关系。这些激活函数的主要任务是帮助网络解决那些无法通过简单的线性操作(如权重相乘和偏…...
Python缓存:两个简单的方法
缓存是一种用于提高应用程序性能的技术,它通过临时存储程序获得的结果,以便在以后需要时重用它们。 在本文中,我们将学习Python中的不同缓存技术,包括functools模块中的 lru_cache和 cache装饰器。 简单示例:Python缓…...
原生微信小程序在顶部胶囊左侧水平设置自定义导航兼容各种手机模型
无论是在什么手机机型下,自定义的导航都和右侧的胶囊水平一条线上。如图下 以上图iphone12,13PRo 以上图是没有带黑色扇帘的机型 以下是调试器看的wxml的代码展示 注意:红色阔里的是自定义导航(或者其他的logo啊,返回之…...
经验笔记:远端仓库和本地仓库之间的连接(以Gitee为例)
经验笔记:远端仓库和本地仓库之间的连接 方法一:先创建远端仓库,再克隆到本地 创建远端仓库 登录到你的Git托管平台(如Gitee、GitHub、GitLab、Bitbucket等)。点击“New Repository”或类似按钮,创建一个新…...
利用RAGflow和LM Studio建立食品法规问答系统
前言 食品企业在管理标准、法规,特别是食品原料、特殊食品法规时,难以通过速查法规得到准确的结果。随着AI技术的发展,互联网上出现很多AI知识库的解决方案。 经过一轮测试,找到问题抓手、打通业务底层逻辑、对齐行业颗粒度、沉…...
ffplay音频SDL播放处理
1、从解码数组获取到解码后的数据 static int audio_decode_frame(VideoState *is) {int data_size, resampled_data_size;av_unused double audio_clock0;int wanted_nb_samples;Frame *af;if (is->paused)return -1;//音频数组队列获取数据do { #if defined(_WIN32)while …...
自动化仪表故障排除法
自动化仪表主要是指在企业的实际生产工程当中,开展检测、控制、执行以及显示等一系列仪表的总称。合理地利用自动化仪表能够及时地掌握企业生产的动态,并获取相应的数据,从而推动生产过程的有序运行。 在自动化控制系统中,自动化…...
WPF 中 MultiConverter ——XAML中复杂传参方式
1. XAML代码 <!-- 数据库表格 --> <!-- RowHeaderWidth"0": 把默认的行表头隐藏 --> <DataGridx:Name"xDataGrid"Grid.Row"2"hc:DataGridAttach.ShowRowNumber"True"ItemsSource"{Binding WaferInfos, ModeT…...
实验室管理现代化:Spring Boot技术方案
4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…...
aws凭证(一)凭证存储
AWS 凭证用于验证身份,并授权对 DynamoDB 等等 AWS 服务的访问。配置了aws凭证后,才可以通过编程方式或从AWS CLI连接访问AWS资源。凭证存储在哪里呢?有以下几个方法: 一、使用文件存储 1、介绍 文件存储适用于长期和多账户配置。AWS SDK 也会自动读取配置文件中的凭证。…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
