2016-07-12 55 views
0
query = "UPDATE personal_details SET '" + field + "' = '" + edit + "' WHERE associate_id = '" + associate_id + "'"; 

这里我的表名是personal_details,我将表列名称作为变量字段中的参数以及编辑中的新值。这段代码是用Java编写的。我正在访问的数据库在PostgreSQL中。我可以通过这种方式传递列名吗?

+2

你可以做到这一点,它的工作,但你将SQL注入攻击敞开的,假定这些变量来自用户输入 –

+0

是的,你可以像这样传递查询。你有什么问题吗? –

+0

是的..我删除了单引号。 query =“UPDATE personal_details SET”+ field +“='”+ edit +“'WHERE associate_id ='”+ associate_id +“'”; –

回答

0

您正在构造一个包含该查询的字符串。数据库不知道如何构造字符串。最终,您只需将该字符串传递到将被解析,编译和执行的位置。所以是的,你可以这样构造查询。

无法将列名或表名作为参数传递到查询中。建议您将其他值作为参数传递到查询中。

1

虽然你可以使用普通的级联构建字符串,则比较推荐的方法是:

  1. 使用StringBuilder/StringBuffer的,当你建立字符串优化程序的速度,特别是如果您连接内环路串;
  2. 最值得推荐的方法是使用PreparedStatement并填充参数值。参见:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
+0

建议不要使用StringBuilder进行查询构建。 StringBuffer已弃用,不应再使用。 –

+0

@ adriaan-koster同意弃用的StringBuffer,也同意你的观点,即StringBuilder不是最合适的解决方案。我只是展示了大多数可能的方法。亲自**我**更喜欢使用** PreparedStatements **。 – lospejos

1

不要构建像这样的查询! @Rory指出,由于安全问题,这是不好的做法。相反,使用带参数的PreparedStatement,例如:

String updateTableSQL = "UPDATE DBUSER SET USERNAME = ? WHERE USER_ID = ?"; 
PreparedStatement preparedStatement = dbConnection.prepareStatement(updateTableSQL); 
preparedStatement.setString(1, "mkyong_new_value"); 
preparedStatement.setInt(2, 1001); 
// execute insert SQL stetement 
preparedStatement .executeUpdate(); 

(来自mkyong两者)​​

相关问题