主从表设计在Java中的实现

在实际的软件开发过程中,数据库设计是非常关键的一环。主从表设计(Master-Slave Table Design)是一种常见的数据建模方式,用于处理一对多关系。在本文中,我们将一起探讨如何在Java中实现主从表设计的代码。

主从表设计流程

为了更好地理解整个实现过程,下面是我们将要进行的步骤:

步骤 描述
1 确定数据模型和表结构
2 创建数据库表和实体类
3 编写数据访问层(DAO)接口和实现
4 编写服务层(Service)
5 编写控制层(Controller)
6 测试和验证

步骤详解

1. 确定数据模型和表结构

我们先来设计主表和从表的关系。在这个例子中,我们的主表是 Order(订单),从表是 OrderItem(订单项)。每个订单可以有多个订单项。

关系图
erDiagram
    ORDER {
        int id PK "订单ID"
        string customerName "客户姓名"
    }
    ORDERITEM {
        int id PK "订单项ID"
        int orderId FK "订单ID"
        string productName "产品名称"
        float price "产品价格"
    }
    ORDER ||--o{ ORDERITEM : contains

2. 创建数据库表和实体类

在数据库中创建两个表:

CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    customer_name VARCHAR(100) NOT NULL
);

CREATE TABLE order_items (
    id INT PRIMARY KEY AUTO_INCREMENT,
    order_id INT,
    product_name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES orders(id)
);

接下来,我们使用Java创建实体类:

// Order.java
public class Order {
    private int id;                // 订单ID
    private String customerName;   // 客户姓名

    // getters 和 setters

    public int getId() {
        return id;
    }

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

    public String getCustomerName() {
        return customerName;
    }

    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }
}

// OrderItem.java
public class OrderItem {
    private int id;              // 订单项ID
    private int orderId;        // 订单ID
    private String productName;  // 产品名称
    private double price;        // 产品价格

    // getters 和 setters
}

3. 编写数据访问层(DAO)

我们为 OrderOrderItem 编写 DAO 接口和实现,使用 JDBC 进行数据库操作。

// OrderDAO.java
public interface OrderDAO {
    void save(Order order);    // 保存订单
    Order findById(int id);    // 根据ID查找订单
}

// OrderDAOImpl.java
import java.sql.*;

public class OrderDAOImpl implements OrderDAO {
    private Connection connection; // 数据库连接

    public OrderDAOImpl(Connection connection) {
        this.connection = connection;
    }

    @Override
    public void save(Order order) {
        // 保存订单到数据库
        String sql = "INSERT INTO orders (customer_name) VALUES (?)";
        try (PreparedStatement stmt = connection.prepareStatement(sql)) {
            stmt.setString(1, order.getCustomerName());
            stmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public Order findById(int id) {
        String sql = "SELECT * FROM orders WHERE id = ?";
        Order order = null;
        try (PreparedStatement stmt = connection.prepareStatement(sql)) {
            stmt.setInt(1, id);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                order = new Order();
                order.setId(rs.getInt("id"));
                order.setCustomerName(rs.getString("customer_name"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return order;
    }
}

4. 编写服务层(Service)

接下来,我们创建服务层,封装业务逻辑:

// OrderService.java
public class OrderService {
    private OrderDAO orderDAO;

    public OrderService(OrderDAO orderDAO) {
        this.orderDAO = orderDAO;
    }

    public void createOrder(Order order) {
        orderDAO.save(order); // 创建订单
    }

    public Order getOrder(int id) {
        return orderDAO.findById(id); // 获取订单
    }
}

5. 编写控制层(Controller)

最后,在控制层中处理 HTTP 请求:

// OrderController.java
import org.springframework.web.bind.annotation.*;

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

    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }

    @PostMapping
    public void createOrder(@RequestBody Order order) {
        orderService.createOrder(order); // 创建订单
    }

    @GetMapping("/{id}")
    public Order getOrder(@PathVariable int id) {
        return orderService.getOrder(id); // 获取订单
    }
}

6. 测试和验证

在完成以上步骤后,您需要进行测试以确保系统的正确性。可以使用任何适合的测试框架,如 JUnit 或 Spring Test。

结语

通过以上步骤,我们成功实现了一个简单的主从表设计。这里涉及到的内容包括数据库设计、实体类创建、数据访问、服务封装和控制层。深入掌握这些概念和代码,对于您未来的软件开发将大大提高效率和质量。希望这篇文章能够帮助您更好地理解主从表设计的实现。如果您有任何疑问,请随时向我咨询!