[Java] MySql-Connection Klasse

01/26/2014 20:19 XxharCs#1
Hey,
im Zuge einer Aufgabe musste ich eine Verindung mit der Datenbank mittels JDBC aufbauen/herstellen. Also dachte ich, ich könnte meine Connection-Klasse für MySql, mit euch teilen.

Es wird ein MySql-Connector gebraucht welchen man ganz leicht von zB. der offizielen Seite downloaden kann: [Only registered and activated users can see links. Click Here To Register...]

Vielleicht findet irgendwann, irgendwer Verwendung darin.

ConnectionLogic.java:
Code:
package XxharCs;

import com.mysql.jdbc.jdbc2.optional.*;
import java.sql.*;
import java.util.regex.*;
import javax.sql.*;

/**
 * Diese Klasse implementiert die Connection Logik. Es wird also die Verbindung zur Datenbank verwaltet, ebenfalls wie das schließen der
 * Verbindung zur Datenbank. Weiters verwaltet diese Klasse eine execute-Methode die den vom Benutzer eingegeben String bereitstellt und an die 
 * Datenbank absendet.
 * 
 * @author XxharCs
 * @version 1.3
 */
public class ConnectionLogic {

	private String host, user, pass, db;
	private MysqlDataSource ds;
	private Connection con;
	private ResultSet rs;
	private PreparedStatement st;
	private boolean status = false;

	/**
	 * Diese Methode übernimmt die vom Benutzer angegebenen Connection-Parameter.
	 * @param host der Hostname
	 * @param user der Username
	 * @param pass das Password
	 * @param db der Datenbankname
	 */
	public void setConnection(String host, String user, String pass, String db) {

		this.host = host;
		this.user = user;
		this.pass = pass;
		this.db = db;
	}

	/**
	 * Diese Methode stellt eine Verbindung zur Datenbank.
	 * @return ob die Verbindung erfolgreich war oder nicht.
	 */
	public boolean connect() {

		ds = new MysqlDataSource();

		ds.setServerName(getHost());
		//ds.setPort(7188); // Für die Server2Go-Datenbank
		ds.setUser(getUser());
		ds.setPassword(getPass());
		ds.setDatabaseName(getDB());

		try {

			con = ds.getConnection();
			System.out.println("Erfolgreich verbunden!");
			return status = true;
		}catch(SQLException sqle) {

			System.out.println("Error: " + sqle.getMessage());
			return status = false;
		}
	}

	/**
	 * Diese Methode bricht die Verbindung zur Datenbank ab.
	 */
	public void disconnect() {

		if(status == true) {

			try {

				con.close();
				if(st != null && rs != null) {
					st.close();
					rs.close();
					st = null;
					rs = null;
				}
				con = null;
				System.out.println("Erfolgreich geschlossen!");
				status = false;
			}catch(SQLException sqle) {

				System.out.println("Error: " + sqle.getMessage());
				status = true;
			}
		}
	}

	/**
	 * Der vom Benutzer eingegebener SQL Befehl wird an die Datenbank geschickt bzw. der vom Benutzer eingegebener SQL Befehl wird ausgeführt.
	 * @param sql der SQL Befehl vom Benutzer
	 * @return die Rückgabe des SQL Befehls
	 */
	public ResultSet execute(String sql) {

		try {

			st = con.prepareStatement(sql);
			rs = st.executeQuery();
			return rs;
		}catch(SQLException sqle) {

			System.out.println("Error: " + sqle.getMessage());
			return null;
		}
	}

	/**
	 * Getter-Methode für den Hostname
	 * @return den Hostname
	 */
	public String getHost() {

		return this.host;
	}

	/**
	 * Getter-Methode für den Username
	 * @return den Username
	 */
	public String getUser() {

		return this.user;
	}

	/**
	 * Getter-Methode für das Password
	 * @return das Password
	 */
	public String getPass() {

		return this.pass;
	}

	/**
	 * Getter-Methode für den Datenbanknamen
	 * @return den Datenbanknamen
	 */
	public String getDB() {

		return this.db;
	}

	/**
	 * Getter-Methode für den jeweiligen Connection-Status der Datenbank
	 * @return den derzeitigen Connection-Status mit der Datenbank (falls verbunden true, wenn nicht false)
	 */
	public boolean getStatus() {

		return this.status;
	}

	/**
	 * Setter-Methode die den jeweiligen Connection-Status der Datenbank setzt
	 * @param status den Connection-Status der Datenbank
	 */
	public void setStatus(boolean status) {

		this.status = status;
	}
}
01/26/2014 23:24 dowhile#2
Angenommen ich möchte, sollte die Verbindung nicht aufgebaut werden können, ein Fenster mit der Fehlermeldung anzeigen. Wie mache ich das mit der Klasse?

Wäre es sinnvoll, bei einem solchen Fehler eine Ausgabe mit sout() zu machen und true / false zurückzugeben würde JDBC keine Exception werfen.
01/27/2014 14:01 XxharCs#3
Da die Klasse auf einer CLI-Basierenden Anwendung ihre Verwendung nötigte (bzw. deshalb geschrieben wurde), sah ich kein Bedürfnis jetzt extra Message Boxen für die Fehler zu machen/auszugeben, sondern gebe diese einfach in der Konsole aus.
Es ist ja nicht so, dass ich kein Error Handling mache. (Überall wo eine Exception Zustande kommen könnte, wird diese dementsprechend bearbeitet, mit einer Ausgabe)

Außerdem da ich keine Library zur Verfügung stelle sondern nur eine Klasse, kannst du diese deinen Bedürfnissen (darunter auch die Ausgaben etc.) anpassen.
01/27/2014 16:53 dowhile#4
Was ist wenn meine Konsolenanwendung den Fehler lieber loggen möchte?

Quote:
sah ich kein Bedürfnis jetzt extra Message Boxen für die Fehler zu machen/auszugeben
Das wäre auch doof. Die Exception aber einfach weiter zugeben, damit der Nutzer deiner Klasse sie ordentlich verarbeiten kann hingegen nicht. Ich meine nur, Ausgaben mit sout() irgendwo im Programme sind fast immer unbrauchbar, dann lieber noch mit Logger. Besser aber - und so ist es ja auch gedacht - die Exception weitergeben wenn man sie an einer Stelle nicht ausreichend genug verarbeiten kann.

Generell, welchen Nutzen hat es, true / false beziehungsweise Wert / null zurückzugeben anstatt einer Exception? Es ist weit weniger flexibel (keine Meldung, nur möglich wenn es einen einzigen Fehler gibt) und produziert eher noch mehr Code als es einspart.

Welchen Vorteil siehst du darin, die Exception zu fangen, eine Ausgabe mit sout() zu machen und dann true / false zurückzugeben?
01/27/2014 17:37 XxharCs#5
Quote:
Originally Posted by dowhile View Post
Welchen Vorteil siehst du darin, die Exception zu fangen, eine Ausgabe mit sout() zu machen und dann true / false zurückzugeben?
Weil wenn zB. wenn eine Verbindung schon steht, ich mich aber nochmal verbinden möchte (DAU - Testing) bekomme ich nur Exceptions etc.
Hier ein Auschnitt meines Programmes, weshalb es einen sehr guten Grund hat, wieso ich dies so angehe.
Code:
private ConnectionLogic cl;
...
...
if(cl.getStatus() == false) {
    if(cl.connect() == true) {
        // do your work here
    }
}
...
...
if(cl.getStatus() == true) {
    cl.disconnect();
}
...

Edit:
Quote:
Originally Posted by dowhile View Post
dann lieber noch mit Logger.
Hmm, die Fehler generell zu loggen, da würd ich auf erster Überlegung nicht kommen..ist eigentlich eine nette Idee! :)