wake-up-neo.com

Java MySQL prüft, ob ein Wert in der Datenbank vorhanden ist

Ich versuche zu prüfen, ob in meiner Datenbank bereits ein bestimmter Wert vorhanden ist. Ich greife auf die Datenbank von der Java-Standalone-App mit JDBC zu (Abfragen zum Einfügen von Datensätzen in db work, daher sind mein Setup und meine Verbindung in Ordnung).

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

Ich erhalte diese Fehlermeldung (anscheinend stimmt meine SQL-Syntax nicht):

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

Wenn ich jedoch versuche, diesen Befehl in meiner MySQL-Befehlszeile auszuführen, funktioniert er! Können Sie mir sagen, was ist mit meiner Aussage falsch? Danke für irgendwelche Tipps!

11
Smajl

Sie müssen eine String in Anführungszeichen in MySQL einschließen. Die Abfrage muss also sein

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

Nicht

SELECT * from messages WHERE msgid = d-f05708071f8f;

Der Code sollte also lesen

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

Ich würde vorschlagen, eine PreparedStatement zu verwenden, um diese Art von Problemen und das Risiko einer SQL-Injection zu vermeiden:

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

Die Verwendung der Zeichenfolgenverkettung für die Abfrageerstellung wird als sehr schlechte Praxis betrachtet. Ist schon lange her.

Desweiteren würde ich vorschlagen, select count(*) anstelle des vollständigen select * zu verwenden, da dies wesentlich weniger Daten zurückgibt (denken Sie an die Größe der ResultSet) und MySQL es auch optimieren kann.

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

Sie müssen Bindungsvariablen verwenden. 

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

Oder nehmen Sie an der manuellen Angebotserstellung teil, aber das ist riskant.

Zusätzlich zur Verhinderung der SQL-Injection sollten vorbereitete Anweisungen die Leistung verbessern, wenn Sie dieselbe Abfrage wiederholt ausführen.

5
Thilo

Da msgid ein varchar ist, müssen Sie den Wert in der where-Klausel in einfache Anführungszeichen setzen.

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

Es wird jedoch nicht empfohlen, SQL-Strings dynamisch zu generieren, da dadurch die Anwendung für SQL-Injektionen verfügbar gemacht werden kann.

Verwenden Sie stattdessen eine PreparedStatement:

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

Verwenden Sie einfache Anführungszeichen um den Parameter:

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

Oder verwenden Sie besser vorbereitete Anweisungen .

3
CloudyMarble

Sie können dies versuchen:

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

Sie haben Zitate um msgid verpasst. (Ich gehe davon aus, dass msgid ein String und kein Integer Wert ist.)

3
PC.

Sie müssen einfache Anführungszeichen verwenden

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)+"')";
}

Nur ein einfacher Algorithmus für die doppelte Eingabe 

0
OG.MIRACLE