Python中文网

一个关于 编程问题的解答网站.

有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何从Java传递sql命令

我试图传递一个SQL命令,其中一行必须从数据库中删除。 我正在使用setString(index,value)并调用主类中的方法。但当我将参数传递给主类中的方法时,数据库中什么都没有发生。是否有传递“jobnumber=”值的表单在main方法中,它会从数据库中删除该行吗? Ps:jobnumber声明为串行,是数据库中的主键

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) 个答案

  1. # 1 楼答案

    如果我理解你的问题,你在Statement中遗漏了^{}

    PreparedStatement deleter = conDB2.prepareStatement(sqlDelete);
    deleter.setString(1, y);
    deleter.executeUpdate(); // <  like so
    

    从链接的Javadoc

    Executes the SQL statement in this PreparedStatement object, which must be an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement.

    编辑

    正如下面的评论所指出的,您可能应该使用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);
    
  2. # 2 楼答案

    你还没有告诉程序运行这个命令

    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个参数,那么这个范例可以节省大量精力