我正在编写我的第一个Spring MVC webapp,并对DAO和Web服务请求有疑问。
基本上我的应用程序允许用户构建一个订单,该订单通过DAO持久保存到数据库。稍后,计划工作人员将从数据库中检索新订单,将其提交给第三方SOAP服务,并使用一些详细信息(例如订单号)更新每个订单。
我的控制器调用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 );
}
}
Order模型如下:
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调用的混合。
我一直在阅读界面,但我不认为他们在这里帮助我,因为我的数据库DAO将包含create(),update(),delete(),它不适用于一个SOAP DAO。
我应该只创建两个DAO:OrderDaoDatabase和OrderDaoSoap?
答案 0 :(得分:1)
使用分层架构的目的是鼓励关注点的分离和分离。您已经拥有服务层来处理业务逻辑和数据访问层(DAO)以与数据库进行通信,这似乎是正确的。 OrderService应与数据库通信,OrderDAO应与数据库通信。
您的预定工作人员似乎是另一个班级。 OrderDAO可以通过不同的方法(您的应用程序需要)公开订单数据。如果placeOrder()
是对外部Web服务的调用,则可以通过OrderService中的适当方法或其他类(如果需要)调用该服务。现在,由于在调用addOrder()
时该调用尚未完成,因此它可能属于调度程序调用的另一种方法。另一方面,我不认为placeOrder()
应该进入OrderDAO
,它应该留给它所说的 - 数据访问对象。