2016-09-29 3 views
0

Ich arbeite an einem kleinen Minecraft-Plugin. Ich versuche, Daten in die Datenbank mit meiner DatabaseManager Klasse einzufügen, aber aus irgendeinem Grund funktioniert es nicht. Es gibt keine Fehlermeldungen und das Passwort und der Benutzername sind korrekt. Ich habe auch versucht, den SQL-Code manuell in die Datenbank einzufügen und es funktioniert, so dass es keine SQL-Syntaxfehler gibt. Für mich scheint es, dass die Aussage aus irgendeinem Grund nicht ausgeführt wird, aber ich kann den Fehler nicht finden. Unten ist der Code meiner Klasse.JDBC-Anweisung wird nicht ausgeführt (keine Fehler)

import java.sql.*; 

public class DatabaseManager { 
    Connection conn = null; 
    Statement stmt = null ; 
    ResultSet result = null; 

    String user = "root" ; 
    String pass = ""; 

    public ResultSet executeQuery(String query) throws SQLException{ 
     try{ 
     conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/metrocraft",user,pass); 
     stmt = conn.createStatement(); 
     result = stmt.executeQuery(query); 

     }catch (Exception ex){ 
      ex.printStackTrace(); 
     }finally{ 
     if(result != null) 
      result.close(); 
     if(stmt != null) 
      stmt.close(); 
     if(conn != null) 
      conn.close(); 
     } 
     return result ; 
    } 
    //Metrocraft relevant code 

    public void addZone(double p1X , double p1Y,double p2X,double p2Y) throws SQLException{ 
     String sql = "INSERT INTO `zones`(`p1X`, `p1Y`,`p2X`, `p2Y`) VALUES (" + p1X + ","+ p1Y+","+p2X+","+p2Y+"); "; 
     System.out.print(sql); 
     executeQuery(sql); 
    } 
} 
+0

Sie möchten vielleicht [diese] (http://stackoverflow.com/a/3226433/1008671) überprüfen. – budwiser

+0

Möglicherweise möchten Sie das Öffnen und Schließen der Datenbankverbindung jedes Mal erneut überprüfen, wenn Sie eine Abfrage ausführen müssen. Das Öffnen ist sehr teuer (zeitraubend) und führt dazu, dass dein Mod langsam ist, wenn es abgefragt werden muss. Stattdessen würde ich vorschlagen, dass du deine Verbindung öffnest, wenn du das erste Mal abfragen musst (oder wenn dein Mod startet), es offen hält und es dann schließt, wenn deine Mod heruntergefahren wird. Auf diese Weise können Sie die Verbindung mehrfach verwenden und die Kosten für die erneute Öffnung kontinuierlich sparen. – SnakeDoc

+0

Yeah danke, du denkst darüber nach! – TBrauwers

Antwort

1

Sie riskieren einen bösartigen Angriff durch SQL injection. Zu vorbereiteten Anweisungen wechseln BTW, verwenden executeUpdate für Datenbank-Schreiboperationen

PreparedStatement stmt = conn.prepareStatement(query); 
result = stmt.executeUpdate(); 
+2

Ich würde auch erwähnen, warum Sie 'PreparedStatement' verwenden, die' stmt = conn.createStatement(); stmt.executeQuery (query); ' – SnakeDoc

+0

Seine Arbeit Danke! – TBrauwers

0

Sie haben nicht das Laufwerk in Ihrem Programm geladen, bevor die Datenbank zur Gründung der Antrieb mit dem folgenden Befehl aktualisieren

Class.forName("com.mysql.jdbc.Driver") 

Sie müssen connection.so laden Sie Ihre Versuchen Sie Catch-Block wie unten erwähnt

try { 

    Class.forName("com.mysql.jdbc.Driver"); 

    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/metrocraft",user,pass); 
    stmt = conn.createStatement(); 
    result = stmt.executeQuery(query); 

} catch (Exception ex) { 
    ex.printStackTrace(); 
} 
+2

Nur eine Anmerkung - das manuelle Laden des Treibers über 'Class.forName()' wird mit JDBC 4.0 und höher nicht mehr benötigt. Wenn Sie den JDBC-Treiber kürzlich heruntergeladen haben, müssen Sie ihn nicht manuell laden. – SnakeDoc

+0

danke für die Updates – jeetendar

Verwandte Themen