# Optimierung meiner Datenbankklasse



## Airwolf89 (5. Mrz 2010)

Hallo,

ich habe mir eine Klasse geschrieben die es mir erlauben auf meine Datenbanken zuzugreifen und Sachen auszulesen, zu verändern und zu löschen. Funktioniert auch wunderbar. Ich wollte nur mal wissen ob ihr eventuell Vorschläge habt wie man das optimieren kann, ob es mit der Funktionsweise Probleme geben kann an irgendeiner Stelle und ob es bessere Wege gibt so etwas zu realisieren.


```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class DBConn {

    private Connection conn;
    private Statement state;
    private String query;
    private ArrayList<ArrayList> listGesamt = new ArrayList<ArrayList>();
    private ArrayList<String> list = new ArrayList<String>();

    public DBConn() {
    }

    public void Connect(String link, String user, String pswd) {
        try {
            conn = DriverManager.getConnection(link , user, pswd);
            conn.setAutoCommit(false);
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, e.getMessage() + "\n" + e.getNextException(), "Fehler", 1);
        }
    }

    public ArrayList<ArrayList> lesen(String query) {

        listGesamt = new ArrayList<ArrayList>();
        list = new ArrayList<String>();

        try {
            ResultSet rs = null;

            this.query = query;

            rs = getObjekte(this.query);
            ResultSetMetaData rsmd = rs.getMetaData();

            int columnCount = rsmd.getColumnCount();

            while (rs.next()) {

                for (int i = 1; i <= columnCount; i++) {
                    list.add(rs.getString(i));
                }
                listGesamt.add(list);
            }
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, e.getMessage() + "\n" + e.getNextException(), "Fehler", 1);
        }
        return listGesamt;
    }

    public void schreiben(String query) {
        setObjekte(query);
    }

    public void loeschen(String query) {
        setObjekte(query);
    }

    private ResultSet getObjekte(String query) {
        ResultSet rset = null;

        try {
            state = conn.createStatement();
        } catch (SQLException se) {
            //fehlerausgabe
            System.out.println("SQLFehler bei Statement-Erstellung");
            se.printStackTrace();
            System.exit(12);
        } catch (NullPointerException e) {
            System.out.println("Fehler! Statement ist leer!");
            e.printStackTrace();
            System.exit(12);
        }

        try {
            rset = state.executeQuery(query);
            conn.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return rset;
    }

    private void setObjekte(String query) {

        try {
            state = conn.createStatement();
        } catch (SQLException se) {
            //fehlerausgabe
            System.out.println("SQLFehler bei Statement-Erstellung");
            se.printStackTrace();
            System.exit(12);
        } catch (NullPointerException e) {
            System.out.println("Fehler! Statement ist leer!");
            e.printStackTrace();
            System.exit(12);
        }

        try {
            state.executeUpdate(query);
            conn.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void closeConnection() {
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
```

Danke im voraus.


----------



## Atze (5. Mrz 2010)

1. (zeilen 15, 16) warum initialisierst du die beiden arraylists schon bei der deklaration, obwohl du sie nur in einer methode nutzt, in der du sie dann nochmal initialisierst?

2. (zeile 24) warum setzt du autocommit auf false, wenn du nur atomare querys absetzt, bzw nicht prüfst ob es klappt, und sowieso kein rollback drin hast?

3. (zeile 14, bzw 38) warum hälst du dir den query-string als member und setzt ihn in der methode lesen() um ihn danach nur in der gleichen methode zu lesen? (ähnlich state)

4. (zeile 58, 62) warum gibt es die methoden schreiben() und löschen(), wenn beide eh nur den query-string an setObjekte() weiterleiten?

5. (zeile 75, 79, 100, 104) warum beendet das ganze programm, wenn es in dieser klasse zu ner exception kommt?

generell:
- man könnte/sollte noch abfragen ob die conn überhaupt zustande kommt (if(conn==null)...)
- warum ein mix aus deutscher und englischer sprache?
- methoden klein beginnen (connect(...))


----------



## Airwolf89 (5. Mrz 2010)

Ok, danke für die Tipps. Habe ich jetzt alles geändert.

Zu der Sache mit dem Überprüfen ob die Abfrage geklappt hat, wie würde ich das am besten machen?


----------



## Atze (5. Mrz 2010)

Statement (Java 2 Platform SE v1.4.2)

hier siehst du ja, was dir die verschiedenen execute... methoden zurückliefern.

und wenn eine exception auftritt, ist definitiv was daneben gegangen.


----------

