通用的Dao和服务层

4

我将为我的应用程序设计一个DAO层。我的重点是,服务只调用独立于底层实现的DAO。

    public interface GenericSearchDao{
        List getAll();
        List getByQuery(String query);
}

public class UserJdbcSearch implements GenericSearchDao{

        public List getAll(){
                // Get all users;
        }

        List getByQuery(String query){
                // Get users by query;
        }

}

public class UserFileSystemSearch implements GenericSearchDao{

        public List getAll(){
                // Get all users from file system;
        }


        List getByQuery(String query){
                // Get users by query[this leads to invalid operation];
        }
}

public userService {

        private GenericSearchDao dao = new UserFileSystemSearch();

        public List getUsers(){
                rturn dao.getAll();
        }

         public List getByQuery(String query){
               return  dao.getByQuery(query);
        }
}

需要帮助:

我应该怎样摆脱“getByQuery(query)”的特定实现,因为数据存储可以是关系型数据库、文件系统、FTP等。

我应该如何通用地设计我的 Dao 层?

如果有人说“从 GenericSearchDao 中删除 getByQuery()”,那么在我需要业务操作特定数据的情况下,例如:带有角色的用户、带有产品的用户等,我该怎么办?


复制粘贴错误!Stirng. - BalusC
5个回答

0

那个链接中的实现完全绑定了Hibernate(看一下导入语句)。有更好的解决方案。例如这个:http://codeblock.engio.net/?p=180 - bennidi

0
我应该怎么做才能摆脱'getByQuery(query)'的特定实现,因为数据存储可以是关系型数据库、文件系统、FTP等等。
你不需要这样做,你只需要提供“通用”的查询,例如“name = a”可能会在数据库中执行查询,或查找名为“a”的文件或其他任何事情。

先生,您不觉得这会导致我要为每个底层实现开发一个小查询语言吗 :) - Zeeshan

0
你计划在“query”参数中传递什么信息?SQL吗?我会用一些业务特定的东西替换String参数,比如一个小类,它有像“名字”,“姓氏”等字段。底层实现将把它转换为SQL,或远程服务调用,或其他实现特定的魔法。

感谢您的回答。您的回答引导我使用一种小型查询语言,以便根据底层实现进行解释。但是我不想发明这种查询语言。我认为有一个选项,Dao模式,我应该去实现它。感谢您的回复。 - Zeeshan

0

对于特定的实现,只需抛出“UnsupportedOperationException”即可。可以在此处找到良好的通用DAO实现http://code.google.com/p/hibernate-generic-dao/ - 我也可以调整源代码以使其与Hibernate 4和Spring 3一起工作


-1

嘿,看看这个网站DAO实现。有不同设计模式的DAO实现。我认为使用抽象工厂的DAO适合你。


是的,但在这种情况下问题是,我目前只有一个数据访问对象(DAO)及其实现,但将来可能会有30个DAO和它们的30个实现... 我需要最小化或消除这种重复,并且需要将服务与DAO及其底层实现解耦。 - Zeeshan
请查看http://codeblock.engio.net/?p=180。我提供了一种解决方案,它使用不同存储技术的技术无关实现作为特定领域DAO的基础机制。 - bennidi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接