5

这是我第一次使用 DAO 模式。从我目前所读到的,实现这个模式将帮助我将我的调用代码(控制器)与任何持久性实现分开——这正是我想要的;也就是说,我不想被限制使用任何特定的数据库或第 3 方库。

我正在使用 MongoDB 和 morphia(作为示例)以及 morphia 提供的BasicDAO类创建一些测试代码(以 TDD 方式)。

据我所知,扩展BasicDAO<T, V>需要一个接受 Morphia 和 Mongo 对象的构造函数;这些是非常具体的(第 3 方)类型,我真的不想在 DAO 类本身之外四处游荡。

我怎样才能拥有更多的可插拔架构?我的意思是,我应该如何重新配置​​我的应用程序以使用具有特定配置参数的特定 DAO,在实际源之外?

4

4 回答 4

9

“可插入” DAO 层通常/总是基于接口 DAO。例如,让我们考虑一个非常通用的简单的:

public interface GenericDAO <T, K extends Serializable> {  
    List<T> getAll(Class<T> typeClass);   
    T findByKey(Class<T> typeClass, K id);  
    void update(T object);  
    void remove(T object);  
    void insert(T object);  
}

(这就是Morphia 的通用 DAO中的内容)

然后您可以开发不同的几种通用 DAO 实现,您可以在其中找到不同的字段(反映在构造函数参数、setter 和 getter 等中)。让我们假设一个基于 JDBC 的:

public class GenericDAOJDBCImpl<T, K extends Serializable> implements GenericDAO<T, K extends Serializable> {
    private String db_url;

    private Connection;
    private PreparedStatement insert;
    // etc.
}

一旦实现了通用 DAO(对于具体的数据存储),获得具体的 DAO 将不费吹灰之力:

public interface PersonDAO extends GenericDAO<Person, Long> {

}

public class PersonDAOJDBCImpl extends GenericDAOJDBCImpl<Person, Long> implements PersonDAO {

}

(顺便说一句,你在Morphia 的 BasicDAO中拥有的是 MongoDB 的通用 DAO 的实现)。

可插拔架构中的第二件事是选择具体的 DAO 实现。我建议您阅读Apress: Pro Spring 2.5的第 2 章(“将 Spring 放入“Hello World”),以逐步了解工厂和依赖注入。

于 2011-11-08T11:58:57.877 回答
1

Spring 使用配置为您执行 DI,它被广泛使用。

于 2011-11-08T11:51:53.820 回答
1

嗨,我不是 java 专家。但试图给出一个解决方案。

你可以有一个超类,所有与连接相关的东西都发生在这个超类中,你可以拥有一个可以扩展和使用它的任何其他基类。

稍后,您可以在数据库中针对特定的 3rd 方驱动程序进行任何切换,您可以重写超类。

我又不是专家。只是想在这里学习。:)

于 2011-11-08T11:56:33.417 回答
0

几个标准的 DI 框架是 Spring 和 Guice。这两个框架都促进了 TDD。

于 2011-11-08T11:40:31.763 回答