如何基于许多不同的URI构建查询

时间:2018-03-28 12:54:00

标签: java mysql rest refactoring uri

我目前所做的事情:由于我使用aws lambda和aws API网关,我学会了捕获URI的特定部分,例如Path和queryParameters,我正在构建根据给定的路径和参数对我的数据库进行不同的查询。

示例:

https://ApiURI/user?id=id_1

路径=用户

参数= ID:ID_1

我将两个数据放在Map<String, Map<String, String>对象中,其中第一个字符串是键(路径或参数),内部映射包含实际值。我是这样做的,因为我觉得它会扩展得更好,因为我事先不知道URI 会有多少路径或参数(想法是能够过滤给定的URI /概念/实体)使用0到N个过滤器,同时应用0或甚至全部,并且一些URI当前可以有8个过滤器,该路径也可能有几个“斜杠”,例如/user/profile或{{ 1}}但截至目前情况并非如此。

示例:skill/profile?date=today可以有以下过滤器(也称为queryParameters,因为这是我看到AWS有时给它的名称):

  1. 技能
  2. 费用
  3. 在线
  4. 持续时间
  5. 级别
  6. 认证
  7. 语言
  8. 我没有经验可以看到如何通过扩展来实现这一目标。目前我正在做的是类似下面的例子(为了简洁起见,简化了查询)。在该示例中,我捕获某个键是否出现在地图中,如果存在,我构建适当的查询。 现在一次应用多个过滤器的最大问题是它们可能需要使用不同的表(假设对于列表之前,当出现/course时,我构建了一个内部查询加入表?skill,当出现skill或级别时,我必须与另一个名为?cost的表进行联接:

    course

    总而言之,我有许多逻辑分支​​,我不太清楚如何简化,因为每个分支可以有一个不同的查询关联,需要加入某个表。为了避免在IF情况下有if(pathParameters.containsValue("profiles")) { if(queryParameters == null || queryParameters.isEmpty()) { try { preparedstatement = con.prepareStatement("SELECT * from profiles"); } catch (SQLException e) { e.printStackTrace(); } } else if(queryParameters.containsKey("zone")) { try { preparedstatement = con.prepareStatement("SELECT * from profiles where id = ? GROUP BY id;"); preparedstatement.setString(1, queryParameters.get("zone")); } catch (SQLException e) { e.printStackTrace(); } } else if(queryParameters.containsKey("skill")) { try { preparedstatement = con.prepareStatement("SELECT * from skills where id = ?"); preparedstatement.setString(1, queryParameters.get("skill")); } catch (SQLException e) { e.printStackTrace(); } } else if(queryParameters.containsKey("experiencia")) { try { [....] } } } 个可能性,我需要更动态地构建查询(这是我迄今为止提出的唯一想法)。为此,我需要使用不同的逻辑加入两个不同的查询,我不知道这是否可能。

1 个答案:

答案 0 :(得分:0)

我还没有实现这个选项,但到目前为止这看起来接近我正在寻找的东西,所以我发布它作为答案以防其他人可能在将来使用它们,但到目前为止它是部分答案:

DbExtensions虽然它不适用于.Net而不是java。

http://www.mybatis.org/mybatis-3/statement-builders.html

特别是这样的代码就是我的目标:

void DynamicSql(int? categoryId, int? supplierId) { 

   var query = SQL
      .SELECT("ID, Name")
      .FROM("Products")
      .WHERE()
      ._If(categoryId.HasValue, "CategoryID = {0}", categoryId)
      ._If(supplierId.HasValue, "SupplierID = {0}", supplierId)
      .ORDER_BY("Name DESC"); 

   Console.WriteLine(query);
}