如何在Java中使用变量执行SQL语句
我使用下面的mysql语句从正在工作的数据库中删除记录如何在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
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将简化相同的查询。它还具有性能优势,因为查询只编译一次,执行多次。