Java MySQL vérifier si une valeur existe dans la base de données
Je suis en train de vérifier si une valeur existe déjà dans ma base de données. Je suis accédant à la base de données à partir de java application autonome à l'aide de JDBC (requêtes pour l'insertion d'enregistrements dans la db de travail donc mon installation et de connexion sont ok).
String queryCheck = "SELECT * from messages WHERE msgid = " + msgid;
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(queryCheck); //execute the query, and get a java resultset
//if this ID already exists, we quit
if(rs.absolute(1)) {
conn.close();
return;
}
J'obtiens cette erreur (il n'y a apparemment quelque chose de mal avec ma syntaxe SQL):
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'd-f05708071f8f' at line 1
Cependant, si j'essaie d'exécuter cette commande dans mon MySQL en ligne de commande, ça marche!!! Pouvez-vous me dire, quoi de mal avec ma déclaration? Merci pour les conseils!
S'il vous plaît, veuillez, s'il vous plaît, utilisez TOUJOURS la liaison de requête... TOUJOURS non seulement vous éviter les attaques par injection SQL, vous aidez également à la base de données met en cache le plan d'exécution de décisions de la prochaine requête plus rapide.
OriginalL'auteur Smajl | 2013-04-19
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'envelopper un
String
entre guillemets dans MySQL, de sorte que la requête doit êtrePas
De sorte que le code devrait lire
Je conseille un
PreparedStatement
pour éviter ces sortes de questions et tout risque d'injection SQL:Utilisant la concaténation de chaîne pour la construction des requêtes est considéré comme très mauvaise pratique. A été pour un long moment maintenant.
Plus loin, je vous recommande d'utiliser
select count(*)
plutôt que de la pleineselect *
car cela revient beaucoup moins de données (pensez à la taille de laResultSet
) et MySQL peut l'optimiser.OriginalL'auteur Boris the Spider
Vous avez besoin d'utiliser des variables de liaison.
Ou entrer dans le manuel de citer, mais c'est risqué.
En plus de prévenir l'injection SQL, requêtes préparées devrait également améliorer les performances si vous exécutez la même requête à plusieurs reprises.
OriginalL'auteur Thilo
Vous pouvez essayer ceci:
Vous avez manqué des guillemets autour msgid. (Je suis en supposant que msgid est
String
et pasInteger
valeur. )PreparedStatement
de nombreux utilisateurs downvote vous instantanément si vous ne le faites pas, sur la même note, vous obtiendrez des upvotes pour la mention de l'injection sql/preparedstatements.OriginalL'auteur PC.
Depuis msgid est un varchar vous devez entourer la valeur dans la clause where avec des guillemets simples.
De générer dynamiquement des chaînes SQL n'est pas de recommander cependant, car il peut exposer votre application à l'injection sql.
Au lieu d'utiliser un
PreparedStatement
:OriginalL'auteur Kevin Bowersox
Utiliser les guillemets simples arount le paramètre:
Ou mieux vous utilisez les requêtes préparées.
OriginalL'auteur CloudyMarble
Vous avez besoin d'utiliser les guillemets simples
OriginalL'auteur PSR
Juste une simple entrée en double algorithme
OriginalL'auteur OG.MIRACLE