当前位置: 首页 > 面试题库 >

Java 使用准备好的语句的变量列名

闾丘才哲
2023-03-14
问题内容

我想知道是否仍然可以使用准备好的语句指定返回的列名。

我正在使用MySQL和Java。

当我尝试时:

String columnNames="d,e,f"; //Actually from the user...
String name = "some_table"; //From user...
String query = "SELECT a,b,c,? FROM " + name + " WHERE d=?";//...
stmt = conn.prepareStatement(query);
stmt.setString(1, columnNames);
stmt.setString(2, "x");

我得到了这种类型的语句(在执行之前立即打印)。

SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'

我希望看到:

SELECT a,b,c,d,e,f FROM some_table WHERE d='x'

我知道,我不能为表名这样做,因为讨论 这里,但不知道是否有一些方法来做到这一点对列名。

如果没有,那么我将只需要尝试确保对输入进行清理,以免导致SQL注入漏洞。


问题答案:

这表明数据库设计不正确。用户不需要知道列名。创建一个实际的DB列,其中包含这些“列名”,并沿其存储数据。

无论如何,不​​能,不能将列名设置为PreparedStatement值。你只能将列值设置为PreparedStatement值

如果你想朝这个方向继续,则需要清理列名(以避免SQL Injection)并自己连接/构建SQL字符串。用单String#replace()引号引起来,并在单引号中使用转义符。



 类似资料:
  • 问题内容: 我想知道是否仍然可以使用准备好的语句指定返回的列名称。 我正在使用MySQL和Java。 当我尝试时: 我得到了这种类型的语句(在执行之前立即打印)。 但我希望看到: 我知道,我不能为表名这样做,因为讨论 这里,但不知道是否有一些方法来做到这一点对列名。 如果没有,那么我只需要尝试确保对输入进行清理,以免导致SQL注入漏洞。 问题答案: 这表明数据库设计不正确。用户不需要知道列名。创建

  • 问题内容: 我试图用大约50,000行10列填充Java中的resultSet,然后使用的方法将它们插入到另一个表中。 为了使过程更快,我进行了一些研究,发现在将数据读入resultSet时,fetchSize起着重要的作用。 如果fetchSize太低,可能会导致到服务器的行程过多,而fetchSize太高则会阻塞网络资源,因此我做了一些尝试,并设置了适合我的基础结构的最佳大小。 我正在阅读此r

  • 问题内容: 我正在尝试使用准备好的语句来设置表名以从中选择数据,但是执行查询时,我总是收到错误消息。 错误和示例代码如下所示。 有什么想法可能导致这种情况? 问题答案: 表名不能用作参数。它必须是硬编码的。因此,你可以执行以下操作:

  • 我有一个将列名映射到值的。要更新的列事先未知,在运行时决定。 例如< code>map = {col1: "value1 ",col2: "value2"}。 我想执行一个< code>UPDATE查询,用这些列将表更新为相应的值。我能做以下事情吗?如果没有,有没有一种优雅的方法可以不用手动构建查询?

  • 问题内容: 使用JDBC(Oracle),我需要在两个表的每一个中插入大约一千行。像这样: 问题在于两个表都是通过公共序列连接的,因此语句的顺序很重要。 如果我只有一张桌子,那会很容易。在这种情况下,我使用了代码: 但是,这种方法只能用一个准备好的语句,因此只能用一个插入。我该如何解决这个问题? 问题答案: 你可以试试 然后