【问题标题】:how can i pass an sql query as a parameter to an other sql query in java?如何将 sql 查询作为参数传递给 java 中的其他 sql 查询?
【发布时间】:2019-09-11 06:20:41
【问题描述】:

我正在编写一个代码来管理一家咖啡馆,所以在框架中我添加了一个 JTable,每次我从 JComboBox 中选择一个项目时,它都应该显示在 JTable 中。为此,我添加了一个按钮,并且为了它的操作,我确保每次单击它时,它将从 JComboBox 中单击的项目存储在数据库中,然后从数据库中将其获取到 Jtable 中。但问题是 JTable 有 2 列,而 JComboBox 中的选择只有一列。所以必须从另一个数据库调用另一列,这意味着我必须在另一个数据库中调用一个 sql 查询,我不知道该怎么做。我试过下面的代码,但它给了我这个错误“你的 SQL 语法有错误;检查与你的 MariaDB 服务器版本相对应的手册,以在第 1 行的‘产品’附近使用正确的语法”

b2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

            try {
                Class.forName("com.mysql.jdbc.Driver");
                Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/café", "root",
                        "ata1");

                Statement statement = connection.createStatement();
                ResultSet resultat = statement.executeQuery ( "SELECT prix FROM commande_existantes WHERE "+ cb.getSelectedItem() + "IN produit" );
                Statement stmt = connection.createStatement();
                stmt.executeUpdate("INSERT INTO commande_existante VALUES ('" + cb.getSelectedItem() + "'," +resultat+ ")");

    } catch (Exception a) {
        a.printStackTrace();
    }
    }
    });

【问题讨论】:

  • 首先,您需要在IN 之前留一个空格,但我认为您的查询没有任何意义。
  • 使用存储过程。您的操作存在安全问题。避免使用原始查询。为了防止 sql 注入。
  • @Mr.AF 为什么是stored procedure - 也许你的意思是使用PreparedStatement 类?
  • 从您发布的代码看来,您有两个数据库表,一个名为commande_existantes,一个名为commande_existante,对吗?这些数据库表中的列的名称和数据类型是什么?
  • select prix from commande_existantes where columnA = 'selectedValue'是正常的SQL写法

标签: java sql eclipse


【解决方案1】:

你可能想要这样的东西:

Statement statement = connection.createStatement();
ResultSet resultat = 
    statement.executeQuery ( "SELECT prix FROM commande_existantes " +
                             " WHERE produit = " + cb.getSelectedItem() );
if (rs.next) {
    stmt.executeUpdate("INSERT INTO commande_existante VALUES " + 
                       "('" + cb.getSelectedItem() + "'," + 
                              resultat.getDouble("prix")+ ")");
}

我假设“produit”是“commande_existantes”中的列名 - 所以您只想找到“produit”的值是您选择的行。在 SQL 中,“IN”用于查找您在“IN”之后指定的列表中的值... - 但查询已经查看该表中的所有行,以查找与您的“WHERE”子句匹配的行,所以“=”比较是你所需要的。

ResultSet 可能表示一个值表,这些值是您运行的查询的答案 - 因此您需要移动到一行(使用“next()”)然后获取您想要的列值(在这种情况下,使用对“getDouble()”的调用。

您应该寻找有关 JDBC 的教程,尤其是如何在 SQL 中使用参数,而不是像您在此处所做的那样将值嵌入 SQL 中。

【讨论】:

    【解决方案2】:

    你可以直接使用如下:

    String selected=cb.getSelectedItem();

    stmt.executeUpdate("INSERT INTO commande_existante VALUES ('"+selected+"',(SELECT prix FROM commande_existantes WHERE '"+selected+" ' IN('produit') AND ROWNUM

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-02
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2020-11-24
      • 1970-01-01
      • 2011-07-23
      相关资源
      最近更新 更多