Java 如何将变量传递到SQL查询中
我将一个字符串从一个场景传递到另一个场景,这两个场景在JavaFX中使用不同的控制器,并使用该字符串执行sql语句,但出现错误“检查maria DB server对应的手册”。我会记下我的相关代码。任何帮助都将不胜感激。 menu.fxml-->MenuController.java和orderList.fxml-->OrderListController.javaJava 如何将变量传递到SQL查询中,java,mysql,variables,Java,Mysql,Variables,我将一个字符串从一个场景传递到另一个场景,这两个场景在JavaFX中使用不同的控制器,并使用该字符串执行sql语句,但出现错误“检查maria DB server对应的手册”。我会记下我的相关代码。任何帮助都将不胜感激。 menu.fxml-->MenuController.java和orderList.fxml-->OrderListController.java FXMLLoader loader = new FXMLLoader(getClass().get
FXMLLoader loader = new FXMLLoader(getClass().getResource("orderList.fxml"));
Parent root = loader.load();
OrderListController orderListController = loader.getController();
orderListController.transferMessage(orderRefNo);
Stage orderListStage = new Stage();
orderListStage.setScene(new Scene(root));
orderListStage.show();
顺便说一句,这是我的orderListTableModel
public class orderListTableModel {
String id, foodName, qty, price;
public orderListTableModel(String id, String foodName, String qty, String price) {
this.id = id;
this.foodName = foodName;
this.qty = qty;
this.price = price;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFoodName() {
return foodName;
}
public void setFoodName(String foodName) {
this.foodName = foodName;
}
public String getQty() {
return qty;
}
public void setQty(String qty) {
this.qty = qty;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
无法使用PreparedStatement将表名绑定到SQL查询。PreparedStatement用于列名,而不是表名。我知道orderRefNo引用了字符串对象,但在构造查询时,您仍然将其绑定为
SELECT
语句中使用的表
PreparedStatement preparedStatement = connection.prepareStatement("**SELECT * FROM ?**");
preparedStatement.setString(1, orderRefNo);
请理解,在查询中使用字符串orderRefNo作为表名,这是不允许的。因此你会得到一个例外
另一种方法是将表名连接到查询中,但千万不要这样做,因为这会使代码容易受到SQL注入攻击。我重复一遍,不要将表名直接连接到查询中。不能在查询中动态绑定表名。至少,不是没有存储过程。@ElliottFrisch嗨,谢谢你回答我的问题。我没有在查询中输入表名。变量为“orderefno”,它在上一个场景中生成,然后从上一个场景控制器传输到下一个场景控制器。
SELECT*from?
。您正试图从绑定中的表名。您不能这样做。@ElliotFrisch Hi,orderRefNo不是表名,它是传递到控制器的字符串变量,我已经告诉过您三次了;你不能那样做。您可以编写一个存储过程并使用一个可调用语句来执行等效的操作,但是PreparedStatement
由一个游标支持;而且数据库游标不是以这种方式生成的(基本上,没有JDBC实现允许您使用PreparedStatement
)执行您试图执行的操作)。您好,感谢您的澄清。连接也不起作用。在我上面的连接语句中,注释掉了。但我的问题是,在我的程序中,我以前能够在insert语句中传入一个变量表名,这很好。PreparedStatementPreparedStatement1=connection.prepareStatement(“插入到”+orderRefNo+”值(null,'Noodles6',“+Pane4Item6Qty+”,“+45*Pane4Item6Qty+”)代码>这很好,我可以知道如何为此创建存储过程吗
PreparedStatement preparedStatement = connection.prepareStatement("**SELECT * FROM ?**");
preparedStatement.setString(1, orderRefNo);
PreparedStatement preparedStatement = connection.prepareStatement("**SELECT * FROM ?**");
preparedStatement.setString(1, orderRefNo);