跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Boot 数据访问与数据库集成实战

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

Pythonist发布于 2026/3/16更新于 2026/8/2338 浏览
Spring Boot 数据访问与数据库集成实战

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>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</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;

    // 省略构造器与 Getter/Setter
    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. 依赖与配置

添加 MyBatis Starter 依赖:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.3.0</version>
</dependency>

配置文件指定 Mapper 扫描路径:

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。无论哪种方式,配合事务管理与合理的分层设计,都能构建出稳定可靠的数据持久化层。

目录

  1. Spring Boot 数据访问与数据库集成
  2. 数据访问概览
  3. 集成 MySQL
  4. 1. 依赖与配置
  5. 2. 实体与仓库
  6. 3. 控制器与测试
  7. 集成 H2 数据库
  8. 集成 MyBatis
  9. 1. 依赖与配置
  10. 2. Mapper 与 XML
  11. 事务管理
  12. 综合应用场景
  13. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++ 泛型编程基础与 STL 标准模板库简介
  • Python+TensorRT+ONNX 实现大模型量化部署
  • 网络通信核心协议详解:TCP、UDP 与 HTTP/HTTPS
  • Paperzz 论文降重与 AIGC 检测功能使用指南
  • 异步编程实战:构建高性能 Python 网络应用
  • 人工智能:自然语言处理在法律领域的应用与实战
  • Ubuntu 系统下 libwebkit2gtk-4.1-0 库安装指南
  • OpenUI:基于 AI 的自然语言 UI 构建开源工具
  • Flutter 三方库 langchain_google 的鸿蒙化适配指南
  • C++ 与 Linux 基础:进程打开磁盘文件的内核实现与源码解析
  • 飞书 × OpenClaw 接入指南:不用服务器,用长连接把机器人跑起来
  • Spring Boot 2.x 集成 Knife4j (OpenAPI 3) 配置指南
  • C++ 类和对象:拷贝构造与赋值运算符详解
  • tksheet完整指南:Python Tkinter表格组件的终极解决方案
  • 使用 Trae IDE 配合 MCP 将 Figma 设计稿转为前端代码
  • Nanbeige 4.1-3B WebUI 实战:CSS :has() 实现动态对话布局
  • 腾讯云智能客服 Java 集成与生产环境优化
  • Whisper-large-v3 语音识别与多语字幕生成工具
  • 使用 Trae IDE 将 Figma 设计稿转化为前端代码
  • 基于 LangChain 的自动化测试用例生成与执行

相关免费在线工具

  • 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