2010-01-15 147 views
10

我需要在Java中爲我的可定製搜索界面(我正在編寫的webapp)實現查詢對象模式。查詢對象模式(設計模式)

有沒有人知道我在哪裏可以得到查詢對象模式(Martin Fowler's QoP)的示例/教程?

由於提前

加成如何查詢模式添加到現有的DAO模式?

+0

注意休眠有一個很好的標準API(JPA 2.0還具有一個類型安全標準API現在)。 – 2010-01-15 00:43:21

+0

我收集的是我應該轉移到Hibernate。 – 2010-01-15 09:57:04

+0

類似的問題 - http://stackoverflow.com/questions/2265290/query-object-implementation-examples – JamesG 2010-02-27 05:14:28

回答

3

查詢對象

表示一個數據庫查詢的對象。

有關詳細說明見here

SQL可以是一個複雜的語言,很多開發商不是特別熟悉。此外,您需要知道數據庫模式是如何構成查詢的。您可以通過創建隱藏參數化方法內的SQL的專用查找程序方法來避免這種情況,但這使得難以形成更多即席查詢。如果數據庫模式發生變化,它還會導致SQL語句中的重複。

查詢對象是一個解釋器[Gang of Four],也就是可以形成SQL查詢的對象結構。您可以通過引用類和字段而不是表和列來創建此查詢。通過這種方式,編寫查詢的人可以獨立於數據庫模式進行操作,對模式的更改可以集中在一個地方。

+1

你誤解了我的問題。我知道Query Object模式,我知道它在Martin Fowler的書中有描述。我想查看用於查詢對象的設計模式。 – 2011-12-20 11:54:41

2

我在這裏爲NHibernate寫了一個C#實現: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

+0

這不應該是一個評論嗎? – 2015-08-13 19:29:09

+0

我不這麼認爲。它通過提供示例代碼直接回答問題。 – Shayne 2015-08-14 00:22:32