Общий Дао и сервисный уровень - PullRequest
4 голосов
/ 29 апреля 2011

Я собираюсь разработать слой DAO для моего приложения.Я сосредоточен на том, что Services просто вызывает 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)', поскольку хранилище данных может быть RDBMS, файловой системой, FTP и т. Д..

Как мне в общем случае создать свой слой Dao?

Если кто-то скажет «убрать getByQuery () из GenericSearchDao», то что мне делать в случае, когда мне нужны данные, специфичные для бизнеса?например, для пользователя с ролями, пользователя с продуктами и т. д.

Ответы [ 5 ]

1 голос
/ 14 мая 2011

Этот подход может оказаться полезным http://www.bejug.org/confluenceBeJUG/display/BeJUG/Generic+DAO+example

0 голосов
/ 11 октября 2012

Для конкретного значения просто сгенерируйте «UnsupportedOperationException».Хорошую реализацию Generic dao можно найти здесь http://code.google.com/p/hibernate-generic-dao/ - я также могу настроить исходный код для работы с hibernate 4 и spring 3

0 голосов
/ 29 апреля 2011

Что я должен сделать, чтобы избавиться от конкретных реализаций 'getByQuery (query)', потому что хранилище данных может быть RDBMS, файловой системой, FTP и т. Д.

Нет, вам просто нужно предоставить «общий» запрос, например, «name = a» может выполнить запрос в базе данных или найти файл с именем «a» или что-то еще.

0 голосов
/ 29 апреля 2011

Какую информацию вы планируете передать в параметре "query"?SQL?Я бы заменил параметр String чем-то специфичным для бизнеса, например, небольшим классом с такими полями, как «имя», «фамилия» и т. Д. Базовая реализация преобразует его в SQL, или вызовы удаленных служб, или другую магию, специфичную для реализации..

0 голосов
/ 29 апреля 2011

Эй, проверьте этот сайт Внедрение DAO . Существует несколько реализаций DAO с разными шаблонами проектирования. Я думаю, что DAO с фабрикой Abstact подойдет вам.

...