用于Web服务和数据库的单个DAO

时间:2014-07-28 17:09:32

标签: java spring-mvc design-patterns dao

我正在编写我的第一个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?

1 个答案:

答案 0 :(得分:1)

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

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