Spring Boot 和 Spring Data JPA 在订单管理系统中的应用

Spring Boot 和 Spring Data JPA 是构建高效、易于维护的应用程序的强大工具组合。在这篇文章中,我们将展示如何使用这些技术来实现一个简单的在线商店订单管理系统。

目标

本教程的目标是演示如何使用 Spring Boot 和 Spring Data JPA 来处理以下订单管理任务:

  • 插入订单
  • 查询两个日期之间的订单
  • 查询最新的订单
  • 查询大于某个金额的订单
  • 根据订单状态查询订单
  • 根据用户名修改订单状态
  • 根据订单号修改订单信息

环境准备

确保你的开发环境中安装了以下软件:

  • Java 11 或更高版本
  • Maven
  • Spring Boot
  • 数据库(例如 PostgreSQL 或 MySQL)

实体定义

首先,我们需要定义应用程序中涉及的主要实体类:User, Order, OrderItem。

User实体

复制代码
java

深色版本

复制代码
1@Entity
2public class User {
3    @Id
4    @GeneratedValue(strategy = GenerationType.IDENTITY)
5    private Long id;
6    private String username;
7
8    // Getters and Setters
9}

Order实体

复制代码
java

深色版本

复制代码
1@Entity
2public class Order {
3    @Id
4    @GeneratedValue(strategy = GenerationType.IDENTITY)
5    private Long id;
6    @ManyToOne
7    private User user;
8    private LocalDate orderDate;
9    private BigDecimal totalAmount;
10    private OrderStatus status; // Enum: NEW, PAID, SHIPPED, DELIVERED, CANCELLED
11
12    // Getters and Setters
13}
14
15enum OrderStatus {
16    NEW, PAID, SHIPPED, DELIVERED, CANCELLED
17}

OrderItem实体

复制代码
java

深色版本

复制代码
1@Entity
2public class OrderItem {
3    @Id
4    @GeneratedValue(strategy = GenerationType.IDENTITY)
5    private Long id;
6    @ManyToOne
7    private Order order;
8    private String productName;
9    private Integer quantity;
10    private BigDecimal price;
11
12    // Getters and Setters
13}

存储库接口

接下来,定义 OrderRepository 接口来处理与数据库相关的操作。

OrderRepository接口

复制代码
java

深色版本

复制代码
1public interface OrderRepository extends JpaRepository<Order, Long> {
2    List<Order> findByOrderDateBetween(LocalDate startDate, LocalDate endDate);
3    List<Order> findByTotalAmountGreaterThan(BigDecimal amount);
4    List<Order> findByStatus(OrderStatus status);
5    Optional<Order> findByIdAndUser(Long id, User user);
6
7    @Modifying
8    @Transactional
9    @Query("UPDATE Order o SET o.status = ?1 WHERE o.id = ?2")
10    int updateStatusById(OrderStatus status, Long id);
11
12    @Modifying
13    @Transactional
14    @Query("UPDATE Order o SET o.totalAmount = ?1 WHERE o.id = ?2")
15    int updateTotalAmountById(BigDecimal totalAmount, Long id);
16
17    @Modifying
18    @Transactional
19    @Query("UPDATE Order o SET o.orderDate = ?1 WHERE o.id = ?2")
20    int updateOrderDateById(LocalDate orderDate, Long id);
21}

服务层实现

在服务层中,我们将实现具体的业务逻辑。

OrderService类

复制代码
java

深色版本

复制代码
1@Service
2public class OrderService {
3
4    @Autowired
5    private OrderRepository orderRepository;
6
7    public List<Order> findOrdersBetweenDates(LocalDate startDate, LocalDate endDate) {
8        return orderRepository.findByOrderDateBetween(startDate, endDate);
9    }
10
11    public List<Order> findLatestOrders(int count) {
12        return orderRepository.findAll(Sort.by(Sort.Direction.DESC, "orderDate")).stream()
13                .limit(count)
14                .collect(Collectors.toList());
15    }
16
17    public List<Order> findOrdersGreaterThan(BigDecimal amount) {
18        return orderRepository.findByTotalAmountGreaterThan(amount);
19    }
20
21    public List<Order> findOrdersByStatus(OrderStatus status) {
22        return orderRepository.findByStatus(status);
23    }
24
25    public void updateOrderStatusById(Long orderId, OrderStatus newStatus) {
26        orderRepository.updateStatusById(newStatus, orderId);
27    }
28
29    public void updateTotalAmountById(Long orderId, BigDecimal newTotalAmount) {
30        orderRepository.updateTotalAmountById(newTotalAmount, orderId);
31    }
32
33    public void updateOrderDateById(Long orderId, LocalDate newOrderDate) {
34        orderRepository.updateOrderDateById(newOrderDate, orderId);
35    }
36
37    public void createOrder(Order order) {
38        orderRepository.save(order);
39    }
40}

控制器层

最后,我们将在控制器层中提供 RESTful API 来处理前端请求。

OrderController类

复制代码
java

深色版本

复制代码
1@RestController
2@RequestMapping("/orders")
3public class OrderController {
4
5    @Autowired
6    private OrderService orderService;
7
8    @GetMapping("/between-dates")
9    public List<Order> findOrdersBetweenDates(@RequestParam LocalDate startDate, @RequestParam LocalDate endDate) {
10        return orderService.findOrdersBetweenDates(startDate, endDate);
11    }
12
13    @GetMapping("/latest")
14    public List<Order> findLatestOrders(@RequestParam int count) {
15        return orderService.findLatestOrders(count);
16    }
17
18    @GetMapping("/greater-than")
19    public List<Order> findOrdersGreaterThan(@RequestParam BigDecimal amount) {
20        return orderService.findOrdersGreaterThan(amount);
21    }
22
23    @GetMapping("/status")
24    public List<Order> findOrdersByStatus(@RequestParam OrderStatus status) {
25        return orderService.findOrdersByStatus(status);
26    }
27
28    @PutMapping("/{orderId}/status")
29    public ResponseEntity<String> updateOrderStatusById(@PathVariable Long orderId,
30                                                        @RequestParam OrderStatus newStatus) {
31        orderService.updateOrderStatusById(orderId, newStatus);
32        return ResponseEntity.ok("Order status updated");
33    }
34
35    @PutMapping("/{orderId}/total-amount")
36    public ResponseEntity<String> updateTotalAmountById(@PathVariable Long orderId,
37                                                        @RequestParam BigDecimal newTotalAmount) {
38        orderService.updateTotalAmountById(orderId, newTotalAmount);
39        return ResponseEntity.ok("Order total amount updated");
40    }
41
42    @PutMapping("/{orderId}/order-date")
43    public ResponseEntity<String> updateOrderDateById(@PathVariable Long orderId,
44                                                      @RequestParam LocalDate newOrderDate) {
45        orderService.updateOrderDateById(orderId, newOrderDate);
46        return ResponseEntity.ok("Order date updated");
47    }
48
49    @PostMapping
50    public Order createOrder(@RequestBody Order order) {
51        return orderService.createOrder(order);
52    }
53}

总结

在这篇文章中,我们介绍了如何使用 Spring Boot 和 Spring Data JPA 来实现一个简单的在线商店订单管理系统。我们定义了实体类、存储库接口、服务层以及控制器层。此外,我们还展示了如何执行常见的数据库操作,包括插入、查询和更新数据。

通过这些示例,你应该能够理解 Spring Data JPA 如何简化数据访问层的开发工作,并为自己的项目提供一个良好的起点。

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm