PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : programmvorstellung: MySQL Querybrowser 0.1



sim4000
23.12.2007, 16:19
Hallo zusammen.
Ich hab jetzt grad mein erstes größeres Java-Programm "fertig" gestellt.
Und zwar handelt es sich hier bei um einen MySQL-Querybrowser. Man kann mit dem Ding Abfragen an den MySQL-Server senden. Dieser gibt dann eine Tabelle zurück.
Datenmanipulation ist noch nicht möglich.

Nun möchte ich euch bitten, mal auf Bugsuche zu gehen. Außerdem möchte ich von euch ein Feedback, ab das Programm zB verständlich ist. :)

Downloadlink: http://sim4000.pudelwerfer.de/downloads/java/querybrowser.tar.gz

Danke schon mal für eure Bemühungen.
Lg, sim.

supersucker
24.12.2007, 00:33
Uiuiui,

sorry, verträgst du harte, aber konstruktive Kritik?

Ich hoffe ja:

Ich habs nur mal überflogen, aber verschiedene Sachen solltest du dringend ändern:


public class Main {

private GUI gui = null;

Main() {
this.gui = new GUI();
this.gui.setVisible(true);
}

public static void main(String[] args) {
new Main();
}

}

Was soll das? Das ist bestenfalls unschön...


// Konstruktoren
MySQL_Class(String user, String pass, String db) {
this.user = user;
this.pass = pass;
this.db = db;
this.host = "localhost";
this.port = "3306";
}

MySQL_Class(String user, String pass, String db, String host) {
this.user = user;
this.pass = pass;
this.db = db;
this.host = host;
this.port = "3306";
}

MySQL_Class(String user, String pass, String db, String host, String port) {
this.user = user;
this.pass = pass;
this.db = db;
this.host = host;
this.port = port;
}

Auch sehr unschön, wenn dann ruf innerhalb der vielen Konstruktoren einen Standard-Konstruktor auf und erweitere "darum herum".






jLabel5.setHorizontalAlignment(javax.swing.SwingCo nstants.RIGHT);
jLabel5.setText("Port:");

jLabel2.setHorizontalAlignment(javax.swing.SwingCo nstants.RIGHT);
jLabel2.setText("User:");

jLabel4.setHorizontalAlignment(javax.swing.SwingCo nstants.RIGHT);
jLabel4.setText("Host:");

jLabel3.setHorizontalAlignment(javax.swing.SwingCo nstants.RIGHT);
jLabel3.setText("Password:");

Port.setText("3306");

Host.setText("localhost");

jLabel1.setFont(new java.awt.Font("Dialog", 0, 12));
jLabel1.setForeground(new java.awt.Color(0, 0, 204));
jLabel1.setHorizontalAlignment(javax.swing.SwingCo nstants.CENTER);
jLabel1.setText("Zugangsdaten zum Datenbankserver");

Ok, schnell, was macht jlabel8? und was macht jlabel3? Wo sind für sich sprechende Namen?


jScrollPane2.setViewportView(Output);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout .Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILI NG, layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.G roupLayout.Alignment.TRAILING)
.addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 568, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.LEADIN G, layout.createSequentialGroup()
.addComponent(Connection)
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addComponent(SetFrame)
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED, 346, Short.MAX_VALUE)
.addComponent(Send))
.addGroup(javax.swing.GroupLayout.Alignment.LEADIN G, layout.createSequentialGroup()
.addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addComponent(ActiveUser, javax.swing.GroupLayout.PREFERRED_SIZE, 191, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addComponent(ActiveDB, javax.swing.GroupLayout.PREFERRED_SIZE, 149, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout .Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.G roupLayout.Alignment.BASELINE)
.addComponent(jLabel6)
.addComponent(jLabel8)
.addComponent(ActiveDB)
.addComponent(ActiveUser))
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.UNRELATED)
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 316, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.G roupLayout.Alignment.TRAILING, false)
.addComponent(Connection, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(SetFrame, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(Send, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(26, 26, 26))
);


Du glaubst nicht echt, das du das noch in zwei Wochen auf den ersten Blick verstehst, oder?

Noch generell: Wo sind die Kommentare? Wo ist das Logging? Desweiteren generell sehr viel unnötiger Code, den könnte man locker noch auf die Hälfte bringen, du wiederholst viel zu oft Sachen, die man zusammenfassen könnte / sollte.

Wie schon gesagt, nur ein erster Blick.....

sim4000
24.12.2007, 00:46
Klar vertrage ich harte Kritik. Will das ja schließlich lernen. Deswegen erfrage ich ja hier Feedback.

Die GUI ist mit NetBeans gemacht. :)
Da kann ich leider nix für. (Naja eigentlich schon)

Was hältst du denn in der Main() für "unschön"?
Das mit den Konstruktoren ist verständlich. Kommt mit in meine ToDo.

Alle Labels die keinen expliziten namen haben, sind einfach nur "Deko". Also zB die Beschriftungen für die Eingabefelder der Zugangsdaten. Da ich dort im Programm nix verändern muss, hab ich es nicht für nötig gesehen, denen andere Namen zu geben.

So. Und was sagst du zu dem Programm selber? :)
Funktioniert es bei dir? Ist es verständlich?

supersucker
24.12.2007, 03:40
Da ich jetzt leicht einen hängen hab, alles ohne Garantie.............:devil:


Was hältst du denn in der Main() für "unschön"?

Du machst einen einfachen Sachverhalt unnötig kompliziert, das hier:


public class Main {

private GUI gui = null;

Main() {
this.gui = new GUI();
this.gui.setVisible(true);
}

public static void main(String[] args) {
new Main();
}

}

sollte so aussehen:


public class Main {

public static void main(String[] args) {
GUI myGui = new GUI();
myGui.setVisible(true);;
}

}

this bzw. private in der Konstellatoin der main-Methode macht überhaupt keinen Sinn, darauf kann man in diesem Fall völlig verzichten.

wieder => klarer, strukturierter, leichter verständlicher.


// Konstruktoren
MySQL_Class(String user, String pass, String db) {
this.user = user;
this.pass = pass;
this.db = db;
this.host = "localhost";
this.port = "3306";
}

MySQL_Class(String user, String pass, String db, String host) {
this.user = user;
this.pass = pass;
this.db = db;
this.host = host;
this.port = "3306";
}

MySQL_Class(String user, String pass, String db, String host, String port) {
this.user = user;
this.pass = pass;
this.db = db;
this.host = host;
this.port = port;
}

sollte sowas werden:


// Konstruktoren
MySQL_Class(String user, String pass, String db) {
this.user = user;
this.pass = pass;
this.db = db;
this.host = "localhost";
this.port = "3306";
}

MySQL_Class(String user, String pass, String db, String host) {
MySQL_Class(user, pass, db);
this.host = host;
}

MySQL_Class(String user, String pass, String db, String host, String port) {
MySQL_Class(user, pass, db);
this.host = host;
this.port = port;
}

Du siehst was ich meine? Einfacher, leichter verständlicher, objektorientierter und leichter erweiterbar.

Auch sowas:


// Statement absetzen und in einem Array wieder geben
public String[][] mysqlArray(String query) {
String[][] array = null;
try {
if(this.mysqlQuery(query)) {
if(this.numRows()<1) {
this.errmsg = "Anfrage ergab kein Ergebnis!";
return null;
}
if(Runtime.getRuntime().freeMemory()<1000000) {
this.errmsg = "Die Abfrage erzeugt zu viel Output!\n";
this.errmsg = this.errmsg+"Bitte die Option \"limit\" nutzen!";
array = null; this.clearStatement();
return null;
}
array = new String[this.numRows()][this.numFields()];
int i=0;
this.result.first();
do {
for(int j=0; j<this.numFields(); j++) array[i][j] = this.getItemNum(j+1);
i++;
} while(this.result.next());
return array;
} else {
return null;
}
} catch(SQLException e) {
this.errmsg = "mysqlArray: "+e.toString();
return null;
}
}

geht gar nicht.

Du hast da 5 oder 6 returns drinnen! Das was in der Methode ist, kannst du locker in der Hälfte machen....


// Verbindung trennen
public boolean mysqlDisconnect() {
if(this.connection!=null) {
try {
this.connection.close();
this.connection=null;
return true;
} catch(SQLException e) {
return false;
}
} else {
return false;
}
}


Auch schlecht:

Wenn überhaupt, dann ein "try-catch-finally" -Block.

Nicht böse gemeint, aber dir scheint nicht klar zu sein wofür exceptions da sind und wie man sie verwendet. Lies doch nochmal im Java openbook das Kapitel, dann weißt du was ich meine.

P.S. Ich hab mir nur den src-code angeschaut, ohne das Ding zum Laufen zu bringen, zu deinen Fragen kann ich also nichts sagen....

P.P.S: Wenn du dich für Java interessierst, schau dir doch mal:

- Spring
- AOP
- EJBs
- SOA

an, da siehst du sehr ausgereifte Java-Techniken. Oder kuck dir mal Active-MQ an wenn du guten source-code sehen willst.

sim4000
24.12.2007, 13:37
Hm...
So wie ich das dort gemacht hab, haben wir das in der Schule gelernt.
Da sieht man mal wieder, Lehrer... :)
Gut dann werd ich mich mal durch diverse Dokus schlagen. Danke für deine ehrliche Meinung.

Gibts noch jemanden der mir was zu dem Programm selber sagen kann?