用于 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 测试用例

在 Android 项目上实现 DAO 模式

java web-----DAO设计模式(数据库访问)

web添加学生信息(首发web)

跨多个 Web 应用程序使用 dao 的 shiro 会话存储

我们为什么要用springcloud?