当前位置: 首页 > article >正文

使用Spring Boot构建电商订单系统API的实践

以下是使用 Spring Boot 构建电商订单系统 API 的详细实践步骤:

1. 项目初始化

首先,你可以使用 Spring Initializr(https://start.spring.io/ )来创建一个新的 Spring Boot 项目。在创建项目时,选择以下依赖:

  • Spring Web:用于构建 RESTful API。
  • Spring Data JPA:用于与数据库交互。
  • H2 Database(开发环境使用):一个轻量级的嵌入式数据库。

2. 数据库设计

订单系统通常涉及几个关键实体:用户、商品、订单和订单项。以下是使用 JPA 注解定义的实体类示例:

用户实体类(User.java)
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String email;

    // 构造函数、Getter 和 Setter 方法
    public User() {}

    public User(String username, String email) {
        this.username = username;
        this.email = email;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
商品实体类(Product.java)

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;

    // 构造函数、Getter 和 Setter 方法
    public Product() {}

    public Product(String name, BigDecimal 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 BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }
}
订单实体类(Order.java)

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToOne
    private User user;
    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();

    // 构造函数、Getter 和 Setter 方法
    public Order() {}

    public Order(User user) {
        this.user = user;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public List<OrderItem> getOrderItems() {
        return orderItems;
    }

    public void setOrderItems(List<OrderItem> orderItems) {
        this.orderItems = orderItems;
    }
}
订单项实体类(OrderItem.java)
import javax.persistence.*;
import java.math.BigDecimal;

@Entity
public class OrderItem {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToOne
    private Product product;
    private int quantity;
    private BigDecimal totalPrice;
    @ManyToOne
    private Order order;

    // 构造函数、Getter 和 Setter 方法
    public OrderItem() {}

    public OrderItem(Product product, int quantity, Order order) {
        this.product = product;
        this.quantity = quantity;
        this.totalPrice = product.getPrice().multiply(BigDecimal.valueOf(quantity));
        this.order = order;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Product getProduct() {
        return product;
    }

    public void setProduct(Product product) {
        this.product = product;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public BigDecimal getTotalPrice() {
        return totalPrice;
    }

    public void setTotalPrice(BigDecimal totalPrice) {
        this.totalPrice = totalPrice;
    }

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }
}

3. 创建 Repository 接口

为每个实体类创建对应的 Repository 接口,用于与数据库进行交互。

UserRepository.java
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Long> {
}
ProductRepository.java
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Long> {
}
OrderRepository.java
import org.springframework.data.jpa.repository.JpaRepository;

public interface OrderRepository extends JpaRepository<Order, Long> {
}

4. 创建 Service 层

Service 层负责处理业务逻辑。以下是一个简单的订单服务示例:

OrderService.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class OrderService {
    @Autowired
    private OrderRepository orderRepository;

    public Order createOrder(Order order) {
        return orderRepository.save(order);
    }

    public Order getOrderById(Long id) {
        return orderRepository.findById(id).orElse(null);
    }

    public List<Order> getAllOrders() {
        return orderRepository.findAll();
    }
}

5. 创建 Controller 层

Controller 层负责处理 HTTP 请求,并调用 Service 层的方法。

OrderController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/orders")
public class OrderController {
    @Autowired
    private OrderService orderService;

    @PostMapping
    public ResponseEntity<Order> createOrder(@RequestBody Order order) {
        Order createdOrder = orderService.createOrder(order);
        return new ResponseEntity<>(createdOrder, HttpStatus.CREATED);
    }

    @GetMapping("/{id}")
    public ResponseEntity<Order> getOrderById(@PathVariable Long id) {
        Order order = orderService.getOrderById(id);
        if (order != null) {
            return new ResponseEntity<>(order, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    @GetMapping
    public ResponseEntity<List<Order>> getAllOrders() {
        List<Order> orders = orderService.getAllOrders();
        return new ResponseEntity<>(orders, HttpStatus.OK);
    }
}

6. 配置数据库

在 application.properties 中配置 H2 数据库:

展开

7. 运行项目并测试 API

启动 Spring Boot 应用程序,你可以使用 Postman 或其他 API 测试工具来测试以下 API 端点:

通过以上步骤,你就可以使用 Spring Boot 构建一个简单的电商订单系统 API。在实际项目中,你可能还需要添加更多的功能,如订单状态管理、支付集成、错误处理等。

  • 创建订单POST http://localhost:8080/orders
    请求体示例:
  • {
        "user": {
            "id": 1,
            "username": "john_doe",
            "email": "john@example.com"
        },
        "orderItems": [
            {
                "product": {
                    "id": 1,
                    "name": "iPhone",
                    "price": 999.99
                },
                "quantity": 1
            }
        ]
    }

  • 获取单个订单GET http://localhost:8080/orders/1
  • 获取所有订单GET http://localhost:8080/orders

  •  

http://www.kler.cn/a/555116.html

相关文章:

  • 磐维数据库双中心容灾流复制集群搭建
  • dockerfile 使用环境变量
  • 新品 | 杰和科技最新发布搭载英特尔N95处理器的一体机主板CB4-208-U1
  • STL 在线转 3MF,开启 3D 模型转换新体验
  • PLC通信交互系统技术分享
  • 为AI聊天工具添加一个知识系统 之113 详细设计之54 Chance:偶然和适配 之2
  • 解决OpenEuler系统修改句柄无效的问题
  • 14.2 Auto-GPT 开源项目深度解析:从代码架构到二次开发实践
  • 理解都远正态分布中指数项的精度矩阵(协方差逆矩阵)
  • 利用Java爬虫精准获取商品SKU详细信息:实战案例指南
  • Ubuntu 安装 OpenCV (C++)
  • 前端性能测试优化案例
  • kettle从入门到精通 第九十二课 ETL之kettle 使用Kettle的Carte对外发布读写接口
  • 【论文技巧】Mermaid VSCode插件制作流程图保存方法
  • [Android] APK提取器(1.3.7)版本
  • 如何组织和管理JavaScript文件:最佳实践与策略
  • 泰山派RK3566移植QT,动鼠标时出现屏幕闪烁
  • #渗透测试#批量漏洞挖掘#畅捷通T+远程命令执行漏洞
  • 使用 Docker 部署 Flask 应用
  • DeepSeek 对低代码产品的影响:机遇、挑战与未来展望