我想知道是否仍然可以使用准备好的语句指定返回的列名称。
我正在使用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值
PreparedStatement
如果您想朝这个方向继续,则需要清理列名(以避免SQL Injection)并自己连接/构建SQL字符串。引用单独的列名,并使用String#replace()转义符在列名内进行转义。
String#replace()