[英]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.