当前位置: 首页 > 知识库问答 >
问题:

JavaSQL准备语句不工作[重复]

孙泉
2023-03-14

我用语句编写了这段代码,它运行良好:

 protected ResultSet tabQuery(String query) throws SQLException {

String tabQuery = "SELECT * FROM " + query;

Statement statement = connection.createStatement();

return statement.executeQuery(tabQuery);

}

但当我试图用PreparedStatement转换它时,它却不能处理SQL语法错误。

protected ResultSet tabQuery(String query) throws SQLException {

String tabQuery = "SELECT * FROM ?";

PreparedStatement statement = connection.prepareStatement(tabQuery);

statement.setString(1, query);

System.out.println(statement);

return statement.executeQuery();

}

共有2个答案

姜松
2023-03-14

将表名作为SQL查询的变量是一种不好的做法。

最好为不同的表编写不同的查询。

  • 客户表的获取客户

等。

吉泰宁
2023-03-14

您不能使用<代码> 运算符。

您可以执行类似“从mytable中选择”这样的操作 但它不会以另一种方式工作。

我建议使用存储过程,不要使用预处理语句,更改数据库结构,或为每个查询创建预处理语句并缓存它们:

Map<String,PreparedStatement> cache=new HashMap<>();

PreparedStatement stmt;
if(cache.contains(query)){
    stmt= cache.get(query)
}else{
     stmt=new PreparedStatement("SELECT * FROM `"+query.replace("`","\\`")+"`");
    cache.put(query,stmt);
}
return stmt.executeQuery();
 类似资料:
  • 我正在使用我生成的一个准备好的语句,但在Java抛出的语句上出现了语法错误。然而,当我将PS的toString复制并粘贴到数据库的phpmyadmin中时,它的执行完美无缺。有什么想法会出错吗,我很难理解? 编辑:更改为PS.ExecuteUpdate(查询);还是不起作用。

  • 当我们创建准备语句对象时,它是否缓存在服务器端?与Oracle驱动程序中的准备语句相比有何不同?如果重用准备语句,哪些数据将发送到Cassandra服务器,仅限参数值? 据我所知,java驱动程序中的一个会话对象持有到集群中多个节点的多个连接。如果我们在多个线程中重用应用程序中相同的准备语句,会使我们只使用一个连接到一个Cassandra吗?我猜准备语句只在一个连接上完成...当路由键被每个执行调

  • 这不起作用(表示java.sql.SQLSyntaxErrorException:您的sql语法有错误;请查看与MySQL server版本相对应的手册,以了解第行“tb1”set“name”=“newName”,其中“id”=0000”附近要使用的正确语法…) 这确实有效 然后执行它 问:还有为什么当我尝试打印准备声明对象时,它会添加“值”(引号)?为什么它仍然添加错误消息?

  • 问题内容: 嗨,我正在尝试学习使用准备好的语句来避免SQL注入等的正确方法。 当我执行脚本时,我从脚本中收到一条消息,提示已插入0行,我希望这表示已插入1行,并且当然会更新表。我不完全确定自己准备好的陈述,因为我已经做过一些研究,我的意思是每个例子都各不相同。 更新表格时,我需要声明所有字段吗?还是只更新一个字段就可以了? 任何信息将非常有帮助。 index.php classes / class

  • 可能重复: dbcp中的已准备语句池 我正在构建一个Web应用程序,它使用Tomcat的数据库连池机制进行内部使用。我试图汇集准备好的语句,以便应用程序在检索数据时更有效。 据我所知,当连接、结果集和语句关闭时,连接将返回到池。如果设置了适当的标志,放弃的连接也会关闭并返回到池中。关闭连接意味着释放所有数据库游标和缓存的语句,包括准备好的语句。那么准备好的语句池有什么意义呢?