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)漏洞。

最佳答案

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

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

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

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

相关文章:

java - 根据条件过滤并收集 Map<String, List<Object>> 为 Map<String, List<Object>>

sql - 带有 set 和 select 的 php mysql 语句

java - 通过jdbc访问主机时如何克服词法错误?

java - 值没有转储到表 temp_demo 中

java - java中如何将文本输出到窗口中

java - 使用 MySQL 数据库创建 jar 到 exe

mysql - 如何从单行表中获取多行?

php - MySQL 访问者/点击计数器排序统计

sql - 使用 Clojure 插入 PostgreSQL 数组

java - 当线程访问时,矩阵打印得不好