代码之家  ›  专栏  ›  技术社区  ›  Buhake Sindi Tesnep

查询对象模式(设计模式)

  •  12
  • Buhake Sindi Tesnep  · 技术社区  · 15 年前

    我需要在Java中实现一个查询对象模式,用于我自定义的搜索界面(我正在编写的WebApp)。

    有人知道我在哪里可以得到查询对象模式(MartinFowler的QOP)的示例/教程吗?

    提前谢谢

    加法 如何将查询模式添加到现有的DAO模式中?

    3 回复  |  直到 10 年前
        1
  •  12
  •   BalusC    11 年前

    “查询对象模式”中的“模式”一词放错了位置。这不是真正的设计模式。“查询对象”只是 Interpreter Pattern . 遗产 Hibernate Criteria API 与现代 JPA2 Criteria API 是将它与 Builder Pattern .

    关于你的问题:

    如何将查询模式添加到现有的DAO模式中?

    我建议你看看 JPA2 .

        2
  •  4
  •   Buhake Sindi Tesnep    13 年前

    查询对象

    表示数据库查询的对象。

    有关完整描述,请参阅 here

    SQL可以是一种复杂的语言,许多开发人员并不特别熟悉它。此外,您需要知道组成查询的数据库模式是什么样子的。您可以通过创建专门的finder方法来避免这种情况,这些方法将SQL隐藏在参数化方法中,但这使得很难形成更多的即席查询。如果数据库模式发生变化,它还会导致SQL语句中的重复。

    一个查询对象是一个解释器[四个一组],也就是说,一个对象的结构,可以形成一个SQL查询。可以通过引用类和字段而不是表和列来创建此查询。这样,编写查询的人员就可以独立于数据库模式来完成这项工作,并且对模式的更改可以在单个位置进行本地化。

        3
  •  2
  •   Shayne    10 年前

    我在这里为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

    推荐文章