web-dev-qa-db-fra.com

Java MySQL vérifie si la valeur existe dans la base de données

J'essaie de vérifier si une valeur spécifique existe déjà dans ma base de données. J'accède à la base de données depuis l'application autonome Java à l'aide de JDBC (requêtes d'insertion d'enregistrements dans la base de données afin que ma configuration et ma connexion soient correctes).

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;
}

Je reçois cette erreur (il y a apparemment quelque chose qui ne va pas 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 ma ligne de commande MySQL, cela fonctionne! Pouvez-vous me dire ce qui ne va pas avec ma déclaration? Merci pour tous les conseils!

11
Smajl

Vous devez mettre une String entre guillemets dans MySQL. La requête doit donc être

SELECT * from messages WHERE msgid = 'd-f05708071f8f';

Ne pas

SELECT * from messages WHERE msgid = d-f05708071f8f;

Donc, le code devrait se lire

String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'";

Je suggérerais d’utiliser une variable PreparedStatement pour éviter ce genre de problème et tout risque d’injection SQL:

final String queryCheck = "SELECT * from messages WHERE msgid = ?";
final PreparedStatement ps = conn.prepareStatement(queryCheck);
ps.setString(1, msgid);
final ResultSet resultSet = ps.executeQuery();

L'utilisation de la concaténation de chaînes pour la création de requêtes est considérée comme une très mauvaise pratique. Cela fait longtemps maintenant.

De plus, je suggérerais d'utiliser select count(*) plutôt que le select * complet, car cela renvoie beaucoup moins de données (pensez à la taille de la ResultSet) et que MySQL peut l'optimiser aussi.

final String queryCheck = "SELECT count(*) from messages WHERE msgid = ?";
final PreparedStatement ps = conn.prepareStatement(queryCheck);
ps.setString(1, msgid);
final ResultSet resultSet = ps.executeQuery();
if(resultSet.next()) {
    final int count = resultSet.getInt(1);
}
24
Boris the Spider

Vous devez utiliser des variables de liaison. 

 PreparedStatement st = conn.prepareStatement(
    "SELECT * from messages WHERE msgid = ?");
 st.setString(1, msgid);
 ResultSet rs = st.executeQuery(queryCheck); 

Ou entrer dans les citations manuelles, mais c'est risqué.

En plus d'empêcher l'injection SQL, les instructions préparées devraient également améliorer les performances si vous exécutez la même requête à plusieurs reprises.

5
Thilo

Comme msgid est un varchar, vous devez entourer la valeur de la clause where avec des guillemets simples.

String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'";

La génération dynamique de chaînes SQL n'est toutefois pas recommandée, car elle peut exposer votre application à une injection SQL.

Utilisez plutôt une PreparedStatement:

            String queryCheck = "SELECT * from messages WHERE msgid = ?";
            PreparedStatement st = conn.prepareStatement(queryCheck);
            st.setString(1, msgid);
            ResultSet rs = st.executeQuery();
3
Kevin Bowersox

Utilisez des guillemets simples autour du paramètre:

"SELECT * FROM messages WHERE msgid = '" + msgid + "'";

Ou mieux vous utilisez déclarations préparées .

3
CloudyMarble

Vous pouvez essayer ceci:

String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'";

Vous avez manqué des citations autour de msgid. (Je suppose que msgstr est String et non Integer value.)

3
PC.

Vous devez utiliser des guillemets simples

SELECT * from messages WHERE msgid = 'd-f05708071f8f'; 
1
PSR
String sql1 ="SELECT Time FROM monday_wednesday WHERE Time ='"+time.getSelectedItem()+"'";
pst=con.prepareStatement(sql1);
rs=pst.executeQuery();
if(rs.next()) {
    if(rs.getString("Time").equals(time.getSelectedItem())) {
        JOptionPane.showMessageDialog(null,"Time is already taken","",JOptionPane.INFORMATION_MESSAGE); 
    }
} else {
    String sql="INSERT INTO monday_wednesday(pfname,pmname,plname,Birthdate,Gender,Address,City,Contact,Contactperson,Time,Date)\n" + "VALUES ('"+txtFirstName1.getText()+"','"+txtMiddleName1.getText()+"','"+txtLastName1.getText()+"','"+d+"','"+gender.getSelectedItem()+"','"+ txtAddress.getText()+"','"+txtCity.getText()+"','"+txtContact.getText()+"','"+txtContactPerson1.getText()+"','"+time.getSelectedItem()+"','"+dateFormat.format(date)+"')";
}

Juste un algorithme simple de duplication 

0
OG.MIRACLE