1、第一阶段邪修实战总览(9.1-9.30)
把第一阶段(基础夯实期)的学习计划拆解成极具操作性的每日行动方案。这个计划充分利用我“在职学习”的特殊优势,强调“用输出倒逼输入”,确保每一分钟的学习都直接服务于面试和实战。
- 核心目标:构建起Java后端开发的知识树主干,并能通过一个小型项目串联起所有知识点。
- 核心策略:每天3小时雷打不动的高效学习(工作日可分散,周末集中攻坚)。
2、目标(9.1-9.14)
Java核心+Sprig Boot破冰,能独立使用Spring搭建Web后端并提供RESTful接口。
3、分日目标与邪修技巧
3.1、Day 11-12:整合MyBatis/MyBatis-Plus操作数据库
- 行动:在Spring Boot项目中引入MyBatis-Plus依赖。尝试连接数据库,定义一个
AdEntity实体类,并创建一个简单的查询方法。 - 邪修技巧:先花几分钟时间了解一下下面这几个概念,会让我们事半功倍,记住!我们的任务不是在这短时间内学会所有JPA细节,而是学会用它最快地实现功能。
-
- JDBC(Java Database Connectivity)是 Java 语言用于连接和操作数据库的标准 API(应用程序编程接口),它为 Java 程序提供了一套统一的规范,让开发者可以用相同的方式访问不同类型的关系型数据库(如 MySQL、Oracle、SQL Server 等)。
-
- JPA(Java Persistence API):一套标准,就像JDBS一样,它定义了如何用Java对象来操作数据库的规则。
-
- Spring Data JPA:Spring对JPA标准的实现。它做了最大程度的封装,它的核心是一个叫 JpaRepository 的接口。你只需要继承这个接口,就“免费”获得了几乎所有的增删改查(CRUD)方法,连实现都不用写。
-
- Hibernate:是JPA标准的一个流行实现(可以理解为Spring Data JPA手下的“头号干将”),负责底层具体的SQL生成和执行。
3.2、学习分享
第一步:准备工作-安装并配置MySQL
- 确保MySQL已安装并且可以正常运行:如果还没有MySQL,推荐参考下面这三篇文章,可以学习到MySQL以及连接工具的下载与安装。
- 创建数据库:使用Navicat Premium创建一个新的连接并且创造一个新的数据库
ad_db如下图所示

第二步:在项目中添加依赖和配置 - 当我修改项目的时候我发现之前建的是Gradle 项目,再修改成Maven项目有一些麻烦,所以我们这里重新建一个Maven项目,然后把之前的代码进行复制粘贴,正好能让我们复习巩固一下。
- 在Spring Initializr中快速新建一个Maven项目,如图所示设置:

- 建完之后结构目录如图所示:

- 新建
controller和entity包,并建好AdController和AdAdvertisement两个类,如下图所示:

- 接下来把对应的代码文件复制进去
- 首先是
pom.XML文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>Data_Board_Maven_DBS</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Data_Board_Maven_DBS</name>
<description>Demo project for Spring Boot</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 接下来是
AdController.java文件
package com.adcampaign.controller;
import com.adcampaign.entity.AdAdvertisement; // 导入刚刚创建的实体类
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.Arrays;
import java.util.List;
@RestController
@RequestMapping("/api/ads") // 所有这个控制器下的接口路径都以 /api/ads 开头
public class AdController {
// 模拟一些静态数据
private List<AdAdvertisement> adList = Arrays.asList(
new AdAdvertisement("2025-9-28",5000,10,50),
new AdAdvertisement("2025-9-29",6000,15,60)
);
@GetMapping // 等价于 @GetMapping(""),访问路径是 /api/ads
public List<AdAdvertisement> getAllAds() {
return adList; // Spring Boot会自动将这个List序列化为JSON返回
}
// 新增POST接口
@PostMapping
public String createAd(@RequestBody AdAdvertisement newAd) {
// @RequestBody 注解告诉Spring:“请把请求体里的JSON数据,转换成一个AdAdvertisement对象”
// 模拟处理:打印接收到数据
System.out.println("接收到新的广告数据!!!");
System.out.println("日期: " + newAd.getDate());
System.out.println("广告花费: " + newAd.getCost());
System.out.println("线索提交个数: " + newAd.getLeadCount());
System.out.println("私信消息数: " + newAd.getMessageCount());
// 这里暂时不做实际存储,只是返回成功消息
return "广告数据创建成功! " + newAd.getDate();
}
}
- 然后是
AdAdvertisement.java文件
package com.adcampaign.entity;
/**
* 广告活动数据模型类
* 用于存储广告活动的核心数据,并提供数据计算和分析功能
* 每个实例代表一天的广告活动数据
*/
public class AdAdvertisement {
// 日期(例如:"2023-10-01")
private String date;
// 广告花费(单位:元)
private double cost;
// 线索提交个数(用户提交的潜在客户信息数量)
private int leadCount;
// 私信消息数(收到的用户私信数量)
private int messageCount;
/**
* 构造方法:创建广告活动数据对象
* @param date 日期字符串
* @param cost 广告花费金额
* @param leadCount 线索数量
* @param messageCount 私信消息数量
*/
public AdAdvertisement(String date, double cost, int leadCount, int messageCount) {
this.date = date;
this.cost = cost;
this.leadCount = leadCount;
this.messageCount = messageCount;
}
// Getter方法:获取私有属性的值
public String getDate() { return date; }
public double getCost() { return cost; }
public int getLeadCount() { return leadCount; }
public int getMessageCount() { return messageCount; }
// Setter方法:修改私有属性的值
public void setDate(String date) { this.date = date; }
public void setCost(double cost) { this.cost = cost; }
public void setLeadCount(int leadCount) { this.leadCount = leadCount; }
public void setMessageCount(int messageCount) { this.messageCount = messageCount; }
/**
* 计算单个线索成本
* 公式:单个线索成本 = 广告花费 ÷ 线索数量
* @return 单个线索成本(元/个),如果线索数量为0则返回0
*/
public double calculateCostPerLead() {
// 防止除以零错误:如果线索数为0,返回0
return (leadCount > 0) ? cost / leadCount : 0;
}
/**
* 计算私信消息转化成本
* 公式:私信转化成本 = 广告花费 ÷ 私信消息数
* @return 私信转化成本(元/条),如果私信数为0则返回0
*/
public double calculateCostPerMessage() {
// 防止除以零错误:如果私信数为0,返回0
return (messageCount > 0) ? cost / messageCount : 0;
}
/**
* 分析广告花费随日期的变动情况
* @param previousCampaign 上一个日期的广告活动数据(用于比较)
* @return 变动情况描述,包含变动金额和百分比
*/
public String analyzeCostChange(AdAdvertisement previousCampaign) {
// 检查是否有历史数据可供比较
if (previousCampaign == null) return "无历史数据可供比较";
// 计算变动金额:当前花费 - 上一期花费
double changeAmount = this.cost - previousCampaign.getCost();
// 计算变动百分比:(变动金额 ÷ 上一期花费) × 100%
double changeRate = (changeAmount / previousCampaign.getCost()) * 100;
// 格式化输出:保留两位小数,显示变动金额和百分比
return String.format("花费变动: %.2f元 (%.2f%%)", changeAmount, changeRate);
}
/**
* 分析单个线索成本随日期的变动情况
* @param previousCampaign 上一个日期的广告活动数据(用于比较)
* @return 变动情况描述,包含变动金额和百分比
*/
public String analyzeCostPerLeadChange(AdAdvertisement previousCampaign) {
if (previousCampaign == null) return "无历史数据可供比较";
// 获取当前和上一期的单个线索成本(调用已有的计算方法)
double currentCpl = this.calculateCostPerLead();
double previousCpl = previousCampaign.calculateCostPerLead();
// 防止除以零错误
if (previousCpl <= 0) return "历史单个线索成本为0,无法计算变动率";
double changeAmount = currentCpl - previousCpl;
double changeRate = (changeAmount / previousCpl) * 100;
return String.format("单个线索成本变动: %.2f元 (%.2f%%)", changeAmount, changeRate);
}
/**
* 分析私信消息转化成本随日期的变动情况
* @param previousCampaign 上一个日期的广告活动数据(用于比较)
* @return 变动情况描述,包含变动金额和百分比
*/
public String analyzeMessageCostChange(AdAdvertisement previousCampaign) {
if (previousCampaign == null) return "无历史数据可供比较";
// 获取当前和上一期的私信转化成本(调用已有的计算方法)
double currentCpm = this.calculateCostPerMessage();
double previousCpm = previousCampaign.calculateCostPerMessage();
// 防止除以零错误
if (previousCpm <= 0) return "历史私信转化成本为0,无法计算变动率";
double changeAmount = currentCpm - previousCpm;
double changeRate = (changeAmount / previousCpm) * 100;
return String.format("私信转化成本变动: %.2f元 (%.2f%%)", changeAmount, changeRate);
}
}
- 最后是
DataBoardMavenDbsApplication.java文件
package com.adcampaign;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;
// 核心注解:标记这是一个Spring Boot应用的主配置类
@SpringBootApplication
@RestController
public class DataBoardMavenDbsApplication {
public static void main(String[] args) {
SpringApplication.run(DataBoardMavenDbsApplication.class, args);
}
}
- 接下来就是我们新学的知识啦!不能再简单的复制粘贴了嗷!!进点脑子吧🧠!
- 修改
pom.xml:打开Maven的配置文件,在<dependencies>内新增以下两个依赖,由于在后期我测试的时候发现了依赖冲突的问题,所以大家直接复制全部的pom.xml文件然后粘贴进去就好了。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.10</version> <!-- 与你当前的 spring-orm-6.2.10 版本匹配 -->
<relativePath/> <!-- 从 Maven 仓库获取,而非本地 -->
</parent>
<groupId>com.example</groupId>
<artifactId>Data_Board_Maven_DBS</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Data_Board_Maven_DBS</name>
<description>Demo project for Spring Boot</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Data JPA 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 3. MySQL 驱动(Spring Boot 3.x 需用 mysql-connector-j,而非旧的 mysql-connector-java) -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 记得新增依赖之后要进行下载嗷,通常保存后IDE会自动下载依赖,如果没反应的话,可以右键点击
pom.XML选择MAVEN -> Relod Project - 配置数据库连接 - application.properties:在
src/main/resources目录下找到appication.properties文件,添加以下配置,请将yourpassword替换为你的MySQL的用户密码:
# 配置数据源
spring.datasource.url=jdbc:mysql://localhost:3306/ad_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=yourpassword
# 配置JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
- 关键配置解释:
-
ddl-auto=update:Hibernate会自动根据你的实体类创建或更新数据库表结构。这对于开发非常方便,但生产环境禁用。
-
show-sql=true:在控制台打印Hibernate执行的SQL语句。这是你学习SQL的绝佳机会,一定要打开!
第三步:改造实体类,让它对应数据库表
- 修改之前创建的
AdAdvertisement类,添加JPA注解,修改后的代码为:
package com.adcampaign.entity;
import jakarta.persistence.*;
@Entity // 核心注解:标记这个类是一个JPA实体,它将与数据库表映射
@Table(name = "ad_advertisement") // 指定映射的表名,如果不加,表名默认为类名ad_advertisement
@Access(AccessType.FIELD) // 添加这行明确指定字段访问
/**
* 广告活动数据模型类
* 用于存储广告活动的核心数据,并提供数据计算和分析功能
* 每个实例代表一天的广告活动数据
*/
public class AdAdvertisement {
@Id // 主键注解:标记为主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自增主键注解:指定主键生成策略
private Long id; // 主键ID(自动生成)
// 以下为实体属性
@Column(name = "date") // 指定映射的列名,如果不加,列名默认为属性名
private String date;// 日期(例如:"2023-10-01")
@Column(name = "cost") // 指定映射的列名,如果不加,列名默认为属性名
private double cost;// 广告花费(单位:元)
@Column(name = "lead_count") // 指定映射的列名,如果不加,列名默认为属性名
private int leadCount;// 线索提交个数(用户提交的潜在客户信息数量)
@Column(name = "message_count") // 指定映射的列名,如果不加,列名默认为属性名
private int messageCount;// 私信消息数(收到的用户私信数量)
/**
* 构造方法:创建广告活动数据对象
* @param date 日期字符串
* @param cost 广告花费金额
* @param leadCount 线索数量
* @param messageCount 私信消息数量
*/
public AdAdvertisement(String date, double cost, int leadCount, int messageCount) {
// 调用无参构造方法初始化主键ID
super();
this.date = date;
this.cost = cost;
this.leadCount = leadCount;
this.messageCount = messageCount;
}
public AdAdvertisement() {
}
// Getter方法:获取私有属性的值
public Long getId() { return id; }
public String getDate() { return date; }
public double getCost() { return cost; }
public int getLeadCount() { return leadCount; }
public int getMessageCount() { return messageCount; }
// Setter方法:修改私有属性的值
public void setId(Long id) { this.id = id; }
public void setDate(String date) { this.date = date; }
public void setCost(double cost) { this.cost = cost; }
public void setLeadCount(int leadCount) { this.leadCount = leadCount; }
public void setMessageCount(int messageCount) { this.messageCount = messageCount; }
/**
* 计算单个线索成本
* 公式:单个线索成本 = 广告花费 ÷ 线索数量
* @return 单个线索成本(元/个),如果线索数量为0则返回0
*/
public double calculateCostPerLead() {
// 防止除以零错误:如果线索数为0,返回0
return (leadCount > 0) ? cost / leadCount : 0;
}
/**
* 计算私信消息转化成本
* 公式:私信转化成本 = 广告花费 ÷ 私信消息数
* @return 私信转化成本(元/条),如果私信数为0则返回0
*/
public double calculateCostPerMessage() {
// 防止除以零错误:如果私信数为0,返回0
return (messageCount > 0) ? cost / messageCount : 0;
}
/**
* 分析广告花费随日期的变动情况
* @param previousCampaign 上一个日期的广告活动数据(用于比较)
* @return 变动情况描述,包含变动金额和百分比
*/
public String analyzeCostChange(AdAdvertisement previousCampaign) {
// 检查是否有历史数据可供比较
if (previousCampaign == null) return "无历史数据可供比较";
// 计算变动金额:当前花费 - 上一期花费
double changeAmount = this.cost - previousCampaign.getCost();
// 计算变动百分比:(变动金额 ÷ 上一期花费) × 100%
double changeRate = (changeAmount / previousCampaign.getCost()) * 100;
// 格式化输出:保留两位小数,显示变动金额和百分比
return String.format("花费变动: %.2f元 (%.2f%%)", changeAmount, changeRate);
}
/**
* 分析单个线索成本随日期的变动情况
* @param previousCampaign 上一个日期的广告活动数据(用于比较)
* @return 变动情况描述,包含变动金额和百分比
*/
public String analyzeCostPerLeadChange(AdAdvertisement previousCampaign) {
if (previousCampaign == null) return "无历史数据可供比较";
// 获取当前和上一期的单个线索成本(调用已有的计算方法)
double currentCpl = this.calculateCostPerLead();
double previousCpl = previousCampaign.calculateCostPerLead();
// 防止除以零错误
if (previousCpl <= 0) return "历史单个线索成本为0,无法计算变动率";
double changeAmount = currentCpl - previousCpl;
double changeRate = (changeAmount / previousCpl) * 100;
return String.format("单个线索成本变动: %.2f元 (%.2f%%)", changeAmount, changeRate);
}
/**
* 分析私信消息转化成本随日期的变动情况
* @param previousCampaign 上一个日期的广告活动数据(用于比较)
* @return 变动情况描述,包含变动金额和百分比
*/
public String analyzeMessageCostChange(AdAdvertisement previousCampaign) {
if (previousCampaign == null) return "无历史数据可供比较";
// 获取当前和上一期的私信转化成本(调用已有的计算方法)
double currentCpm = this.calculateCostPerMessage();
double previousCpm = previousCampaign.calculateCostPerMessage();
// 防止除以零错误
if (previousCpm <= 0) return "历史私信转化成本为0,无法计算变动率";
double changeAmount = currentCpm - previousCpm;
double changeRate = (changeAmount / previousCpm) * 100;
return String.format("私信转化成本变动: %.2f元 (%.2f%%)", changeAmount, changeRate);
}
}
第四步:创建数据访问层(Repository)
这是Spring Data JPA的精髓所在,非常简单。
- 创建一个包
repository - 在该包下创建一个接口,名为
AdRepository,让他继承JpaRepository
package com.yourpackage.repository;
import com.yourpackage.entity.AdAdvertisement;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository // 可加可不加,Spring会自动识别
// 继承JpaRepository<实体类类型, 主键类型>
public interface AdRepository extends JpaRepository<AdAdvertisement, Long> {
// 不需要写任何方法!
// 你已经免费获得了:save(), findAll(), findById(), deleteById(), count() 等所有常用方法。
}
第五步:升级控制器(Controller),注入Repository并操作数据
最后修改我们的AdController,不再使用静态列表,而是通过AdRepository与数据库交互,修改后的代码如下所示:
package com.adcampaign.controller;
import com.adcampaign.entity.AdAdvertisement;
import com.adcampaign.repository.AdRepository; // 导入Repository
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/ads")
public class AdController {
// 注入Repository(Spring会自动帮你实例化)
@Autowired
private AdRepository adRepository;
@GetMapping
public List<AdAdvertisement> getAllAds() {
// 查询所有数据
return adRepository.findAll(); // 免费的方法!
}
@PostMapping
public AdAdvertisement createAd(@RequestBody AdAdvertisement newAd) {
// 保存数据到数据库
AdAdvertisement savedAd = adRepository.save(newAd); // 免费的方法!
System.out.println("数据已保存,日期为: " + savedAd.getId());
return savedAd; // 通常返回保存后的对象,它包含了自动生成的主键ID
}
}
第六步:测试与验证
- 启动我们做好的Spring Boot应用。
- 观察控制台日志:
-
- 如果链接成功,你会看到Hibernate自动创建表的SQL语句:
create table ad_advertisement...

- 如果链接成功,你会看到Hibernate自动创建表的SQL语句:
-
- 此时,我们可以利用Navicat Premium查看一下我们的数据库,应该已经多了一张
ad_adverment表了。

- 此时,我们可以利用Navicat Premium查看一下我们的数据库,应该已经多了一张
- 使用Postman测试POST请求:
-
- 发送一个POST请求,Body里带上JSON数据,代码和截图如下:
{
"date": "2025-10.1",
"cost": 200,
"leadCount": 10,
"messageCount": 15
}
-
- 这里id为2的原因是我自己刚才测试了一次了已经,大家第一次填记录应该是1。

- 这里id为2的原因是我自己刚才测试了一次了已经,大家第一次填记录应该是1。
-
- 成功后,检查数据库表,应该多了一条记录。并且响应中会返回带ID的完整对象。相应就是Postman右下的部分。

- 成功后,检查数据库表,应该多了一条记录。并且响应中会返回带ID的完整对象。相应就是Postman右下的部分。
- 使用浏览器测试GET请求:使用浏览器访问
http://localhost:8080/api/ads,你就会看到数据库中所有数据的JOSN数组!

- 至此,我们的程序已经是一个完整的、又前端交互、有后端逻辑、有数据库支撑的“全栈”应用了,这是我们一个非常扎实的项目经验。老规矩,项目放到GitHub里,有需要的同学可以点击Data_Board_Maven_DBS自行翻阅下载,记得给我收藏啊老铁!!
- 接下来,我们整理一下这篇文档中比较重要的东西吧~
总结
我们在这个项目中集成了MySQL,使用了Spring Data JPA。通过定义Entity实体类并继承了JpaRepository接口,就快速实现了数据的持久化和查询操作,极大的提高了开发效率。
Spring Data JPA实现
Spring Data JPA 是 Spring Data 项目的一部分,它通过简化 JPA 的使用,提供了一套便捷的方式来实现对象的持久化,也就是将 Java 对象存储到数据库中以及从数据库中读取数据转换为 Java 对象。以下是 Spring Data JPA 实现对象持久化的具体步骤和关键要素:
- 引入依赖:在 Maven 项目的pom.xml文件中,引入 Spring Data JPA 和数据库驱动依赖。如果是 Spring Boot 项目,只需要添加
spring-boot-starter-data-jpa依赖,它会自动管理相关依赖的版本和传递依赖。 - 配置数据源和 JPA
在 Spring Boot 项目中,通常在application.properties或application.yml文件中配置数据源和 JPA 相关属性。 - 定义实体类(Entity Class)
使用 JPA 的注解将 Java 类标记为实体类,实体类对应数据库中的表,类的属性对应表中的列。关键注解包括: -
@Entity:标记该类为 JPA 实体类。
-
@Id:标记该属性为主键。
-
@Column:用于指定列的详细信息,如名称、长度、是否唯一等(可选)。
- 定义
Repository接口
继承JpaRepository接口,它提供了一系列用于 CRUD(增删改查)操作的默认方法。也可以自定义查询方法,通过方法名约定或使用@Query注解来实现。 - 使用
Repository进行持久化操作
在需要进行持久化操作的组件(如 Service、Controller)中,通过依赖注入的方式使用 Repository 接口,调用其方法实现对象的增删改查: - 事务管理
Spring Data JPA 默认会在 Repository 方法上添加事务管理,确保数据操作的原子性、一致性、隔离性和持久性(ACID 特性)。也可以在 Service 层方法上使用@Transactional注解,显式地控制事务的边界和属性,比如设置事务的传播行为、隔离级别等。
4万+

被折叠的 条评论
为什么被折叠?



