我目前所做的事情:由于我使用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有时给它的名称):
我没有经验可以看到如何通过扩展来实现这一目标。目前我正在做的是类似下面的例子(为了简洁起见,简化了查询)。在该示例中,我捕获某个键是否出现在地图中,如果存在,我构建适当的查询。 现在一次应用多个过滤器的最大问题是它们可能需要使用不同的表(假设对于列表之前,当出现/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 {
[....]
}
}
}
个可能性,我需要更动态地构建查询(这是我迄今为止提出的唯一想法)。为此,我需要使用不同的逻辑加入两个不同的查询,我不知道这是否可能。
答案 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);
}