Шаблон объекта запроса (Шаблон проектирования) - PullRequest
12 голосов
/ 15 января 2010

Мне нужно реализовать шаблон объекта запроса в Java для моего настраиваемого интерфейса поиска (веб-приложения, которое я пишу).

Кто-нибудь знает, где я могу получить пример / руководство по шаблону объекта запроса (QoP Мартина Фаулера)?

Заранее спасибо

ДОПОЛНЕНИЕ Как добавить шаблон запроса в существующий шаблон DAO?

Ответы [ 3 ]

12 голосов
/ 13 марта 2010

Слово "шаблон" в "шаблон объекта запроса" (IMHO) неуместно. Это не настоящий шаблон дизайна. «Объект запроса» является еще одним примером шаблона интерпретатора . Устаревший Hibernate Criteria API и современный JPA2 Criteria API являются прекрасными примерами, которые объединяют его с Builder Pattern .

По вашему вопросу:

Как добавить шаблон запроса в существующий шаблон DAO?

Я бы рекомендовал взглянуть на JPA2 .

4 голосов
/ 20 декабря 2011

Объект запроса

Объект, представляющий запрос к базе данных.

Полное описание см. здесь

SQL может быть вовлеченным языком, и многие разработчики не особенно знакомы с ним. Кроме того, вам нужно знать, как выглядит схема базы данных для формирования запросов. Этого можно избежать, создав специализированные методы поиска, которые скрывают SQL внутри параметризованных методов, но это затрудняет формирование большего количества специальных запросов. Это также приводит к дублированию операторов SQL в случае изменения схемы базы данных.

Объект запроса - это интерпретатор [Бригада четырех], то есть структура объектов, которые могут формироваться в запросе SQL. Вы можете создать этот запрос, ссылаясь на классы и поля, а не на таблицы и столбцы. Таким образом, те, кто пишет запросы, могут делать это независимо от схемы базы данных, и изменения в схеме могут быть локализованы в одном месте.

3 голосов
/ 13 августа 2015

Я написал реализацию C # для NHibernate здесь: https://github.com/shaynevanasperen/NHibernate.Sessions.Operations.

Он работает с использованием интерфейса, подобного следующему:

public interface IDatabases
{
    ISessionManager SessionManager { get; }

    T Query<T>(IDatabaseQuery<T> query);
    T Query<T>(ICachedDatabaseQuery<T> query);

    void Command(IDatabaseCommand command);
    T Command<T>(IDatabaseCommand<T> command);
}

Учитывая класс сущности POCO как это:

class Database1Poco
{
    public int Property1 { get; set; }
    public string Property2 { get; set; }
}

Вы можете создавать объекты запроса следующим образом:

class Database1PocoByProperty1 : DatabaseQuery<Database1Poco>
{
    public override Database1Poco Execute(ISessionManager sessionManager)
    {
        return sessionManager.Session.Query<Database1Poco>().SingleOrDefault(x => x.Property1 == Property1);
    }

    public int Property1 { get; set; }
}

А затем используйте их так:

var database1Poco = _databases.Query(new Database1PocoByProperty1 { Property1 = 1 });

Вы можете перенести это на Java, если хотите.

Вот еще несколько примеров:

https://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/ http://www.mrdustpan.com/command-query-objects-with-dapper#disqus_thread http://crosscuttingconcerns.com/CommandQuery-Object-pattern

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...