SpringBoot实战——JPA操作存储过程

发布于:2025-04-01 ⋅ 阅读:(24) ⋅ 点赞:(0)

本文将深入探讨如何在SpringBoot项目中使用JPA中操作存储过程,获得业务中需要的数据。

一、表设计与存储过程创建

创建商品表 products 用于存储商品信息。

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    stock INT NOT NULL
);

存储过程创建

1. 不带参数,返回多条数据

创建一个存储过程GetAllProducts用于返回所有商品信息。

DELIMITER //
CREATE PROCEDURE GetAllProducts()
BEGIN
    SELECT * FROM products;
END //
DELIMITER ;
2. 带参数,返回单条数据

创建一个存储过程GetProductById根据商品ID获取单条商品信息。

DELIMITER //
CREATE PROCEDURE GetProductById(IN productId INT)
BEGIN
    SELECT * FROM products WHERE id = productId;
END //
DELIMITER ;
3. 带参数,返回多条数据

创建一个存储过程GetProductsByPriceThreshold返回价格大于某价格的商品信息。

DELIMITER //
CREATE PROCEDURE GetProductsByPriceThreshold(IN priceThreshold DECIMAL(10, 2))
BEGIN
    SELECT * FROM products WHERE price > priceThreshold;
END //
DELIMITER ;



二、实体类定义

定义 Product 实体类来映射数据库中的 products 表。

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.math.BigDecimal;

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private BigDecimal price;
    private Integer stock;

    public Product() {
    }

    public Product(String name, BigDecimal price, Integer stock) {
        this.name = name;
        this.price = price;
        this.stock = stock;
    }

    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 BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public Integer getStock() {
        return stock;
    }

    public void setStock(Integer stock) {
        this.stock = stock;
    }

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



三、使用JPA调用存储过程

1. 不带参数,返回多条数据

ProductRepository 接口中使用 @Procedure 注解调用 GetAllProducts 存储过程。

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Procedure;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
    @Procedure(name = "GetAllProducts")
    List<Product> getAllProducts();
}

2. 带参数,返回单条数据

ProductRepository 接口中添加调用 GetProductById 存储过程的方法。

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Procedure;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
    @Procedure(name = "GetAllProducts")
    List<Product> getAllProducts();

    @Procedure(name = "GetProductById")
    Optional<Product> getProductById(Long productId);
}

3. 带参数,返回多条数据

ProductRepository 接口中添加调用 GetProductsByPriceThreshold 存储过程的方法。

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Procedure;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
    @Procedure(name = "GetAllProducts")
    List<Product> getAllProducts();

    @Procedure(name = "GetProductById")
    Optional<Product> getProductById(Long productId);

    @Procedure(name = "GetProductsByPriceThreshold")
    List<Product> getProductsByPriceThreshold(BigDecimal priceThreshold);
}



← 上一篇 Java进阶——常用类及常用方法详解
记得点赞、关注、收藏哦!
下一篇 Java进阶——数组超详细整理 →