java - 使用预准备语句的变量列名

标签 java sql jdbc prepared-statement

我想知道是否有任何方法可以使用准备好的语句指定返回的列名称。

我正在使用 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'

正如所讨论的,我知道我不能对表名执行此操作 here ,但想知道是否有某种方法可以对列名称执行此操作。

如果没有,那么我只需尝试确保清理输入,这样就不会导致 SQL 注入(inject)漏洞。

最佳答案

这表明数据库设计不好。用户不需要知道列名。创建一个真实的数据库列来保存这些“列名称”并存储数据。

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

如果您想继续朝这个方向前进,则需要清理列名称(以避免 SQL Injection )并自行连接/构建 SQL 字符串。引用单独的列名称并使用 String#replace()转义列名称中的相同引号。

关于java - 使用预准备语句的变量列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56048305/

相关文章:

java - 更改 JBorderLayout 内 JTextField 的大小

java - 如何更改 launch4j 生成的 exe 文件的语言参数?

java - 测试 Thymeleaf 表单/Spring MVC Controller 交互的最佳方法

mysql - Doctrine 异常的 1452 错误

java - 从 domino 使用 JDBC 连接到 DB2

java - JDBC批处理在insert语句中使用 "CASE WHEN"

java - 在 java.io.FileNotFoundException 中查找文件位置

mysql - 导入完整的 MySQL 转储

java - Android Sqlite 删除相关表

Java JDBC 忽略 setFetchSize?