一、环境准备

  • 开发工具:IntelliJ IDEA 2023.1 + JDK 1.8.0_382+ Maven3.6.3
  • 数据库:MySQL 8.0.21
  • 依赖版本
    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version>
    </parent><dependencies><!-- Web支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis支持 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version></dependency><!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency><!-- 测试支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
    </dependencies>
    

二、项目结构

src/main/java
└─com.shuanglibi.demo├─controller├─service├─mapper├─entity└─DemoApplication.java
src/main/resources├─application.yml└─mapper└─UserMapper.xml
src/test/java└─com.shuanglibi.demo└─service└─UserServiceTest.java

三、核心代码实现

1. 配置文件 application.yml

spring:datasource:url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8username: rootpassword: xxxxxxdriver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.shuanglibi.demo.entityconfiguration:map-underscore-to-camel-case: true

2. 实体类 User.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Long id;private String name;private Integer age;private LocalDateTime createTime;
}

3. Mapper接口 UserMapper.java

@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User findById(Long id);@Insert("INSERT INTO user(name, age, create_time) VALUES(#{name}, #{age}, NOW())")@Options(useGeneratedKeys = true, keyProperty = "id")int insert(User user);@Update("UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}")int update(User user);@Delete("DELETE FROM user WHERE id=#{id}")int delete(Long id);
}

4. Service层 UserService.java

@Service
@RequiredArgsConstructor
public class UserService {private final UserMapper userMapper;public User getUserById(Long id) {return userMapper.findById(id);}public int createUser(User user) {return userMapper.insert(user);}public int updateUser(User user) {return userMapper.update(user);}public int deleteUser(Long id) {return userMapper.delete(id);}
}

四、单元测试实现(JUnit 5)

1. 测试基类配置

@SpringBootTest
@Transactional
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class BaseTest {@Autowiredprotected UserService userService;@Autowiredprotected UserMapper userMapper;
}

2. 完整测试类 UserServiceTest.java

class UserServiceTest extends BaseTest {@Testvoid testCRUD() {// 创建测试User newUser = new User(null, "张三", 25, null);int insertResult = userService.createUser(newUser);assertEquals(1, insertResult);assertNotNull(newUser.getId());// 查询测试User fetchedUser = userService.getUserById(newUser.getId());assertEquals("张三", fetchedUser.getName());assertEquals(25, fetchedUser.getAge());// 更新测试fetchedUser.setAge(26);int updateResult = userService.updateUser(fetchedUser);assertEquals(1, updateResult);User updatedUser = userService.getUserById(fetchedUser.getId());assertEquals(26, updatedUser.getAge());// 删除测试int deleteResult = userService.deleteUser(newUser.getId());assertEquals(1, deleteResult);User deletedUser = userService.getUserById(newUser.getId());assertNull(deletedUser);}
}

五、关键问题解决方案

1. 数据库连接问题

# 如果出现时区错误,在连接URL中添加:
spring.datasource.url: jdbc:mysql://localhost:3306/testdb?serverTimezone=Asia/Shanghai

2. MyBatis注解与XML配置选择

  • 简单SQL使用注解方式
  • 复杂SQL推荐XML配置(resources/mapper/UserMapper.xml):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shuanglibi.demo.mapper.UserMapper"><select id="findByName" resultType="User">SELECT * FROM user WHERE name = #{name}</select>
</mapper>

3. 事务管理配置

@Configuration
@EnableTransactionManagement
public class MyBatisConfig {// 可自定义事务管理器
}

六、运行与验证

  1. 启动测试类执行所有测试方法
  2. 查看控制台输出:
2023-10-20 14:30:22.123  INFO 12345 --- [           main] c.e.d.s.UserServiceTest                  : Started UserServiceTest in 2.345 seconds
2023-10-20 14:30:22.456  INFO 12345 --- [           main] o.s.t.c.transaction.TransactionContext   : Began transaction...

七、扩展建议

  1. 添加分页查询:使用PageHelper插件
  2. 集成Swagger文档:
<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>
</dependency>
  1. 使用MyBatis Generator自动生成代码:
<plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.2</version>
</plugin>

文章亮点

  1. 完整覆盖Spring Boot 2.x + MyBatis整合流程
  2. 提供可直接运行的测试代码
  3. 包含常见问题解决方案
  4. 遵循Java 1.8语法规范
  5. 使用现代测试框架(JUnit 5 + Spring Boot Test)

建议读者在实际操作时注意:
6. 提前创建好testdb数据库
7. 保持MySQL服务正常运行
8. 根据实际情况修改数据库连接参数
9. 使用Postman进行接口验证(配合Controller层)

源码在此,插去直接可以用,记得耐心点等待依赖下载完再启动。 (Spring Boot整合MyBatis+MySQL源码)

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

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

相关文章

游戏开发日记

如何用数据表来储存&#xff0c;位置坐标&#xff08;XYZ&#xff09;&#xff1a;决定了对象在世界中的摆放资源ID / 图片URL&#xff1a;决定了使用什么模型或贴图事件ID / 特效&#xff1a;是否触发某些事件&#xff08;例如点击、交互&#xff09;逻辑索引&#xff08;Grid…

如何使用xmind编写测试用例

如何使用xmind编写测试用例为什么要使用xmind&#xff1f;使用xmind编写测试用例是为了梳理我们的思路。使用xmind编写测试用例的思路是什么&#xff1f;先进行分析再提取测试用例。 例如下面的注册功能的测试用例的分析&#xff1a; 分析&#xff1a; 先提取出需要测试的功能点…

使用LLaMA-Factory微调Qwen2.5-VL-3B 的目标检测任务-数据集格式转换(voc 转 ShareGPT)

一、LLaMA-Factory Qwen2.5-VL ShareGPT 格式要求ShareGPT 格式就是多轮对话的 list&#xff0c;每条数据如下&#xff1a;[{"conversations": [{"from": "user", "value": "<image>\n请标注图片中的所有目标及其类别和位…

【SkyWalking】服务端部署与微服务无侵入接入实战指南

【SkyWalking】服务端部署与微服务无侵入接入实战指南 &#x1f4a1; SkyWalking 系列总引导 在微服务架构快速演进的今天&#xff0c;如何有效实现服务链路追踪、性能分析、日志采集与自动化告警&#xff0c;成为系统稳定性的关键保障手段。 SkyWalking&#xff0c;作为 Apa…

LVDS系列20:Xilinx 7系ISERDESE2原语(一)

Xilinx 7系FPGA bank的io单元如下&#xff1a;Hr bank比hp bank少odelaye2组件&#xff0c;两者的idelaye2组件后面&#xff0c;都有iserdese2组件&#xff1b; iserdese2组件是一种专用的串并转换器或称解串器&#xff0c;用于高速源同步应用&#xff0c;如大部分LVDS信号解析…

【U-Boot】Shell指令

目录 U-Boot 三个Shell U-Boot Shell Linux Shell shell脚本 总结 U-Boot Shell命令 帮助命令 部分命令分类与功能说明 一、基础操作与信息查询 二、内存操作 三、启动管理 四、文件系统操作 五、设备与分区管理 六、环境变量 七、诊断与调试 八、特殊功能 九…

《Revisiting Generative Replay for Class Incremental Object Detection》阅读笔记

摘要Abstract部分 原文 Generative replay has gained significant attention in class-incremental learning; however, its application to Class Incremental Object Detection (CIOD) remains limited due to the challenges in generating complex images with precise …

Mysql: Bin log原理以及三种格式

目录 一、什么是 Binlog&#xff1f; 二、Binlog 的应用场景与案例 1. 数据恢复 (Point-in-Time Recovery) 2. 主从复制 (Master-Slave Replication) 3. 数据审计 三、Binlog 的三种格式 1. STATEMENT 模式 (Statement-Based Logging - SBL) 2. ROW 模式 (Row-Based Log…

LiteHub之文件下载与视频播放

文件下载 前端请求 箭头函数 //这个箭头函数可以形象理解为&#xff0c;x流入&#xff08;>&#xff09;x*x, //自然而然>前面的就是传入参数,>表示函数体 x > x * x//相当于 function (x) {return x * x; }//如果参数不是一个&#xff0c;就需要用括号()括起来…

QT5使用cmakelists引入Qt5Xlsx库并使用

1、首先需要已经有了Qt5Xlsx的头文件和库&#xff0c;并拷贝到程序exe路径下&#xff08;以xxx.exe/3rdparty/qtxlsx路径为例&#xff0c;Qt5Xlsx版本为0.3.0&#xff09;&#xff1b; 2、cmakelist中&#xff1a; # 设置 QtXlsx 路径 set(QTXLSX_ROOT_DIR ${CMAKE_CURRENT_SOU…

醋酸镨:闪亮的稀土宝藏,掀开科技应用新篇章

一、什么是醋酸镨醋酸镨是一种镨的有机盐&#xff0c;镨是稀土金属元素之一。作为一种重要的稀土化合物&#xff0c;醋酸镨通常以水合物的形式存在&#xff0c;呈现淡黄色或无色结晶。镨元素本身因其独特的物理化学特性&#xff0c;在工业和科技领域有着广泛应用&#xff0c;而…

深入解析JVM内存结构与垃圾回收机制

java是强类型高级语言JVM&#xff08;Java Virtual Machine&#xff0c;Java虚拟机&#xff09;是Java平台的核心组件&#xff0c;它是一个虚拟的计算机&#xff0c;能够执行Java字节码&#xff08;bytecode&#xff09;。1、区域划分JVM对Java内存的管理也是分区分块进行&…

Java 流程控制详解:从顺序执行到跳转语句,掌握程序逻辑设计

作为一名Java开发工程师&#xff0c;你一定知道&#xff0c;流程控制&#xff08;Flow Control&#xff09; 是编写任何程序的核心。它决定了代码的执行路径、分支走向和循环次数。本文将带你系统梳理 Java中的所有常用流程控制结构&#xff0c;包括&#xff1a;顺序结构分支结…

面试150 环形链表

思路 采用双指针法,slow指针每次走一步,fast指针每次走两步&#xff0c;如果相遇的情况下&#xff0c;slow指针回到开始的位置,此时快慢指针各走一步&#xff0c;当相遇的时候也就是说明链表中有环。 # Definition for singly-linked list. # class ListNode: # def __init…

AI技术正在深度重构全球产业格局,其影响已超越工具属性,演变为推动行业变革的核心引擎。

一、AI如何重塑AI的工作与行业&#xff08;AI助手领域&#xff09;能力升级理解与生成&#xff1a;基于LLM&#xff08;大语言模型&#xff09;&#xff0c;AI能处理开放式问题、撰写报告、翻译代码&#xff0c;替代部分人类知识工作。个性化交互&#xff1a;通过用户历史对话分…

Kafka的无消息丢失配置怎么实现

那 Kafka 到底在什么情况下才能保证消息不丢失呢&#xff1f; Kafka 只对“已提交”的消息&#xff08;committed message&#xff09;做有限度的持久化保证。 第一个核心要素是“已提交的消息”。什么是已提交的消息&#xff1f;当 Kafka 的若干个 Broker 成 功地接收到一条…

集成CommitLInt+ESLint+Prettier+StyleLint+LintStaged

代码可读性低代码 代码规范落地难代码格式难统一代码质量低下 配置 ESLint ESLint 是一个用来识别 ECMAScript 并且按照规则给出报告的代码检测工具&#xff0c;使用它可以避免低级错误和统一代码的风格。它拥有以下功能&#xff1a; 查出 JavaScript 代码语法问题。根据配置…

寻找两个正序数组的中位数(C++)

给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (mn)) 。示例 1&#xff1a;输入&#xff1a;nums1 [1,3], nums2 [2] 输出&#xff1a;2.00000 解释&#x…

Expected Sarsa 算法的数学原理

&#x1f31f; 一、Expected Sarsa 算法的数学原理 1. 什么是 Expected Sarsa&#xff1f; Expected Sarsa 是一种基于 时序差分&#xff08;Temporal Difference, TD&#xff09;学习 的强化学习算法&#xff0c;用于估计 动作值函数 ( q_{\pi}(s, a) )。它是 Sarsa 算法的一种…

Vue的watch和React的useEffect

参考文章&#xff1a;https://zhuanlan.zhihu.com/p/686329898