当前位置: 首页 > 知识库问答 >
问题:

如何在JDBC中使用Mysql行构造函数进行查询?

蒲昊
2023-03-14

以下MySQL查询是等效的:

select * from TableA where (column1, column2) in ( ('name1', 60), ('name2', 65) )
select * from TableA where (column1='name1' and column2=60) or (column1='name2' and column2=65)

然而,行构造器表单(即第一个示例)的强大之处在于,您可以使用它来处理查询任意长度的值对列表。没有它,您必须编写动态sql,这是一个安全风险。使用第一个表单避免了这个棘手的问题。

但是,如何使用预准备状态在JDBC中表示这一点?例如:

Connection connection = ...
PreparedStatement smt = connection.preparedStatement("select * from TableA where (column1,column2) in ?");
smt.setObject(1, whatDataTypeGoesHere );
smt.execute();

我已经研究了setArray,但是如何在数组的值中表示列1和列2的值?我想知道是否SQLData接口可以作为这个管道。但是阅读文档时,我看不出它是如何工作的。

共有1个答案

艾鹭洋
2023-03-14

据我所知,MySQL在Connector/J中的实现不支持setArray(),它抛出了java.sql.SQLFeatureNotSupport dExctive

即使它确实实现了setArray(),我也没有使用过它,也没有看到任何文档显示将该方法用于行构造函数而不是标量类型的示例。这可能是因为它不是适合你的任务的正确解决方案。

我想你必须写一个字符串生成器-东西-东西来做你想做的。编写构建SQL查询的代码没关系。如果你在SQL查询字符串中使用不可信的内容,这只是一个SQL的注入风险。如果你只使用严格受自己代码控制的内容,你可以确保它不危险。

例如,在下面的示例中,插入到SQL字符串中的内容仅基于调用代码中的字符串文本。不使用来自不受信任来源的内容。

String placeHolders = String.join(",",
  Collections.nCopies(params.size(), "(?, ?)"));
String sql = "select * from TableA where (column1, column2) in ( (" 
  + placeHolders + ")";

(假设params是一个对象数组,您可以从该数组中获取对应于列1的值)

这将导致SQL字符串

select * from TableA where (column1, column2) in ((?, ?), (?, ?), (?, ?), ...)

然后,必须在要绑定的参数数组上循环,并在每个循环中设置两次setString()

 类似资料:
  • 问题内容: 我有一堂课要添加单元测试。该类具有多个构造函数,这些构造函数采用不同的类型并将其转换为规范形式,然后可以将其转换为其他类型。 实际上,它接受并转换为其他两种类型。 我正在尝试找出最合适的方法来测试这些构造函数。 应该有一个针对每个构造函数的测试和输出类型: 这导致许多不同的测试。如您所见,我正在努力命名它们。 应该有多个断言: 这有多个断言,这使我感到不舒服。它还正在测试getStri

  • 问题内容: 假设我有一个带有多个构造函数的Java类: 如何在Scala中扩展它,并仍然提供对Base的所有三个构造函数的访问?在Scala中,子类只能调用其超类的构造函数之一。我该如何解决这个规则? 假设Java类是我无法更改的旧代码。 问题答案: 很容易忘记一个特质可以扩展一个类。如果使用特征,则可以推迟调用哪个构造函数的决定,如下所示: 特性本身可能没有构造函数参数,但是您可以通过使用抽象成

  • 我有这样一个问题: 其中我将存储到数据库中的DateTime与通过java方法传递的localDate进行比较。我收到这个异常: 有一种方法可以配置hibernate/jpa自动进行转换,或者我必须传递一个日期对象,而不是LocalDate?我甚至尝试导入hibernate-java8,但没有改变

  • 问题内容: 我在同一台服务器上有两个数据库。Google给了我一些提示,但是我找不到任何“官方”信息。有人可以指出我的文档来说明如何执行此操作吗?使用PHP的说明也将很有用。谢谢! 问题答案: 我在同一台服务器上有两个数据库。…如何在MySQL中构建跨数据库查询? 通过在表的前面加上适当的数据库名称,可以访问同一MySQL实例上的其他数据库。IE: 记住 查询将使用用于建立连接的身份验证凭据来执行

  • 好的,到目前为止还好。但是等等,突然A需要额外的输入,比如一个对它的构造至关重要的名为“amount”的整数。现在,我的A构造函数需要如下所示: 突然这个新参数干扰了注射。此外,即使这确实有效,我也无法在从提供者检索新实例时输入“金额”,除非我弄错了。这里有几件事我可以做,我的问题是哪一件是最好的? 我可以通过添加一个方法来重构A,该方法应该在构造函数之后调用。然而,这是很难看的,因为它迫使我推迟

  • 问题内容: 我有两个表,一个表用于新闻,另一个表用于评论,我想获取其状态已设置为批准的评论数。 但是此查询的问题在于,无论是否存在与该新闻相对应的评论,为评论列获取的最小值为1。 任何帮助将是非常可贵的。 问题答案: 使用代替 请尝试以下方法: