gpt4 book ai didi

java - 用于 Web 服务和数据库的单一 DAO

转载 作者:行者123 更新时间:2023-12-01 12:42:07 25 4
gpt4 key购买 nike

我正在编写我的第一个 Spring MVC Web 应用程序,并且有一个关于 DAO 和 Web 服务请求的问题。

本质上,我的应用程序允许用户构建订单,该订单通过 DAO 持久保存到数据库中。稍后,计划工作人员将从数据库中检索新订单,将其提交给第三方 SOAP 服务,并使用一些详细信息(例如订单号)更新每个订单。

我的 Controller 调用 OrderService(精简版本):

@Service
public class OrderService {

@Autowired
private OrderDao orderDao;

public List<Order> getOrderList() {

List<Order> orders = orderDao.getAllOrders();

return orders;
}

public void addNewOrder(Order order) {

orderDao.addOrder(order);
}
}

OrderService 调用 OrderDao:

@Repository
public class OrderDao extends JdbcDaoSupport {

@Autowired
public OrderDao(DataSource dataSource) {
setDataSource(dataSource);
}

public List<Order> getAllOrders() {

String sqlQuery = "SELECT id, name, status, orderNumber FROM orders";

List<Order> orders = getJdbcTemplate().query(sqlQuery, new OrderRowMapper());

return orders;

}

public int addOrder(Order order) {

String sqlQuery = "INSERT INTO orders (name, status) VALUES (?, ?)";

getJdbcTemplate().update(sqlQuery, new Object[] { order.getName(), order.getStatus() });

return getJdbcTemplate().queryForObject("SELECT LAST_INSERT_ID()", Integer.class );
}
}

订单模型如下所示:

public class Order {

private int orderId;
private String name;
private String status;
private String orderNumber;

// getters and setters etc.
}

目前我的 OrderDao 仅与数据库通信以对 Order 模型执行 CRUD 操作。我不确定是否应该在 OrderDao 中创建一个 placeOrder() 方法,因为这意味着我有一个同时访问数据库和 SOAP 服务的 DAO,这感觉不对。

将 placeOrder() 放在 OrderService 中也感觉不对,因为该服务将包含内部 DAO 调用和外部第三方 SOAP 调用的混合体。

我一直在阅读有关接口(interface)的内容,但我认为它们对我没有帮助,因为我的数据库 DAO 将包含 create()、update()、delete(),这些不适用于 SOAP DAO。

我应该创建两个 DAO:OrderDaoDatabase 和 OrderDaoSoap 吗?

最佳答案

使用分层架构的目的是鼓励解耦和关注点分离。您已经拥有了负责业务逻辑的服务层和与数据库进行通信的数据访问层 (DAO),这似乎是正确的。 OrderService 应该与数据库通信,OrderDAO 应该与数据库通信。

你的预定 worker 似乎是一个不同的阶层。 OrderDAO 可以通过不同的方法公开订单数据(这是您的应用程序所需的)。如果 placeOrder() 是对外部 Web 服务的调用,则可以从 OrderService 中的适当方法或不同的类(如果需要)调用该方法。现在,由于调用 addOrder() 时尚未完成该调用,因此它可能属于由调度程序调用的不同方法。另一方面,我认为 placeOrder() 不应该进入 OrderDAO,它应该保留它所说的 - 数据访问对象。

关于java - 用于 Web 服务和数据库的单一 DAO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25000481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com