【问题标题】:Which design pattern should I use for taking query parameters and combining them to create a filtered sql query我应该使用哪种设计模式来获取查询参数并将它们组合起来以创建过滤的 sql 查询
【发布时间】:2013-07-30 23:54:27
【问题描述】:

如果我有一个可以接受大量参数的 url,然后我想动态混合和匹配以创建 sql 查询以返回结果...

我可以考虑使用哪些设计模式从参数创建过滤器?

示例:

mySite.com?name=tom&color=red&size=large&etc

所需的 sql 输出 select * from mytable where name = tom and color = red and size = large;

这在小范围内是微不足道的,但是当您有大量来自过滤器面板的变量参数时,其中包括日期和匹配查询字符串等,并且您希望将它们整齐且可维护地组装到 sql 查询中,同时检查和清理数据,事情可能会出错..冗长。我最终编写了大量 if/else 样式的过滤器方法,这有点像维护噩梦。

【问题讨论】:

  • 你能澄清一下你的场景吗?特别是,您能否更具体地了解从参数部分创建过滤器。至于构建查询,您可以使用Query Object
  • 你不能只用参数的名称和值填充地图吗?
  • 澄清......一个由许多通过外键关联的表组成的sql数据库。通过url传入的大量参数,其中大部分是可选的。我需要将这些参数混合并匹配到 sql(包括连接等)中,然后最终将生成的 sql 传递出去以执行并返回结果。 @Rex 在他的回答中建议了装饰器模式,我必须说这看起来很有希望。我可以从一个基本查询开始,并将从 url 中提取的各种条件“装饰”到基本查询上……
  • @stan0 对于键值映射来说太复杂了,因为在某些情况下需要连接,在某些情况下不需要。此外,我希望能够在几乎所有情况下检查输入并进行各种翻译,例如。 url 参数可能是 &timeofday=afternoon 但查询需要是 time_of_day_id = 3 或类似的。

标签: sql url design-patterns filter


【解决方案1】:

对于这种场景,我喜欢使用装饰器模式,您可以在其中动态构建/混合“成分”。

我认为维基百科确实有一个很好的示例(咖啡制作场景):http://en.wikipedia.org/wiki/Decorator_pattern

【讨论】:

  • 那么你会从一个基本查询开始,然后用更多的查询条件装饰?
  • 是的,有点。对于连接等复杂场景,可能需要为每种类型的连接使用另一个基类。为了使其易于使用,您可能希望将其与 Facade 和 Factory 模式混合使用
猜你喜欢
  • 2010-10-06
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多