繁体   English   中英

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

[英]How to execute a SQL statement in Java with variables

我有以下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 =(从用户WHERE email = @email中选择SELECT ID)附近使用; 从第2行的user_role_'删除

使用execute()而不是executeQuery(),因为它返回多个ResultSet。 请参阅答案( Statement.execute(sql)与executeUpdate(sql)和executeQuery(sql) ),然后将?allowMultiQueries = true添加到数据库URL "jdbc:mysql://db.com:3306/core?allowMultiQueries=true"

我怀疑问题是由于MariaDB中的allowMultiQueries标志所致。 默认为false ,这意味着每个查询本质上都是在真空中运行的,而您的SET @userID = (SELECT id FROM user WHERE email = @email); 查询不知道@email是什么。 要使用当前代码解决此问题,请设置数据库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是必要的,只有stmt.execute应该工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM