跳到主要内容Spring Boot 数据访问与数据库集成实战 | 极客日志Javajava
Spring Boot 数据访问与数据库集成实战
综述由AI生成Spring Boot 提供了多种数据访问方案,涵盖 MySQL、H2、MyBatis 及 JPA 集成。文章详细演示了依赖引入、连接配置、实体映射及事务管理的核心步骤,并通过商品管理案例展示了从 Controller 到 Repository 的完整链路。开发者可根据项目需求灵活选择 ORM 框架,确保数据一致性与开发效率。
Pythonist3 浏览 Spring Boot 数据访问与数据库集成

在 Spring Boot 开发中,数据访问层是核心环节。无论是关系型数据库还是内存测试库,Spring Boot 都能通过自动配置快速集成。本文将梳理主流方案(JPA、MyBatis)的落地步骤,并结合事务管理与实际场景,帮你构建稳健的数据持久化层。
数据访问概览
Spring Boot 支持多种数据访问方式,选择哪种取决于项目复杂度与团队习惯:
- JdbcTemplate:适合轻量级 JDBC 操作,控制粒度细。
- Spring Data JPA:基于 Hibernate,通过接口方法名自动生成 SQL,开发效率高。
- MyBatis:需要编写 XML 映射文件,SQL 灵活可控,适合复杂查询。
集成 MySQL
MySQL 是最常用的生产环境数据库。集成流程相对标准化,关键在于依赖引入与连接配置。
1. 依赖与配置
在 pom.xml 中加入 Web、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>
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-test
test
<artifactId>
</artifactId>
<scope>
</scope>
</dependency>
<dependency>
<groupId>
</groupId>
<artifactId>
</artifactId>
<scope>
</scope>
</dependency>
</dependencies>
接着在 application.properties 中配置数据源:
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
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
2. 实体与仓库
定义实体类时,使用 JPA 注解映射表结构。注意字段命名规范与 Getter/Setter 的完整性:
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;
public Product() {}
public Product(String productId, String productName, double price, int sales) {
this.productId = productId;
this.productName = productName;
this.price = price;
this.sales = sales;
}
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getProductId() { return productId; }
public void setProductId(String productId) { this.productId = productId; }
public String getProductName() { return productName; }
public void setProductName(String productName) { this.productName = productName; }
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
public int getSales() { return sales; }
public void setSales(int sales) { this.sales = sales; }
@Override
public String toString() {
return "Product{" +
"id=" + id +
", productId='" + productId + '\'' +
", productName='" + productName + '\'' +
", price=" + price +
", sales=" + sales +
'}';
}
}
Repository 接口继承 JpaRepository 即可复用基础 CRUD 方法,自定义查询只需遵循命名约定:
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);
}
3. 控制器与测试
Controller 层注入 Repository,暴露 RESTful 接口。测试阶段建议覆盖主要业务逻辑:
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 常用于开发环境与单元测试,无需安装额外服务。配置差异主要体现在 URL 与控制台开关:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
其余实体、Repository 及 Controller 代码与 MySQL 方案保持一致,方便切换环境验证逻辑。
集成 MyBatis
若需更精细地控制 SQL,MyBatis 是更好的选择。相比 JPA,它需要显式编写 Mapper 接口与 XML 映射文件。
1. 依赖与配置
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity
2. Mapper 与 XML
Mapper 接口标记为 @Mapper,XML 文件中定义具体 SQL 语句:
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 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@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();
}
}
注意:readOnly = true 可优化只读查询性能,而写操作默认开启回滚机制,确保异常发生时数据不丢失。
综合应用场景
将上述组件组合,可实现商品展示、订单管理等典型业务。以下是一个完整的启动类与初始化示例:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
public void run(String... args) {
productService.addProduct(new Product("P001", "手机", 1000.0, 100));
productService.addProduct(new Product("P002", "电脑", 5000.0, 50));
productService.addProduct(new Product("P003", "电视", 3000.0, 80));
productService.addProduct(new Product("P004", "手表", 500.0, 200));
productService.addProduct(new Product("P005", "耳机", 300.0, 150));
}
}
运行后访问 /api/products/top-selling?topN=3,即可获取销量前三的商品列表。这种分层架构不仅清晰易维护,也便于后续扩展微服务或缓存策略。
总结
Spring Boot 的数据访问能力非常强大,覆盖了从简单 JDBC 到复杂 ORM 的各种需求。在实际项目中,建议根据团队技术栈与 SQL 复杂度选择合适的方案:追求开发效率可选 JPA,追求 SQL 灵活性则用 MyBatis。无论哪种方式,配合事务管理与合理的分层设计,都能构建出稳定可靠的数据持久化层。
相关免费在线工具
- 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