程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2023-11-06 08:16     阅读(1061)     评论(0)     点赞(29)     收藏(3)


我正在编写我的第一个 Spring MVC Web 应用程序,并且有一个关于 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 );
    }
}

订单模型如下所示:

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 吗?


解决方案


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

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



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/677582/faa5d2a5e5d50faa7d75/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

29 0
收藏该文
已收藏

评论内容:(最多支持255个字符)