邪修实战系列(4)


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

<?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...
      在这里插入图片描述
    • 此时,我们可以利用Navicat Premium查看一下我们的数据库,应该已经多了一张ad_adverment表了。
      在这里插入图片描述
  • 使用Postman测试POST请求:
    • 发送一个POST请求,Body里带上JSON数据,代码和截图如下:
{
    "date": "2025-10.1",
    "cost": 200,
    "leadCount": 10,
    "messageCount": 15
}
    • 这里id为2的原因是我自己刚才测试了一次了已经,大家第一次填记录应该是1。
      在这里插入图片描述
    • 成功后,检查数据库表,应该多了一条记录。并且响应中会返回带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.propertiesapplication.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注解,显式地控制事务的边界和属性,比如设置事务的传播行为、隔离级别等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fleeheart

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值