Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用变量执行SQL语句_Java_Mysql - Fatal编程技术网

如何在Java中使用变量执行SQL语句

如何在Java中使用变量执行SQL语句,java,mysql,Java,Mysql,我使用下面的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 W

我使用下面的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;
我想使用JDBCMySQL连接在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”附近使用的正确语法的版本 来自用户,其中email=@email;从第2行的用户角色中删除


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

使用execute而不是executeQuery,因为它返回多个结果集。请参阅答案并将?allowMultiQueries=true添加到数据库url
jdbc:mysql://db.com:3306/core?allowMultiQueries=true

如果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。这就是为什么不需要Resultset,只有stmt.execute可以工作。

查找准备好的语句jdbcPreparedStatement将简化相同的查询。它还具有性能优势,因为查询只编译一次,执行多次。