query = "UPDATE personal_details SET '" + field + "' = '" + edit + "' WHERE associate_id = '" + associate_id + "'";
这里我的表名是personal_details
,我将表列名称作为变量字段中的参数以及编辑中的新值。这段代码是用Java编写的。我正在访问的数据库在PostgreSQL中。我可以通过这种方式传递列名吗?
query = "UPDATE personal_details SET '" + field + "' = '" + edit + "' WHERE associate_id = '" + associate_id + "'";
这里我的表名是personal_details
,我将表列名称作为变量字段中的参数以及编辑中的新值。这段代码是用Java编写的。我正在访问的数据库在PostgreSQL中。我可以通过这种方式传递列名吗?
您正在构造一个包含该查询的字符串。数据库不知道如何构造字符串。最终,您只需将该字符串传递到将被解析,编译和执行的位置。所以是的,你可以这样构造查询。
无法将列名或表名作为参数传递到查询中。建议您将其他值作为参数传递到查询中。
虽然你可以使用普通的级联构建字符串,则比较推荐的方法是:
建议不要使用StringBuilder进行查询构建。 StringBuffer已弃用,不应再使用。 –
@ adriaan-koster同意弃用的StringBuffer,也同意你的观点,即StringBuilder不是最合适的解决方案。我只是展示了大多数可能的方法。亲自**我**更喜欢使用** PreparedStatements **。 – lospejos
不要构建像这样的查询! @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两者)
你可以做到这一点,它的工作,但你将SQL注入攻击敞开的,假定这些变量来自用户输入 –
是的,你可以像这样传递查询。你有什么问题吗? –
是的..我删除了单引号。 query =“UPDATE personal_details SET”+ field +“='”+ edit +“'WHERE associate_id ='”+ associate_id +“'”; –