Java 我可以用这种方式编写Sql查询吗
我想知道我可以用这种格式插入表名吗Java 我可以用这种方式编写Sql查询吗,java,sql,prepared-statement,Java,Sql,Prepared Statement,我想知道我可以用这种格式插入表名吗 String update = "UPDATE ? SET Status = ? WHERE Name = ?"; stmt.setString(1,tableName); stmt.setString(2,status); stmt.setString(3,name); insert和delete语句也一样?通常,您可以按如下所示执行此操作 String sql = "UPDATE " + tableName " SET Status = ? WH
String update = "UPDATE ? SET Status = ? WHERE Name = ?";
stmt.setString(1,tableName);
stmt.setString(2,status);
stmt.setString(3,name);
insert和delete语句也一样?通常,您可以按如下所示执行此操作
String sql = "UPDATE " + tableName " SET Status = ? WHERE Name = ?";
PreparedStatement stmt = null;
try {
stmt = connection.prepareStatement(sql);
stmt.setString(1, status);
stmt.setString(2, name);
stmt.executeUpdate();
} finally {
if (stmt != null) {
stmt.close();
}
}
简而言之,答案是否定的。但你可以这样做:
String update = "UPDATE " + tableName + " SET Status = ? WHERE Name = ?";
...
stmt.setString(1,status);
stmt.setString(2,name);
但是要注意SQL注入。确保您的表名来自安全来源。否
在查询中添加问号的原因(除了防止SQL注入之外)是为了让数据库可以准备语句一次,并使用具有不同参数的已准备语句。如果它不知道您正在使用哪个表,它将无法准备语句。不,您不能这样做,因为您肯定在使用准备好的语句。无法执行此操作的原因是PreparedStatement是预编译的,因此它需要您正在修改的表(其数据使用DML)或结构(使用DDL)。如果不提及表名,那么该语句将如何预编译 如果需要,可以使用动态SQL,但在这种情况下,不必使用PreparedStatement,可以使用更简单的实现语句
希望这是有帮助的 你试过了吗?不,你不能参数化表名。使用动态SQL您可以,但只能使用动态SQL,而这并没有做到。如果不小心的话,动态SQL确实会让您接受SQL注入。如果您需要,我怀疑数据结构没有正确完成。。。不确定,因为我看不到您拥有什么,也看不到您试图实现什么,但是如果您必须在这么多表上复制完全相同的查询,您希望有一个通用的预处理语句,那么可能会发生一些不好的事情……谢谢您,我现在尝试了,但失败了