我正在尝试传递一个SQL命令,其中必须从数据库中删除一行。 我使用setString(index,value)并在主类中调用该方法。但是当我将参数传递给主类中的方法时,数据库中没有任何反应。是否有表单传递“jobnumber =?”的值在main方法中,它从数据库中删除该行? Ps:jobnumber被声明为serial并且是数据库中的主键。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DeleteUserDao {
Connection conDB2 = Connect.connectDB();
public void deleteDb(String y) {
String sqlDelete = ("DELETE FROM bookings WHERE jobnumber=?");
try {
PreparedStatement deleter = conDB2.prepareStatement(sqlDelete);
deleter.setString(1, y);
System.out.println("Item deleted from Bookings.");
} catch (SQLException e) {
System.out.println("Coud not delete item. " + e.getMessage());
e.printStackTrace();
}
}
}
import ***.jdbc.DeleteUserDao;
public class DeleteTest {
public static void main(String[] args) {
DeleteUserDao del = new DeleteUserDao();
del.deleteDb("4");
}
}
答案 0 :(得分:2)
如果我理解了您的问题,那么您Statement
就会遗漏executeUpdate()
,
PreparedStatement deleter = conDB2.prepareStatement(sqlDelete);
deleter.setString(1, y);
deleter.executeUpdate(); // <-- like so
来自链接的Javadoc,
在此PreparedStatement对象中执行SQL语句,该对象必须是SQL数据操作语言(DML)语句,例如INSERT,UPDATE或DELETE;或者什么都不返回的SQL语句,例如DDL语句。
修改强>
如下面的评论中所述,您可能应该使用int
类型,并且需要关闭PreparedStatement
-
public void deleteDb(int y) {
String sqlDelete = ("DELETE FROM bookings WHERE jobnumber=?");
PreparedStatement deleter = null;
try {
deleter = conDB2.prepareStatement(sqlDelete);
deleter.setInt(1, y);
System.out.println("Item deleted from Bookings.");
} catch (SQLException e) {
System.out.println("Coud not delete item. " + e.getMessage());
e.printStackTrace();
} finally {
if (deleter != null) {
try {
deleter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
然后调用它,传递int
-
del.deleteDb(4);
答案 1 :(得分:1)
你还没有告诉程序运行命令。
在prepareStatement
调用中,您告诉程序“这是我将运行的命令的格式,我可以用不同的参数代替问号运行多次”,并在setString
打电话给你说“目前,我想我要运行命令,参数1设置为y的值”,但你从未真正说过“执行语句”。你可以通过运行来做到这一点:
deleter.execute();
原因很多,但最简单的例子是如果您运行带有两个参数的预准备语句,并计划运行该语句400次。
说你有"DELETE FROM bookings WHERE jobnumber=? AND personid=?"
,然后你跑了:
deleter.setString(1, y);
deleter.setString(2, y);
然后,您希望将参数1设置为某个值x,将参数2设置为某个值z。所以你运行:
deleter.setString(1, x);
deleter.setString(2, z);
如果事情按照您在问题中假设的方式运行,则会出现意外行为,因为参数1和2都已设置为y
,因此将参数1设置为x会使参数1变为x和2保留y,并且将设置两个参数,这些参数将提示在对setString
的这两个调用上自动执行SQL。这不是你想要的。
另一方面,如果 只想更改参数1,并且不想更改参数2,那么简单地说:
deleter.setString(1, x);
deleter.execute();
而不是:
deleter.setString(1, x);
deleter.setString(2, y);
在该特定示例中,它不会节省太多精力。但是如果你有一个带有30个参数的预备语句,并且在每次连续调用之间你平均只改变1或2个,这个范例可以节省大量的工作。