Spring Boot 2.7 集成 MySQL 数据库实战教程
一、前言
Spring Boot 是目前 Java 后端开发中最流行的框架之一,它极大地简化了 Spring 应用的配置和部署。而 MySQL 作为最常用的关系型数据库,与 Spring Boot 的集成几乎是每个项目的标配。
本文将详细介绍如何在 Spring Boot 2.7 项目中集成 MySQL 数据库,使用 Spring Data JPA 进行数据持久化操作。内容涵盖从环境准备到完整 CRUD 操作的全部流程,适合初学者快速上手。
二、环境准备
2.1 版本说明
- Spring Boot:2.7.18
- JDK:1.8 及以上
- MySQL:8.0 及以上
- 构建工具:Maven 3.6+
2.2 创建 Spring Boot 项目
可以通过 Spring Initializr 快速创建项目,选择以下依赖:
- Spring Web(可选,如需 Web 功能)
- Spring Data JPA
- MySQL Driver
对应的 pom.xml 核心依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
三、数据源配置
3.1 基础配置
在 application.properties 中添加 MySQL 数据源配置:
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# JPA配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
注意:MySQL 8.0 以上版本驱动类为
com.mysql.cj.jdbc.Driver,旧版本为com.mysql.jdbc.Driver,请注意区分。
3.2 配置参数说明
spring.jpa.hibernate.ddl-auto:表结构自动创建策略,常用值有 none、update、create、create-dropspring.jpa.show-sql:是否打印 SQL 语句,开发环境建议开启spring.jpa.properties.hibernate.format_sql:是否格式化 SQL 语句,方便阅读
四、实体类映射
4.1 创建实体类
以用户表为例,创建 User 实体类:
@Entity
@Table(name = "sys_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username", unique = true, nullable = false, length = 50)
private String username;
@Column(name = "password", nullable = false, length = 100)
private String password;
@Column(name = "email", length = 100)
private String email;
@Column(name = "create_time")
private LocalDateTime createTime;
@Column(name = "update_time")
private LocalDateTime updateTime;
// getter 和 setter 方法省略
}
4.2 常用注解说明
@Entity:标记为 JPA 实体类@Table:指定对应的数据库表名@Id:标记为主键@GeneratedValue:主键生成策略,IDENTITY 表示自增@Column:指定列名、长度、是否可空等属性
五、Repository 层
5.1 创建 Repository 接口
继承 JpaRepository 即可获得基础的 CRUD 方法:
public interface UserRepository extends JpaRepository<User, Long> {
// 根据用户名查询
User findByUsername(String username);
// 根据邮箱查询
Optional<User> findByEmail(String email);
// 根据用户名模糊查询
List<User> findByUsernameContaining(String keyword);
// 判断用户名是否存在
boolean existsByUsername(String username);
}
5.2 方法命名规则
Spring Data JPA 支持根据方法名自动生成 SQL,常用的关键字有:
findBy:查询countBy:统计数量deleteBy:删除Containing:模糊查询,对应 LIKEAnd/Or:逻辑与/或OrderBy:排序
六、Service 层
6.1 业务逻辑封装
@Service
@Transactional
public class UserService {
@Autowired
private UserRepository userRepository;
// 新增用户
public User save(User user) {
user.setCreateTime(LocalDateTime.now());
user.setUpdateTime(LocalDateTime.now());
return userRepository.save(user);
}
// 根据ID查询
public User getById(Long id) {
return userRepository.findById(id).orElse(null);
}
// 查询所有
public List<User> findAll() {
return userRepository.findAll();
}
// 更新用户
public User update(User user) {
user.setUpdateTime(LocalDateTime.now());
return userRepository.save(user);
}
// 删除用户
public void deleteById(Long id) {
userRepository.deleteById(id);
}
// 分页查询
public Page<User> findPage(int page, int size) {
Pageable pageable = PageRequest.of(page - 1, size);
return userRepository.findAll(pageable);
}
}
七、事务管理
7.1 @Transactional 注解
Spring Boot 默认已经开启了事务管理,只需在需要事务的方法或类上添加 @Transactional 注解即可。
- 加在类上:该类所有 public 方法都开启事务
- 加在方法上:仅该方法开启事务,优先级高于类上的注解
7.2 事务传播行为
常用的事务传播行为:
REQUIRED(默认):如果当前有事务则加入,没有则新建REQUIRES_NEW:每次都新建事务,挂起当前事务SUPPORTS:有事务则加入,没有则以非事务方式执行
八、常见问题
8.1 时区问题
MySQL 8.0 连接时需要指定时区,在 URL 后添加 serverTimezone=Asia/Shanghai 参数。
8.2 中文乱码
确保数据库、表、连接都使用 utf8mb4 字符集。URL 中添加 useUnicode=true&characterEncoding=utf8。
8.3 懒加载异常
使用 @OneToMany 等关联映射时,在 Session 关闭后访问懒加载属性会抛出 LazyInitializationException。解决方案:
- 在查询时使用 JOIN FETCH 立即加载
- 在 Service 层初始化需要的属性
- 配置 Open Session in View(不推荐)
九、总结
Spring Boot + JPA + MySQL 的组合是 Java 后端开发的经典搭配,能够快速完成数据持久层的开发。本文介绍了从配置到 CRUD 操作的完整流程,希望能帮助大家快速入门。
在实际项目中,还需要考虑分页、排序、复杂查询、性能优化等问题。后续文章会继续深入讲解 JPA 的高级用法,敬请期待。
如果您有任何问题或建议,欢迎在评论区留言交流。