用于 Web 服务和数据库的单一 DAO
Posted
技术标签:
【中文标题】用于 Web 服务和数据库的单一 DAO【英文标题】:Single DAO for webservice and database 【发布时间】:2014-09-19 22:47:41 【问题描述】:我正在编写我的第一个 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 将包含不适用于 SOAP DAO 的 create()、update()、delete()。
我是否应该只创建两个 DAO:OrderDaoDatabase 和 OrderDaoSoap?
【问题讨论】:
你的placeOrder()
和addOrder()
一样吗?在代码中找不到。
【参考方案1】:
使用分层架构的目的是鼓励解耦和关注点分离。您已经拥有处理业务逻辑的服务层和与数据库通信的数据访问层 (DAO),这似乎是正确的。 OrderService 应该与数据库对话,OrderDAO 应该与数据库对话。
您的预定工人似乎是不同的班级。 OrderDAO 可以通过不同的方法(您的应用程序需要)公开订单数据。如果placeOrder()
是对外部Web 服务的调用,则可以从OrderService 中的适当方法或需要时从其他类调用它。现在,由于在调用addOrder()
时没有完成该调用,它可能属于调度程序调用的不同方法。另一方面,我认为placeOrder()
不应该进入OrderDAO
,它应该留给它所说的——数据访问对象。
【讨论】:
以上是关于用于 Web 服务和数据库的单一 DAO的主要内容,如果未能解决你的问题,请参考以下文章
使用 DAO 和 Web 服务的数据库插入方法的 Junit 测试用例