当前位置: 首页 > news >正文

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

总结与学习成果

本篇文章,您将能够获得以下知识和技能:

  1. 环境搭建:您将学会如何在 Spring Boot 项目中引入 MyBatis-Plus,并配置必要的依赖和数据库连接。

  2. 实体类与Mapper接口:您将了解如何创建实体类来映射数据库表,以及如何定义 Mapper 接口来操作数据库。

  3. CRUD操作:您将掌握使用 MyBatis-Plus 进行基础的增删改查操作,包括单条记录和批量操作的处理。

  4. 条件构造器:您将学会使用 QueryWrapper 和 UpdateWrapper 来构建复杂的查询和更新条件,提高代码的可读性和维护性。

  5. 事务管理:您将了解如何在服务层方法上使用 @Transactional 注解来确保数据库操作的原子性。

  6. 安全性实践:您将学到如何防止 SQL 注入攻击,并对敏感数据进行加密处理,增强应用的安全性。

  7. 性能优化:您将探索查询优化技巧和缓存策略,以提高数据库操作的性能。

  8. 版本兼容性与迁移:您将了解不同版本的 MyBatis-Plus 之间的差异,并学会如何将旧版本迁移到新版本。

  9. 实际应用场景:您将通过实际案例分析,了解 MyBatis-Plus 在解决实际问题中的应用。

  10. 监控与日志:您将学会如何配置和使用 MyBatis-Plus 的日志记录功能,以及如何监控数据库操作的性能。

  11. 代码生成器:您将掌握如何使用 MyBatis-Plus 提供的代码生成器来快速生成项目代码,提高开发效率。

通过这些内容,您不仅能够深入了解 MyBatis-Plus 的强大功能,还能够将这些知识应用到实际项目中,提升您的开发能力和项目质量。希望这篇文章能够帮助您在 Spring Boot 和 MyBatis-Plus 的学习之路上更进一步。

你掌握了那些或遇到那些问题,欢迎评论留言进行讨论!!!

相关文章:

Spring Boot与MyBatis-Plus的高效集成

Spring Boot与MyBatis-Plus的高效集成 引言 在现代 Java 开发中&#xff0c;MyBatis-Plus 作为 MyBatis 的增强工具&#xff0c;以其简化 CRUD 操作和无需编写 XML 映射文件的特点&#xff0c;受到了开发者的青睐。本篇文章将带你一步步整合 Spring Boot 与 MyBatis-Plus&…...

【Unity ShaderGraph实现流体效果之Function入门】

Unity ShaderGraph实现流体效果之Node入门&#xff08;一&#xff09; 前言Shader Graph NodePosition NodeSplit NodeSubtract NodeBranch Node 总结 前言 Unity 提供的Shader Graph在很大程度上简化了开发者对于编写Shader的工作&#xff0c;只需要拖拽即可完成一个视觉效果…...

Spark RDD sortBy算子执行时进行数据 “采样”是什么意思?

一、sortBy 和 RangePartitioner sortBy 在 Spark 中会在执行排序时采用 rangePartitioner 进行分区&#xff0c;这会影响数据的分区方式&#xff0c;并且这一步骤是通过对数据进行 “采样” 来计算分区的范围。不过&#xff0c;重要的是&#xff0c;sortBy 本身仍然是一个 tr…...

React-useRef与DOM操作

#题引&#xff1a;我认为跟着官方文档学习不会走歪路 ref使用 组件重新渲染时&#xff0c;react组件函数里的代码会重新执行&#xff0c;返回新的JSX&#xff0c;当你希望组件“记住”某些信息&#xff0c;但又不想让这些信息触发新的渲染时&#xff0c;你可以使用ref&#x…...

Mistral AI 发布 Pixtral Large 模型:多模态时代的开源先锋

Mistral AI 最新推出的 Pixtral Large 模型&#xff0c;带来了更强的多模态能力。作为一款开源的多模态模型&#xff0c;它不仅在参数量上达到 1240 亿&#xff0c;更在文本和图像理解上实现了质的飞跃。 模型亮点 1. 多模态能力再升级 Pixtral Large 配备了 123B 参数的解码器…...

Windows、Linux多系统共享蓝牙设备

Windows、Linux多系统共享蓝牙设备 近来遇到一个新问题&#xff0c;就是双系统共享蓝牙鼠标。因为一直喜欢在Windows、Linux双系统之间来回切换&#xff0c;而每次切换系统蓝牙就必须重新配对&#xff0c;当然&#xff0c;通过网络成功解决了问题。 通过这个问题&#xff0c;稍…...

C语言 | Leetcode C语言题解之第564题寻找最近的回文数

题目&#xff1a; 题解&#xff1a; #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地址&#xff0c;wsl虚拟机通过vEthernet (WSL)的地址访问&#xff0c;着意味着容器也要通过此IP地址访问物理主机。 2 遇到的问题&#xff1a;wsl虚拟机中安装了docker&#xff0c;用在用到docker容器内的开发环境&#xff0c;但是虚拟机…...

Spark RDD 的宽依赖和窄依赖

通俗地理解 Spark RDD 的 宽依赖 和 窄依赖&#xff0c;可以通过以下比喻和解释&#xff1a; 1. 日常生活比喻 假设你在管理多个团队完成工作任务&#xff1a; 窄依赖&#xff1a;每个团队只需要关注自己的分工&#xff0c;完成自己的任务。例如&#xff0c;一个人将纸张折好&…...

二进制转十进制

解题思路分析 二进制转十进制原理&#xff1a;二进制数转换为十进制数的基本原理是按位权展开相加。对于一个二进制数&#xff0c;从右往左每一位的位权依次是将每一位上的数字&#xff08;0 或 1&#xff09;乘以其对应的位权&#xff0c;然后把所有结果相加&#xff0c;就得…...

深度学习:神经网络中的非线性激活的使用

深度学习&#xff1a;神经网络中的非线性激活的使用 在神经网络中&#xff0c;非线性激活函数是至关重要的组件&#xff0c;它们使网络能够捕捉和模拟输入数据中的复杂非线性关系。这些激活函数的主要任务是帮助网络解决那些无法通过简单的线性操作&#xff08;如权重相乘和偏…...

Python缓存:两个简单的方法

缓存是一种用于提高应用程序性能的技术&#xff0c;它通过临时存储程序获得的结果&#xff0c;以便在以后需要时重用它们。 在本文中&#xff0c;我们将学习Python中的不同缓存技术&#xff0c;包括functools模块中的 lru_cache和 cache装饰器。 简单示例&#xff1a;Python缓…...

原生微信小程序在顶部胶囊左侧水平设置自定义导航兼容各种手机模型

无论是在什么手机机型下&#xff0c;自定义的导航都和右侧的胶囊水平一条线上。如图下 以上图iphone12&#xff0c;13PRo 以上图是没有带黑色扇帘的机型 以下是调试器看的wxml的代码展示 注意&#xff1a;红色阔里的是自定义导航&#xff08;或者其他的logo啊&#xff0c;返回之…...

经验笔记:远端仓库和本地仓库之间的连接(以Gitee为例)

经验笔记&#xff1a;远端仓库和本地仓库之间的连接 方法一&#xff1a;先创建远端仓库&#xff0c;再克隆到本地 创建远端仓库 登录到你的Git托管平台&#xff08;如Gitee、GitHub、GitLab、Bitbucket等&#xff09;。点击“New Repository”或类似按钮&#xff0c;创建一个新…...

利用RAGflow和LM Studio建立食品法规问答系统

前言 食品企业在管理标准、法规&#xff0c;特别是食品原料、特殊食品法规时&#xff0c;难以通过速查法规得到准确的结果。随着AI技术的发展&#xff0c;互联网上出现很多AI知识库的解决方案。 经过一轮测试&#xff0c;找到问题抓手、打通业务底层逻辑、对齐行业颗粒度、沉…...

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 …...

自动化仪表故障排除法

自动化仪表主要是指在企业的实际生产工程当中&#xff0c;开展检测、控制、执行以及显示等一系列仪表的总称。合理地利用自动化仪表能够及时地掌握企业生产的动态&#xff0c;并获取相应的数据&#xff0c;从而推动生产过程的有序运行。 在自动化控制系统中&#xff0c;自动化…...

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服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…...

aws凭证(一)凭证存储

AWS 凭证用于验证身份,并授权对 DynamoDB 等等 AWS 服务的访问。配置了aws凭证后,才可以通过编程方式或从AWS CLI连接访问AWS资源。凭证存储在哪里呢?有以下几个方法: 一、使用文件存储 1、介绍 文件存储适用于长期和多账户配置。AWS SDK 也会自动读取配置文件中的凭证。…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

轻量级Docker管理工具Docker Switchboard

简介 什么是 Docker Switchboard &#xff1f; Docker Switchboard 是一个轻量级的 Web 应用程序&#xff0c;用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器&#xff0c;使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...

Python异步编程:深入理解协程的原理与实践指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…...

JS设计模式(5): 发布订阅模式

解锁JavaScript发布订阅模式&#xff1a;让代码沟通更优雅 在JavaScript的世界里&#xff0c;我们常常会遇到这样的场景&#xff1a;多个模块之间需要相互通信&#xff0c;但是又不想让它们产生过于紧密的耦合。这时候&#xff0c;发布订阅模式就像一位优雅的信使&#xff0c;…...

Linux--vsFTP配置篇

一、vsFTP 简介 vsftpd&#xff08;Very Secure FTP Daemon&#xff09;是 Linux 下常用的 FTP 服务程序&#xff0c;具有安全性高、效率高和稳定性好等特点。支持匿名访问、本地用户登录、虚拟用户等多种认证方式&#xff0c;并可灵活控制权限。 二、安装与启动 1. 检查是否已…...