java – DAO只能访问数据库吗?

我一直在研究我的设计模式,并想到我无法在任何地方找到一个好的答案.所以也许有经验的人可以帮助我.DAO模式是否仅用于访问数据库中的数据?我发现的大多数答案都暗示是;事实上,大多数谈论或写入DAO模式的人都倾向于...

我一直在研究我的设计模式,并想到我无法在任何地方找到一个好的答案.所以也许有经验的人可以帮助我.

DAO模式是否仅用于访问数据库中的数据?

我发现的大多数答案都暗示是;事实上,大多数谈论或写入DAO模式的人都倾向于自动假设您正在使用某种数据库.

我不同意.我可以有一个DAO如下:

public interface CountryData {
    public List<Country> getByCriteria(Criteria criteria);
}

public final class SQLCountryData implements CountryData {
    public List<Country> getByCriteria(Criteria criteria) {
        // Get From SQL Database.
    }
}

public final class GraphCountryData implements CountryData {
    public List<Country> getByCriteria(Criteria criteria) {
        // Get From an Injected In-Memory Graph Data Structure.
    }
}

这里我有一个DAO接口和2个实现,一个用于SQL数据库,另一个用于内存图形数据结构.它是否正确?或者图表实现是否意味着在其他类别的图层中创建?

如果它是正确的,那么抽象每个DAO实现所需的实现特定细节的最佳方法是什么?

例如,参考上面的Criteria Class I参考.假设它是这样的:

public final class Criteria {
    private String countryName;

    public String getCountryName() {
        return this.countryName;
    }

    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }
}

对于SQLCountryData,它需要以某种方式将countryName属性映射到SQL标识符,以便它可以生成正确的SQL.对于GraphCountryData,可能需要创建针对countryName属性的某种谓词对象,以从失败的图中过滤出顶点.

如果没有将客户端代码与抽象的CountryData相结合,并使用这样的实现特定细节,那么抽象这样的细节的最佳方法是什么?

有什么想法吗?

编辑:

我在条件类中包含的示例很简单,但考虑是否要允许客户端构造复杂的标准,它们不仅要指定要过滤的属性,还要指定等于运算符,复合标准的逻辑运算符,和价值.

解决方法:

DAO是DAL(数据访问层)的一部分,您可以使用任何类型的实现(XML,RDBMS等)支持数据.您只需确保在运行时注入/使用项目实例.像Spring / Guice这样的DI框架在这种情况下大放异彩.此外,您的Criteria接口/实现应该足够通用,以便仅捕获业务详细信息(即国家/地区名称标准),并且实现类再次处理实际映射.

对于SQL,在您的情况下,您可以手动生成SQL,使用像Spring这样的帮助程序库生成SQL,或使用像MyBatis这样的完整框架.在我们的项目中,Spring XML配置文件用于解耦客户端和实现;它可能会因你而异.

编辑:我看到你在上一个问题中引起了类似的关注.答案仍然是一样的.您可以在界面中添加所需的灵活性;你只需要确保实现足够聪明,以理解它收到的所有参数,并将它们适当地映射到底层源.在我们的例子中,我们从业务层检索了值对象,并将其转换为SQL实现层中可供MyBatis使用的映射.同样,这个过程非常透明,服务层与DAO通信的唯一方法是通过接口定义的值对象.

本文标题为:java – DAO只能访问数据库吗?

基础教程推荐