SpringBoot整合MySQL与MyBatis实战指南
1. 项目概述作为一名Java开发者我经常需要在本地开发环境中搭建SpringBoot项目并连接MySQL数据库。最近在指导新人时发现虽然网上有很多相关教程但大多比较零散缺乏系统性和实操细节。本文将完整记录从零开始搭建SpringBoot项目并连接MySQL数据库的全过程包含我在实际开发中积累的经验技巧。这个教程适合以下人群刚接触SpringBoot和MySQL的Java开发者需要快速搭建本地开发环境的程序员想了解MyBatis和SpringBoot整合的初学者2. 环境准备与数据库创建2.1 开发环境要求在开始之前请确保你的开发环境满足以下要求JDK 17或更高版本推荐使用OpenJDKMySQL 8.0社区版即可IntelliJ IDEA或Eclipse IDEMaven 3.6提示建议使用Docker安装MySQL可以避免很多环境配置问题。如果使用原生安装记得配置好环境变量。2.2 创建MySQL数据库首先我们需要在本地MySQL中创建数据库和表。以下是详细步骤登录MySQL命令行mysql -u root -p创建数据库这里以blog_system为例CREATE DATABASE blog_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;选择刚创建的数据库USE blog_system;创建用户表CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );经验分享utf8mb4字符集支持完整的Unicode字符包括emoji比传统的utf8更推荐使用。TIMESTAMP字段的自动更新功能可以省去手动维护更新时间的工作。3. SpringBoot项目初始化3.1 创建SpringBoot项目使用Spring Initializr创建项目以IntelliJ IDEA为例选择File → New → Project → Spring Initializr配置项目基本信息Group: com.exampleArtifact: blog-systemType: MavenJava: 17添加依赖Spring WebMyBatis FrameworkMySQL DriverLombok推荐3.2 项目结构说明创建完成后项目基本结构如下blog-system ├── src/main/java │ └── com/example/blog │ ├── BlogApplication.java │ ├── config │ ├── controller │ ├── model │ ├── mapper │ └── service ├── src/main/resources │ ├── application.properties │ └── mapper └── src/test注意这是Maven标准结构不要随意修改目录位置否则可能导致构建失败。4. 数据库连接配置4.1 配置数据库连接在application.properties中添加以下配置# 数据库连接配置 spring.datasource.urljdbc:mysql://localhost:3306/blog_system?useUnicodetruecharacterEncodingUTF-8useSSLfalseserverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.passwordyourpassword spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver # MyBatis配置 mybatis.mapper-locationsclasspath:mapper/*.xml mybatis.type-aliases-packagecom.example.blog.model重要提示useSSLfalse仅适用于开发环境生产环境应该使用true并配置证书。serverTimezone设置可以避免时区问题。4.2 测试数据库连接创建一个简单的测试类验证连接是否成功SpringBootTest class DatabaseConnectionTest { Autowired private DataSource dataSource; Test void testConnection() throws SQLException { try (Connection conn dataSource.getConnection()) { assertNotNull(conn); System.out.println(数据库连接成功 conn.getMetaData().getDatabaseProductName()); } } }5. 模型层与Mapper实现5.1 创建实体类使用Lombok简化代码Data NoArgsConstructor AllArgsConstructor TableName(users) public class User { TableId(type IdType.AUTO) private Integer id; private String username; private String password; private String email; TableField(fill FieldFill.INSERT) private LocalDateTime createdAt; TableField(fill FieldFill.INSERT_UPDATE) private LocalDateTime updatedAt; }技巧TableField的fill属性可以自动填充字段值需要在配置类中配置MetaObjectHandler。5.2 创建Mapper接口基础Mapper接口Mapper public interface UserMapper extends BaseMapperUser { Select(SELECT * FROM users WHERE username #{username}) User selectByUsername(Param(username) String username); Select(SELECT EXISTS(SELECT 1 FROM users WHERE username #{username})) boolean existsByUsername(Param(username) String username); }5.3 XML映射文件在resources/mapper目录下创建UserMapper.xml?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.blog.mapper.UserMapper resultMap idBaseResultMap typecom.example.blog.model.User id columnid propertyid / result columnusername propertyusername / result columnpassword propertypassword / result columnemail propertyemail / result columncreated_at propertycreatedAt / result columnupdated_at propertyupdatedAt / /resultMap sql idBase_Column_List id, username, password, email, created_at, updated_at /sql select idselectByEmail resultMapBaseResultMap SELECT include refidBase_Column_List / FROM users WHERE email #{email} /select /mapper6. 业务逻辑与控制器实现6.1 创建Service层用户服务接口和实现public interface UserService { User getUserById(Integer id); User getUserByUsername(String username); boolean createUser(User user); } Service RequiredArgsConstructor public class UserServiceImpl implements UserService { private final UserMapper userMapper; Override public User getUserById(Integer id) { return userMapper.selectById(id); } Override public User getUserByUsername(String username) { return userMapper.selectByUsername(username); } Override Transactional public boolean createUser(User user) { if (userMapper.existsByUsername(user.getUsername())) { throw new RuntimeException(用户名已存在); } return userMapper.insert(user) 0; } }6.2 创建Controller用户控制器RestController RequestMapping(/api/users) RequiredArgsConstructor public class UserController { private final UserService userService; GetMapping(/{id}) public ResponseEntityUser getUserById(PathVariable Integer id) { return ResponseEntity.ok(userService.getUserById(id)); } PostMapping public ResponseEntityVoid createUser(RequestBody User user) { userService.createUser(user); return ResponseEntity.status(HttpStatus.CREATED).build(); } }7. 常见问题与解决方案7.1 连接失败问题排查Access denied for user检查用户名密码是否正确确认用户有访问该数据库的权限尝试在MySQL命令行中直接连接测试Communications link failure检查MySQL服务是否启动确认端口号是否正确默认3306检查防火墙设置是否阻止了连接7.2 MyBatis映射问题Invalid bound statement (not found)检查mapper.xml文件是否在正确目录下确认application.properties中配置了mapper-locations检查namespace是否与Mapper接口全限定名一致字段映射失败确认数据库字段名与实体类属性名一致使用TableField注解指定映射关系检查是否有getter/setter方法7.3 性能优化建议使用连接池如HikariCPspring.datasource.hikari.maximum-pool-size10 spring.datasource.hikari.minimum-idle5启用MyBatis二级缓存CacheNamespace public interface UserMapper extends BaseMapperUser { // ... }批量操作使用批处理模式Transactional public void batchInsert(ListUser users) { users.forEach(userMapper::insert); }8. 进阶配置与最佳实践8.1 多环境配置创建不同环境的配置文件application-dev.properties开发环境application-test.properties测试环境application-prod.properties生产环境通过启动参数指定环境java -jar blog-system.jar --spring.profiles.activeprod8.2 数据库迁移工具推荐使用Flyway管理数据库变更添加依赖dependency groupIdorg.flywaydb/groupId artifactIdflyway-core/artifactId /dependency创建迁移脚本src/main/resources/db/migration/V1__Create_user_table.sql8.3 监控与健康检查添加Spring Boot Actuatormanagement.endpoints.web.exposure.includehealth,info,metrics management.endpoint.health.show-detailsalways访问/actuator/health可以查看数据库连接状态。在实际项目中我发现合理的项目结构和清晰的层次划分可以大幅提高开发效率。特别是在团队协作时统一的编码规范和技术选型非常重要。对于数据库操作建议尽量使用MyBatis-Plus提供的基础方法减少手写SQL的机会这样可以降低出错概率。

相关新闻

2026值得推荐的絮凝剂公司清单:适配不同预算与场景

2026值得推荐的絮凝剂公司清单:适配不同预算与场景

絮凝剂公司推荐核心参考维度水处理领域絮凝剂(聚丙烯酰胺)采购的选型决策,可依托5个核心维度形成标准化评分体系,覆盖资质、适配性、成本、服务、供货全链条,同时可根据自身预算档位灵活调整各维度优先级,实…

2026/7/3 4:23:58阅读更多 →
中间继电器到底干什么用的?90%的新手没搞懂

中间继电器到底干什么用的?90%的新手没搞懂

STEP 1 先搞懂:中间继电器是什么?线圈 触点 小开关的大作用中间继电器(Intermediate Relay)本质上是一个"用小电流控制大电流"的电磁开关。结构很简单:一个线圈 若干触点。线圈得电 → 产生磁场 → 衔铁吸…

2026/7/3 4:18:57阅读更多 →
林曦:康健的身体,仰仗于我们积极地生活

林曦:康健的身体,仰仗于我们积极地生活

健康,是我们关心的话题。时下里关于“健康”,有诸多说法:饮食的,运动的,睡眠的,固然这些十分重要,今天暄桐教室想与你分享的,是从更基本的心理层面来谈。暄桐教室,是一间…

2026/7/3 4:18:57阅读更多 →
如何快速搭建AI结对编程环境:Aider终端助手的完整指南

如何快速搭建AI结对编程环境:Aider终端助手的完整指南

如何快速搭建AI结对编程环境:Aider终端助手的完整指南 【免费下载链接】aider aider is AI pair programming in your terminal 项目地址: https://gitcode.com/GitHub_Trending/ai/aider 你是否厌倦了在IDE和AI聊天窗口之间来回切换?是否希望AI编…

2026/7/3 6:54:10阅读更多 →
RevokeMsgPatcher防撤回补丁原理与实战:让微信QQ消息永久可见

RevokeMsgPatcher防撤回补丁原理与实战:让微信QQ消息永久可见

1. 项目概述与核心价值在即时通讯软件成为工作与生活核心工具的今天,微信和QQ的“消息撤回”功能,时常让人感到一丝无奈。无论是同事发错的重要文件、朋友撤回的八卦消息,还是群聊里一闪而过的关键通知,一旦被撤回,就仿…

2026/7/3 6:54:10阅读更多 →
构建企业级PHP AI安全网关:基于静态分析与语义追踪的WAF革新实践

构建企业级PHP AI安全网关:基于静态分析与语义追踪的WAF革新实践

1. 项目概述:为什么我们需要一个“会思考”的WAF?在传统企业安全防御体系中,Web应用防火墙(WAF)一直扮演着守门员的角色。但干了这么多年安全,我越来越觉得,传统的基于规则和签名的WAF&#xff…

2026/7/3 6:54:10阅读更多 →
终极Aider AI编程助手安装指南:3分钟从零到精通

终极Aider AI编程助手安装指南:3分钟从零到精通

终极Aider AI编程助手安装指南:3分钟从零到精通 【免费下载链接】aider aider is AI pair programming in your terminal 项目地址: https://gitcode.com/GitHub_Trending/ai/aider 想要在终端中拥有一个强大的AI结对编程伙伴吗?Aider正是你需要的…

2026/7/3 6:54:10阅读更多 →
Web渗透测试:全面指南与实战技巧

Web渗透测试:全面指南与实战技巧

Web渗透测试:全面指南与实战技巧Web渗透测试是识别和修复Web应用程序安全漏洞的关键过程。通过模拟恶意攻击者的行为,渗透测试人员可以发现潜在的安全风险,帮助组织加强防御措施。以下内容将详细介绍Web渗透测试的核心概念、常用工具、实战技…

2026/7/3 6:54:10阅读更多 →
文件上传漏洞攻防全解析:从原理到实战的Webshell绕过与防御

文件上传漏洞攻防全解析:从原理到实战的Webshell绕过与防御

1. 项目概述:文件上传漏洞的攻防本质在Web安全领域,文件上传漏洞一直是一个“古老”但极具威胁的入口点。它不像SQL注入那样需要复杂的逻辑构造,也不像XSS那样依赖用户交互,很多时候,它就是一个简单的表单,…

2026/7/3 6:49:10阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/2 12:10:34阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/2 12:10:34阅读更多 →
LV3296与PIC18F45K22的UART通信与USB扩展方案

LV3296与PIC18F45K22的UART通信与USB扩展方案

1. LV3296与PIC18F45K22的硬件搭档解析在嵌入式数据采集系统中,LV3296条形码扫描模块与PIC18F45K22微控制器的组合堪称经典搭配。LV3296作为一款工业级条码扫描头,其核心是一颗高性能CMOS图像传感器,配合专用解码芯片,能自动识别包…

2026/7/3 0:03:41阅读更多 →
AI初创生存指南:6个月完成可信度验证闭环

AI初创生存指南:6个月完成可信度验证闭环

1. 这不是“逆袭指南”,而是一份AI初创公司真实生存手记“How To Beat Odds As an AI Startup?”——这个标题乍看像一句热血口号,但在我带过7个从0到1的AI产品团队、亲手踩过融资失败、技术债崩盘、客户POC卡在最后一公里等23类典型坑之后,…

2026/7/3 0:03:41阅读更多 →
多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

1. 这不是又一篇“AI趋势速览”,而是一份实操者手记:当多模态、推理链、检索增强与智能体协作真正撞进工程现场“LAI #73”这个编号本身就像一个暗号——它不属于某家大厂的白皮书,也不是学术会议的议程表,而是长期泡在模型训练集…

2026/7/3 0:03:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/3 1:12:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/3 1:36:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/3 2:08:15阅读更多 →