【问题标题】:How to execute a SQL statement in Java with variables如何在 Java 中使用变量执行 SQL 语句
【发布时间】:2018-07-19 08:20:57
【问题描述】:

我有以下 mysql 语句从正在工作的数据库中删除记录。

SET @email = 'delete@mailinator.com';
SET @userID = (SELECT id FROM USER WHERE email = @email);
DELETE FROM user_role_group WHERE user_id = @userID;
DELETE FROM user_client_setup WHERE user_id = @userID;
DELETE FROM USER WHERE id = @userID;

我想通过 jdbc mysql 连接在 Java 中运行相同的查询。我已经尝试了以下

public void deleteCoreUser(String email) {
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection con=DriverManager.getConnection(
                    "jdbc:mysql://db.com:3306/core","username","password");
            Statement stmt=con.createStatement();
            ResultSet rs=stmt.executeQuery("SET @email = '"+email+"';\n" +
                    "SET @userID = (SELECT id FROM user WHERE email = @email);\n" +
                    "DELETE FROM user_role_group WHERE user_id = @userID;\n" +
                    "DELETE FROM user_client_setup WHERE user_id = @userID;\n" +
                    "DELETE FROM user WHERE id = @userID;");
            con.close();
            System.out.println("Deleting user "+email+" from the Core DB");
        }catch(Exception e){ System.out.println(e);}
    }

运行时出现此错误

java.sql.SQLSyntaxErrorException:您的 SQL 中有错误 句法;检查与您的 MariaDB 服务器相对应的手册 在 'SET @userID = (SELECT id 来自用户 WHERE 电子邮件 = @email);在第 2 行删除 user_role_'

【问题讨论】:

  • 寻找“准备好的语句 jdbc”
  • PreparedStatement 将简化相同的查询。它还具有性能优势,因为查询编译一次并执行多次。

标签: java mysql jdbc


【解决方案1】:

我怀疑问题是由于 MariaDB 中的 allowMultiQueries 标志造成的。这默认为false,这意味着每个查询基本上都是在真空中运行的,您的SET @userID = (SELECT id FROM user WHERE email = @email); 查询不知道@email 是什么。要使用当前代码解决此问题,请设置数据库 allowMultiQueries=true

【讨论】:

    【解决方案2】:

    使用 execute() 而不是 executeQuery(),因为它返回多个 ResultSet。查看答案 (Statement.execute(sql) vs executeUpdate(sql) and executeQuery(sql)) 并将 ?allowMultiQueries=true 添加到数据库 url "jdbc:mysql://db.com:3306/core?allowMultiQueries=true"

    【讨论】:

      【解决方案3】:

      如果 MySQL 查询在 MySQL 控制台中正确运行,那么在使用 jdbc 处理同一查询时,没有理由显示语法错误。您在使用 java 实现查询以及 java 如何处理它时犯了错误。

      public void deleteCoreUser(String email) {
          try {
              Class.forName("com.mysql.cj.jdbc.Driver");
              Connection con = DriverManager.getConnection("jdbc:mysql://db.com:3306/core","username","password");
              Statement stmt = con.createStatement();
              String sql = "SET @email = '" + email + "'";
              stmt.execute(sql);
              sql = "SET @userID = (SELECT id FROM USER WHERE email = @email)";
              stmt.execute(sql);
              sql = "DELETE FROM user_role_group WHERE user_id = @userID";
              stmt.execute(sql);
              sql = "DELETE FROM user_client_setup WHERE user_id = @userID";
              stmt.execute(sql);
              sql = "DELETE FROM USER WHERE id = @userID";
              stmt.execute(sql);
              con.close();
              System.out.println("Deleting user " + email + " from the Core DB");
          } catch(Exception e){ System.out.println(e);}
      }
      

      stmt.executeQuery 在您尝试从查询中获取结果集时使用。但在这种情况下,您不是在要求结果集。这就是为什么不需要Resultset 而只有stmt.execute 可以工作的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-04
        • 1970-01-01
        • 2014-02-16
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 2022-12-21
        相关资源
        最近更新 更多