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

Spring Boot整合MyBatis+MySQL实战指南(Java 1.8 + 单元测试)

一、环境准备

  • 开发工具: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.dtcms.com/a/274409.html

相关文章:

  • 从 JavaFX WebView 迁移至 JxBrowser
  • 【科研绘图系列】R语言绘制系统发育树和柱状图
  • 以科技赋能未来,科聪持续支持青年创新实践 —— 第七届“科聪杯”浙江省大学生智能机器人创意竞赛圆满落幕
  • 宝塔 php支持sqlserver
  • 稀疏激活大模型推理优化:突破效率瓶颈的曙光
  • JavaScript VMP (Virtual Machine Protection) 分析与调试
  • 动态规划初步(完全背包)
  • The 2023 ICPC Asia Hangzhou Regional Contest (H. Sugar Sweet II(基环树,期望))
  • 闲庭信步使用图像验证平台加速FPGA的开发:第九课——图像插值的FPGA实现
  • 【JMeter】执行SQL
  • Elasticsearch 滚动(Scroll)用法、使用场景及与扫描(Scan)的区别
  • Linux 下使用 vim 文本编辑器时的操作指令
  • OGG-00551 ODBC error: SQLSTATE 22007,从字符串转换日期和/或时间时,转换失败
  • 和鲸社区深度学习基础训练营2025年关卡3_Q1(1)
  • 零基础入门:Air8000系列蓝牙配网开发(LuatOS版)
  • 攻防世界——web题 upload
  • Laravel + Python 图片水印系统:实现与调试指南
  • 将七大核心理念融入AI Agent设计——构建“数字生命体”的宏伟蓝图
  • 大数据在UI前端的应用创新:基于用户反馈的产品迭代优化系统
  • UI前端大数据可视化实战技巧:如何利用数据故事化提升用户参与度?
  • 前端面试专栏-算法篇:22.树结构(二叉树、B树、红黑树)
  • Web 应用防火墙:守护应用安全的核心屏障
  • webpack高级配置
  • OpenAvatarChat数字人项目结构分析
  • 星云穿越与超光速飞行特效的前端实现原理与实践
  • 第三章 隧道与轨道交通工程 3.8 安全质量控制
  • 排序算法(一):冒泡排序
  • UniApp 生命周期详解:从启动到销毁的完整指南
  • 如何快速掌握WeNet:从零到一的端到端语音识别学习指南
  • SSRF11 各种限制绕过之DNS rebinding 绕过内网 ip 限制