簡體   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