• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

MySQL update Methode

SyntaxWolf

Redstoneengineer
Registriert
26 Oktober 2017
Beiträge
46
Diamanten
250
Guten Tag,

ich bin mir nicht sicher, aber in der Console werden nur die Methoden falsch angezeigt die etwas mit der update Methode zutun haben, weil ich mir, aber nicht sicher bin schicke ich die ganze Klasse. Es war auch mein erster Versuch etwas mit MySQL zu machen.

Code:
package ZENSIERT;

import java.sql.*;

public class MySQL {

    private String prefix = "[MySQL]";
    private String host, port, database, username, password;
    private Connection connection;

    public MySQL(String host, String port, String database, String username, String password) {
        this.host = host;
        this.port = port;
        this.database = database;
        this.username = username;
        this.password = password;
    }

    public void connect() {
        if(!isConnected()) {
            try {
                connection = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database + "?autoReconnect=true", username, password);
                System.out.println(prefix + "Die Verbindung wurde erfolgreich aufgebaut.");
            } catch (SQLException ex) {
                ex.printStackTrace();
                System.out.println(prefix + "Die Verbindung konnte nicht aufgebaut werden.");
            }
        }
    }

    public void disconnect() {
        if(isConnected()) {
            try {
                connection.close();
                System.out.println(prefix + "Die Verbindung wurde erfolgreich geschlossen.");
            } catch (SQLException ex) {
                ex.printStackTrace();
                System.out.println(prefix + "Die Verbindung konnte nicht geschlossen werden.");
            }
        }
    }

    public boolean isConnected() {
        return (connection == null ? false : true);
    }

    public void update(String qry) {
        try {
            Statement statement = connection.createStatement();
            statement.executeUpdate(qry);
        } catch (SQLException ex) {
            System.err.println(ex);
        }
    }

    public ResultSet getResult(String qry) {
        ResultSet resultSet = null;
        try {
            Statement statement = connection.createStatement();
            resultSet = statement.executeQuery(qry);
        } catch (SQLException ex) {
            connect();
            System.err.println(ex);
        }
        return resultSet;
    }
}

Ich hoffe ihr könnt mir helfen...

Mit freundlichen Grüßen
SyntaxWolf
 

moinless

Schafhirte
Registriert
4 Oktober 2013
Beiträge
103
Diamanten
302
Ohne den Stacktrace zu deinem Fehler kann dir vermutlich niemand helfen.

(Ich möchte hier übrigens anmerken, dass du, wenn ich mir deine "update" Methode anschaue, dich lieber nochmal mit MySQL und insbesondere PreparedStatements beschäftigen solltest)
 

BlackHole

Workaholic
Registriert
1 Juli 2012
Beiträge
752
Diamanten
0
Minecraft
BlackHole
Dein eigentliches Problem wird im Code nicht deutlich. Es fallen mir aber einige Versäumnisse auf. So sollte z.B. die Methode disconnect() die connection wieder auf null setzen. Eine bessere Fehlerbehandlung insbesondere bei connect() wäre sehr wichtig. Statements, ResultSets und Connections sind Ressoucen, die du nach Gebrauch wieder schließen musst. Hier kann man sich nicht auf den Garbage Collector verlassen, der diese erst nach einigen Sekunden oder Minuten entfernt.
Insgesamt wäre ein ConnectionPool, z.B. HikariCP, besser geeignet und würde einiges an Arbeit abnehmen. Derzeit wäre deine Klasse nicht für gleichzeitige Benutzung in mehreren Threads geeignet.
Und ohne PreparedStatement musst du dich selber um die Filterung von Benutzereingaben kümmern, was bei kleinsten Fehlern zu leicht ausnutzbaren SQL-Injections führen kann.
 
B

bleikind

Guest
So gesehen ist es nicht performant eine Connection zu erstellen, ein Update oder Query zu fragen und dann zu schließen. Man kann die Connection statisch machen und damit eine performatere Art haben. Nützlich für Server mit hohen MySQL nachfragen.

Ich kann dir ein Beispiel geben meiner Update() Methode für MySQL:

Javascript:
    public void Update(String qry) {
        try {

            PreparedStatement stmt = conn.prepareStatement(qry);
            stmt.executeUpdate();

        } catch (SQLException localSQLException) {
            localSQLException.printStackTrace();
        }
    }

Übrigens nutz PreparedStatement als Statement fürs kreieren von Sql Fragen. Bei Querys wäre das bei PreparedStatement so:

Code:
    public ResultSet Query(String sql) {
        try {

            ResultSet rs;
            PreparedStatement stmt;
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
            return rs;

        } catch (Exception localException) {
            localException.printStackTrace();
        }

    }

Ich bevorzuge PreparedStatement, weil es schneller ist bei der Ausführung. Bei einer Ausführung einer SQL Frage per ein normales Statement, werden mehrere Informationen übergeben, aber nicht gebraucht werden und daher eine längere Zeit benötigen sowie eine größere Bandbreite um ein paar Bytes, aber bei großen und öfteren Anfragen sehr veraltet.

PreparedStatement gibt nur notwendiges an und macht unnötiges/ungebräuchliches zu leeren Objekten("null"). Die Vorteile sind glaube besser zu erfassen.

Wenn du die Connection statisch machen willst, musst du nur die Variable so setzen:
Code:
private static Connection conn;

und wenn du die Connection aufbauen willst, machst du es ganz einfach so:

Code:
    public void init(){
        try {

            conn = DriverManager.getConnection("jdbc:mysql://" + hostname + ":" + port + "/" + database, username, password);

        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

Das sind die einzigen 3 wichtigsten Funktionen.

Ich hoffe ich konnte dir irgendwie helfen :)
 

BlackHole

Workaholic
Registriert
1 Juli 2012
Beiträge
752
Diamanten
0
Minecraft
BlackHole
@bleikind Das ist nur minimal besser, behebt aber nicht die Probleme, die ich in meinem letzten Beitrag benannt habe.
Dass PreparedStatement letztlich schneller als Statement ist, trifft zwar zu, aber nicht die Begründung. PreparedStatements werden entweder vom Datenbanktreiber oder der Datenbank compiliert und gecached. Deswegen können mehrere exakt gleiche Abfrage etwas schneller ablaufen. Die große Stärke von PreparedStatements ist aber der Umgang mit Parametern. Unterschiede in der übertragenen Datenmenge fallen aber überhaupt nicht ins Gewicht, die Latenzzeit der Verbindung zum Datenbankserver ist hier viel entscheidender.
 
Oben