如何从Java传递sql命令

时间:2014-08-11 14:31:32

标签: java sql java-ee setstring

我正在尝试传递一个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");
    }
}

2 个答案:

答案 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个,这个范例可以节省大量的工作。