0Pricing
Spring Boot 4 Microservices & REST APIs · 课时

执行增删改查操作

使用 Spring Data JPA 强大的存储库方法,实现创建、读取、更新和删除操作。

执行增删改查操作 是 CoddyKit 上的免费 Spring Boot 4 Microservices & REST APIs 课时。 这是第 6 节课,共 6 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Spring Boot 4 Microservices & REST APIs 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Spring Boot 4 Microservices & REST APIs 课程共包含 6 节课。

本课时的部分内容尚未翻译,以英文显示。

CRUD Operations: The Core

Welcome to the heart of data management! Today, we'll master CRUD operations with Spring Data JPA. CRUD is a fundamental concept for almost any application that interacts with a database.

  • Create: Adding new data.
  • Read: Retrieving existing data.
  • Update: Modifying existing data.
  • Delete: Removing data.

Spring Data JPA provides powerful, easy-to-use methods for all of these!

Our Example Setup: Product

To demonstrate CRUD, we'll use a simple Product entity and its corresponding repository. You would have learned to set these up in previous lessons.

Here's our basic Product entity and ProductRepository interface:

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    public Product() {}
    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    // Getters and Setters (omitted for brevity)
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public double getPrice() { return price; }
    public void setPrice(double price) { this.price = price; }

    @Override
    public String toString() {
        return "Product{id=" + id + ", name='" + name + "', price=" + price + "}";
    }
}

// ProductRepository.java
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
}

Creating New Data (C)

To create new data, we use the save() method from our repository. If the entity's ID is null (or 0 for primitive types), Spring Data JPA knows it's a new entry and will insert it into the database.

Try creating a new product:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Entity
class Product {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
    public Product() {}
    public Product(String name, double price) {
        this.name = name; this.price = price;
    }
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public double getPrice() { return price; }
    public void setPrice(double price) { this.price = price; }
    @Override
    public String toString() { return "Product{id=" + id + ", name='" + name + "', price=" + price + "}"; }
}

@Repository
interface ProductRepository extends JpaRepository<Product, Long> {}

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Main.class, args);
        ProductRepository productRepository = context.getBean(ProductRepository.class);

        Product newProduct = new Product("Laptop", 1200.00);
        Product savedProduct = productRepository.save(newProduct);
        System.out.println("Created: " + savedProduct);
    }
}

Reading Data by ID (R)

To read a specific item, you often need its unique identifier (ID). The findById(ID id) method is perfect for this. It returns an Optional, which helps handle cases where the item might not exist.

Let's find the product we just created:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;

@Entity
class Product {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
    public Product() {}
    public Product(String name, double price) {
        this.name = name; this.price = price;
    }
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public double getPrice() { return price; }
    public void setPrice(double price) { this.price = price; }
    @Override
    public String toString() { return "Product{id=" + id + ", name='" + name + "', price=" + price + "}"; }
}

@Repository
interface ProductRepository extends JpaRepository<Product, Long> {}

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Main.class, args);
        ProductRepository productRepository = context.getBean(ProductRepository.class);

        Product newProduct = new Product("Keyboard", 75.00);
        Product savedProduct = productRepository.save(newProduct);
        System.out.println("Created: " + savedProduct);

        Optional<Product> foundProduct = productRepository.findById(savedProduct.getId());
        foundProduct.ifPresent(p -> System.out.println("Found: " + p));
    }
}

Reading All Data (R)

What if you want to see all the products in your database? The findAll() method does exactly that! It returns a List of all entities of that type.

Let's retrieve all products:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;

@Entity
class Product {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
    public Product() {}
    public Product(String name, double price) {
        this.name = name; this.price = price;
    }
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public double getPrice() { return price; }
    public void setPrice(double price) { this.price = price; }
    @Override
    public String toString() { return "Product{id=" + id + ", name='" + name + "', price=" + price + "}"; }
}

@Repository
interface ProductRepository extends JpaRepository<Product, Long> {}

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Main.class, args);
        ProductRepository productRepository = context.getBean(ProductRepository.class);

        productRepository.save(new Product("Mouse", 25.00));
        productRepository.save(new Product("Monitor", 300.00));

        List<Product> allProducts = productRepository.findAll();
        System.out.println("All Products:");
        allProducts.forEach(System.out::println);
    }
}

Updating Existing Data (U)

To update an existing item, you first retrieve it, modify its properties, and then call save() again. Spring Data JPA detects that the entity already has an ID, so it performs an update instead of an insert.

Let's update a product's price:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Entity
class Product {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
    public Product() {}
    public Product(String name, double price) {
        this.name = name; this.price = price;
    }
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public double getPrice() { return price; }
    public void setPrice(double price) { this.price = price; }
    @Override
    public String toString() { return "Product{id=" + id + ", name='" + name + "', price=" + price + "}"; }
}

@Repository
interface ProductRepository extends JpaRepository<Product, Long> {}

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Main.class, args);
        ProductRepository productRepository = context.getBean(ProductRepository.class);

        Product existingProduct = new Product("Headphones", 150.00);
        productRepository.save(existingProduct);
        System.out.println("Original: " + existingProduct);

        existingProduct.setPrice(120.00); // Update the price
        Product updatedProduct = productRepository.save(existingProduct);
        System.out.println("Updated: " + updatedProduct);
    }
}

Deleting Data by ID (D)

To delete an item, you can use its ID with the deleteById(ID id) method. This is a common way to remove a specific record from the database.

Let's delete a product by its ID:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Entity
class Product {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
    public Product() {}
    public Product(String name, double price) {
        this.name = name; this.price = price;
    }
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public double getPrice() { return price; }
    public void setPrice(double price) { this.price = price; }
    @Override
    public String toString() { return "Product{id=" + id + ", name='" + name + "', price=" + price + "}"; }
}

@Repository
interface ProductRepository extends JpaRepository<Product, Long> {}

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Main.class, args);
        ProductRepository productRepository = context.getBean(ProductRepository.class);

        Product productToDelete = new Product("Webcam", 50.00);
        productRepository.save(productToDelete);
        System.out.println("Product to delete: " + productToDelete);

        productRepository.deleteById(productToDelete.getId());
        System.out.println("Is product deleted? " + !productRepository.existsById(productToDelete.getId()));
    }
}

Deleting an Entity Object (D)

Alternatively, you can delete an entity by passing the actual entity object to the delete(T entity) method. This is useful if you've already retrieved the object and want to remove it.

Let's delete a product using its object:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Entity
class Product {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
    public Product() {}
    public Product(String name, double price) {
        this.name = name; this.price = price;
    }
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public double getPrice() { return price; }
    public void setPrice(double price) { this.price = price; }
    @Override
    public String toString() { return "Product{id=" + id + ", name='" + name + "', price=" + price + "}"; }
}

@Repository
interface ProductRepository extends JpaRepository<Product, Long> {}

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Main.class, args);
        ProductRepository productRepository = context.getBean(ProductRepository.class);

        Product productToRemove = new Product("Microphone", 80.00);
        productRepository.save(productToRemove);
        System.out.println("Product to remove: " + productToRemove);

        productRepository.delete(productToRemove);
        System.out.println("Is product removed? " + !productRepository.existsById(productToRemove.getId()));
    }
}

Beyond Basic: Derived Query Methods

While findById() and findAll() are great, Spring Data JPA offers even more! You can define custom derived query methods directly in your repository interface.

  • Spring automatically generates the query based on the method name.
  • For example, findByName(String name) will find products by their name.
  • This simplifies common read operations without writing SQL!

We'll explore more complex custom queries in a future lesson.

Quick Check: CRUD Actions

Which of the following Spring Data JPA repository methods are used for reading existing data?

Recap: Mastering CRUD

Congratulations! You've learned how to perform the essential CRUD operations using Spring Data JPA. These methods are the backbone of almost any data-driven application.

  • Create/Update: Use repository.save(entity).
  • Read: Use repository.findById(id) for single items and repository.findAll() for all items.
  • Delete: Use repository.deleteById(id) or repository.delete(entity).

With these powerful repository methods, you can efficiently manage your application's data!

常见问题解答

「执行增删改查操作」课时是免费的吗?

是的 — 「执行增删改查操作」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Spring Boot 4 Microservices & REST APIs 课程的其余内容,请升级到 CoddyKit PRO。 Spring Boot 4 Microservices & REST APIs 课程共包含 6 节课。

「执行增删改查操作」这节课中我会学到什么?

使用 Spring Data JPA 强大的存储库方法,实现创建、读取、更新和删除操作。 你通过在浏览器中直接运行的动手代码来练习 Spring Boot 4 Microservices & REST APIs,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Spring Boot 4 Microservices & REST APIs 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Spring Boot 4 Microservices & REST APIs 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 6 节课,共 6 节。

「执行增删改查操作」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Spring Boot 4 Microservices & REST APIs 课中编写并运行代码吗?

能。每节 Spring Boot 4 Microservices & REST APIs 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 集成 H2 数据库与 JPA
  2. Spring Data JPA 简介
  3. 创建实体与存储库
  4. 定义实体与存储库
  5. 使用 REST 执行 CRUD 操作
  6. 执行增删改查操作
← 返回 Spring Boot 4 Microservices & REST APIs