跳到主要内容
Spring Boot 数据访问与数据库集成实战 | 极客日志
Java java
Spring Boot 数据访问与数据库集成实战 深入探讨了 Spring Boot 中的数据访问与数据库集成方案。内容涵盖 JPA、MyBatis 等核心组件的使用,详细演示了如何配置 MySQL 和 H2 数据库连接。通过实体类映射、Repository 接口定义以及 Mapper XML 编写,展示了不同持久层技术的具体实践。此外,文章还解析了@Transactional 注解在事务管理中的应用,并结合商品管理场景提供了完整的 CRUD 代码示例,帮助开发者在实际项目中高效处理数据持久化问题。
CoderByte 发布于 2026/3/29 更新于 2026/4/25 1 浏览Spring Boot 数据访问与数据库集成
在构建企业级应用时,数据持久化是核心环节。Spring Boot 通过自动配置和 starter 依赖,极大地简化了数据库集成的过程。本文将深入探讨如何在 Spring Boot 中高效地操作数据库,涵盖主流方案如 JPA、MyBatis 以及事务管理。
数据访问概述
Spring Boot 的数据访问能力主要依赖于其丰富的组件生态。常见的实现方式包括:
JdbcTemplate :基于 JDBC 的轻量级封装,适合简单的 SQL 操作。
JPA (Hibernate) :对象关系映射标准,提供强大的 ORM 功能。
MyBatis :半自动化 ORM,允许开发者直接控制 SQL,灵活性高。
选择哪种方案取决于项目复杂度及对 SQL 控制的精细度要求。
集成 MySQL
MySQL 是最常用的生产环境数据库。集成步骤主要包括添加依赖、配置连接信息以及定义数据模型。
1. 依赖配置
在 pom.xml 中引入 Web、Data JPA 以及 MySQL 驱动依赖:
<dependencies >
<dependency >
<groupId > org.springframework.boot</groupId >
<artifactId > spring-boot-starter-web</artifactId >
</dependency >
<dependency >
<groupId > org.springframework.boot</groupId >
<artifactId > spring-boot-starter-data-jpa</artifactId >
</dependency >
<dependency >
<groupId > mysql</groupId >
<artifactId > mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-test
test
</artifactId >
<scope >
</scope >
</dependency >
<dependency >
<groupId >
</groupId >
<artifactId >
</artifactId >
<scope >
</scope >
</dependency >
</dependencies >
2. 配置文件 在 application.properties 中指定数据源和 JPA 行为:
# 服务器端口
server.port=8080
# 数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
# JPA 配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
3. 实体类与 Repository import javax.persistence.*;
@Entity
@Table(name = "product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String productId;
private String productName;
private double price;
private int sales;
}
接着创建 Repository 接口,Spring Data JPA 会自动生成实现:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface ProductRepository extends JpaRepository <Product, Long> {
List<Product> findBySalesGreaterThan (int sales) ;
}
4. 控制器与服务层 结合 Controller 暴露 REST API,并在 Service 层处理业务逻辑。以下是一个完整的商品查询示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/products")
public class ProductController {
@Autowired
private ProductRepository productRepository;
@GetMapping("/")
public List<Product> getAllProducts () {
return productRepository.findAll();
}
@PostMapping("/")
public Product addProduct (@RequestBody Product product) {
return productRepository.save(product);
}
@GetMapping("/top-selling")
public List<Product> getTopSellingProducts (@RequestParam int topN) {
List<Product> products = productRepository.findBySalesGreaterThan(0 );
products.sort((p1, p2) -> p2.getSales() - p1.getSales());
if (products.size() > topN) {
return products.subList(0 , topN);
}
return products;
}
}
集成 H2 数据库 H2 内存数据库非常适合开发和测试阶段,无需安装额外的数据库服务。配置与 MySQL 类似,只需修改数据源 URL 和驱动类名。
关键配置差异 # H2 内存数据库
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
# 启用 H2 控制台便于调试
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
其余实体类和 Repository 代码可复用 MySQL 部分的实现,这体现了 Spring Boot 对多种数据源的统一抽象。
集成 MyBatis 当需要更精细的 SQL 控制或处理复杂查询时,MyBatis 是更好的选择。它通过 XML 或注解将 Java 方法与 SQL 语句绑定。
1. 依赖与配置
<dependency >
<groupId > org.mybatis.spring.boot</groupId >
<artifactId > mybatis-spring-boot-starter</artifactId >
<version > 2.3.0</version >
</dependency >
# MyBatis 配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity
2. Mapper 接口与 XML 定义 Mapper 接口并编写对应的 XML 文件:
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface ProductMapper {
List<Product> findAll () ;
int insert (Product product) ;
List<Product> findBySalesGreaterThan (int sales) ;
}
XML 映射文件 (ProductMapper.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.example.demo.mapper.ProductMapper" >
<resultMap id ="ProductResultMap" type ="com.example.demo.entity.Product" >
<id property ="id" column ="id" />
<result property ="productId" column ="product_id" />
<result property ="productName" column ="product_name" />
<result property ="price" column ="price" />
<result property ="sales" column ="sales" />
</resultMap >
<select id ="findAll" resultMap ="ProductResultMap" > SELECT * FROM product </select >
<insert id ="insert" parameterType ="com.example.demo.entity.Product" >
INSERT INTO product (product_id, product_name, price, sales) VALUES (#{productId}, #{productName}, #{price}, #{sales})
</insert >
<select id ="findBySalesGreaterThan" parameterType ="int" resultMap ="ProductResultMap" >
SELECT * FROM product WHERE sales > #{sales}
</select >
</mapper >
事务管理 在涉及多步数据库操作时,保证数据的一致性至关重要。Spring Boot 提供了声明式事务管理,通过 @Transactional 注解即可轻松实现。
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
@Transactional
public void addProduct (Product product) {
productRepository.save(product);
}
@Transactional(readOnly = true)
public List<Product> getAllProducts () {
return productRepository.findAll();
}
}
注意:@Transactional 应加在 Service 层,且目标方法必须是 public 的。如果内部调用同一类的其他方法,事务可能不会生效,这是由 AOP 代理机制决定的。
实际应用场景 在实际项目中,我们通常会将上述组件组合使用。下面是一个整合后的完整流程示例,展示了从启动初始化到测试验证的全过程。
应用启动与数据初始化 import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.beans.factory.annotation.Autowired;
@SpringBootApplication
public class ProductApplication {
public static void main (String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
@Autowired
private ProductService productService;
public void run (String... args) {
productService.addProduct(new Product ("P001" , "手机" , 1000.0 , 100 ));
productService.addProduct(new Product ("P002" , "电脑" , 5000.0 , 50 ));
}
}
测试验证 使用 JUnit 5 进行集成测试,确保各接口符合预期:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest
class ProductApplicationTests {
@Autowired
private ProductController productController;
@Test
void testGetAllProducts () {
List<Product> products = productController.getAllProducts();
assertEquals(5 , products.size());
}
@Test
void testAddProduct () {
Product product = new Product ("P006" , "平板" , 2000.0 , 70 );
productController.addProduct(product);
List<Product> products = productController.getAllProducts();
assertEquals(6 , products.size());
}
}
通过以上实践,你可以快速搭建起稳定可靠的数据访问层。无论是追求开发效率的 JPA,还是注重 SQL 控制的 MyBatis,Spring Boot 都能提供完善的支撑。根据业务需求灵活选择,并结合事务管理保障数据一致性,是构建高质量后端服务的关键。
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online