MySQLSyntaxErrorException vicino a “?” Quando si tenta di eseguire PreparedStatement

Sto cercando di eseguire una query utilizzando un PreparedStatement in Java.

Ricevo l’errore numero 1064 quando provo ad eseguire la mia query (errore di syntax).

Ho provato questo nel browser di query MySQL con valori sostitutivi che funziona bene.

Cosa c’è che non va nel mio codice?

Ecco il codice rilevante:

String query = "select MemberID, MemberName from members where MemberID = ? or MemberName = ?"; Connection conn = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD); PreparedStatement s = conn.prepareStatement(query); s.setInt(1, 2); s.setString(2, "zen"); ResultSet rs = s.executeQuery(query); 

Ecco l’eccezione che sto ottenendo:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: si è verificato un errore nella syntax SQL; controlla il manuale che corrisponde alla tua versione del server MySQL per la syntax corretta da usare vicino a ‘? o MemberName =? ‘ alla linea 1

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: si è verificato un errore nella syntax SQL; controlla il manuale che corrisponde alla tua versione del server MySQL per la syntax corretta da usare vicino a ‘? o MemberName =? ‘ alla linea 1

MySQL non capisce il significato di ? nella query SQL. È in effetti una syntax SQL non valida. Quindi in qualche modo non è stato sostituito da PreparedStatement . E indovina cosa?

 PreparedStatement s = conn.prepareStatement(query); s.setInt(1, intValue); s.setString(2, strValue); rs = s.executeQuery(query); // Fail! 

Stai sovrascrivendo la query preparata con la query originale! È necessario chiamare il metodo argumentedStatement PreparedStatement#executeQuery() argomenti anziché Statement#executeQuery(String) .

 PreparedStatement s = conn.prepareStatement(query); s.setInt(1, intValue); s.setString(2, strValue); rs = s.executeQuery(); // OK! 

Non correlato al problema, il tuo codice sta perdendo risorse. Il DB si esaurirà dopo diverse ore e la tua applicazione si bloccherà. Per risolvere questo problema, è necessario seguire l’idioma JDBC di chiudere Connection , Statement e ResultSet nel blocco finale del blocco try dove sono stati acquisiti. Controlla il tutorial di base JDBC per maggiori dettagli.