# DatenBank Anfänger



## Lexi (18. Okt 2009)

Ich möchte mich mal ganz gerne mit Datenbanken auseinandersetzten und damit ein wenig rumprobieren. Leider stehe ich grad komplett wie der Ochse vorm Berg und habe keine Ahnung wo ich anfangen soll. 
Ich habe hier ein Buch in dem beschrieben wird was Treiber sind und wofür ich die brauche, wie ich eine Verbindung herstelle und auf die Daten zugreife.
Allerdings weiß ich nicht wo ich meine Datenbank herbekomme. Muss ich da irgenwas installieren, oder muss da was in den Build-Path mit rein ? 
Ich bräuchte einen kleinen Antsoß.

Vielen Dank schonmal


----------



## L-ectron-X (18. Okt 2009)

Eine Datenbank wird auf einem Datenbankserver angelegt. Vielleicht hast du Webspace mit MySQL, dann kann man mit Java in vielen Fällen auch auf diese Datenbanken zugreifen.
Wenn du keinen Datenbankserver hast, kannst du dir mal das Projekt XAMPP oder eins der vielen anderen Datenbankprojekte anschauen.


----------



## Lexi (18. Okt 2009)

Also ermöglicht XAMPP einem die Datenbank auf dem lokalen Rechner zubenutzen ?


----------



## L-ectron-X (18. Okt 2009)

Ja. Aber das ginge auch bspw. mit HSQLDB, H2, ProstgreSQL etc.
H2 ist 'ne feine Sache. Also wenn du XAMPP (Apache, MySQL, PHP und Perl) nicht brauchst, sondern eine kleine schnelle und in Java geschriebene Datenbank suchst, kannst du dir mal H2 ansehen.


----------



## JanHH (19. Okt 2009)

Einem absoluten Anfänger würde ich allerdings zu HSQLDB raten, allein deshalb, weil es wohl die in Beispielen und Tutorials meistverwendete Datenbank ist.


----------



## Meldanor (20. Okt 2009)

Eine Datenbank hört sich hochtrapender an, als es ist. Als ich das Datenbanken das erste Mal hörte, dachte ich an Servercluster und riesige Datenstrukturen.
Aber Datenbank sind sehr sehr simple Konstrukte. Also jedenfalls die gut strukturierten ^^
Mit MySQL kannst du einen guten Einstieg machen, da es dafür hundert Anfängertutorials gibt und auch ein Haufen Tools.
Hier ist der Link zum Download des MySQL Server Packs.
MySQL :: MySQL 5.1 GA
Ein Nachschlagewerk und auch teilweise ein Tutorial ist das MySQL 5.1 Referenzbuch, wo ALLE Befehle erläutert werden. Es ist sozusagen die API für MySQL
MySQL :: MySQL 5.1 Referenzhandbuch :: 3 Einführung in MySQL: ein MySQL-Tutorial

Ich hab gelernt mich mit MySQL zurecht zu finden mit diversen Tools.
Wenn du erstmal "nur" eine Datenbank aufstellen willst und auch bei mySQL bleiben willst, kann du dir Workbench ( MySQL :: MySQL Workbench ) runterladen und installieren.
Für Verwalten hab nen Tool Namens NaviCat (Navicat - MySQL Overview - Navicat Oracle, MySQL database Admin Tool - Navicat Oracle, MySQL Admin Tool - the World's Best Oracle, MySQL GUI for Windows, Linux & Mac OS X - Download Now! Support Access to MySQL, Excel to MySQL, MySQL editor, MySQL ad). Dort hast du ein GUI, womit du dich erstmal mit allgemeinen Sachen zurecht finden kannst. Da gibt es auch eine Konsole, womit du die Befehle überhaupt erstmal lernen kannst.
Ich hab mich sozusagen von der Visualisierung über den harten Code vorgearbeitet und kam ganz gut klar

PS: Nein, ich bin kein Mitarbeiter bei MySQL ^^


----------



## MartinDD (6. Dez 2010)

Hallo liebe Leute,

ähnlich wie Lexi darf ich mich für in kleines Projekt ein wenig mit der Erstellung einer Datenbank auseinandersetzen. Allerdings will ich die Datenbank nur nach Einlesen eines Excel-Files erstellen und dann solange damit arbeiten, bis das Programm beendet wird. Es muss also nichts weiter gespeichert werden. Beim nächsten Start wird halt wieder die Excel-Datei eingelesen.

Das Einlesen der Exceldatei klappt mit der JExcelAPI auch sehr gut. Nur habe ich keinen wirklichen Plan wie ich jetzt die Daten aus der Tabelle sinnvoll in die Datenbank bekomme. Nach ein wenig recherechieren hier im Forum favorisiere ich die H2 Database Engine. Hat vielleicht einer von euch einen Link zu einem Beispiel oder einer kurzen Anleitung wie ich meine Daten in die Datenbank bekomme ?

Vielen Dank schonmal und viele Grüße

Martin


----------



## Gast2 (6. Dez 2010)

Auf der H2 Seite gibts doch gute Tutorials, hast du dir die schon angeschaut?


----------



## MartinDD (6. Dez 2010)

Hallo,

reingeguckt habe ich, allerdings habe ich den Wald vor lauter Bäumen nicht gesehen und für meinen einfachen Fall kein passendes Beispiel gefunden.
Ich habe so auf die schnelle nur Tutorials gefunden, die eine externe, auf einem Datenbankserver liegende DB nutzen, nichts jedoch wie ich intern in meinem Projekt eine anlege.

Kennt jemand dazu eine gute Quelle ?


----------



## AlexSpritze (6. Dez 2010)

MartinDD hat gesagt.:


> Allerdings will ich die Datenbank nur nach Einlesen eines Excel-Files erstellen und dann solange damit arbeiten, bis das Programm beendet wird. Es muss also nichts weiter gespeichert werden. Beim nächsten Start wird halt wieder die Excel-Datei eingelesen.



Wenn die Excel-Datei immer wieder neu eingelesen wird, brauchst du doch eigentlich keine Datenbank, oder? 

Oder willst du die Änderungen in der Excel-Datei aufzeichnen? Um die Daten aus der *.xls in die DB zu bekommen, musst du dir zunächst überlegen, wie die Daten in der DB abgebildet werden sollen. Prinzipiell hast du dort auch eine (oder auch mehrere) beliebig große Tabelle, allerdings müssen die Datentypen für jede Spalte explizit angegeben werden. Hast du da schon Erfahrung mit SQL?


----------



## Gast2 (6. Dez 2010)

> Ich habe so auf die schnelle nur Tutorials gefunden, die eine externe, auf einem Datenbankserver liegende DB nutzen, nichts jedoch wie ich intern in meinem Projekt eine anlege.


Der Unterschied zu ner in-memory db ist marginal, du musst lediglich den Pfad zur DB anpassen. Alles weitere ist normaler jdbc/sql kram.

Link:
Features


----------



## MartinDD (6. Dez 2010)

Danke erstmal euch beiden,

prinzipiell habe ich ein Excel-File mit einer festen Struktur. Darin sind verschiedene Modelle mit ihren unterschiedlichen Eigenschaften und Möglichkeiten festgehalten. Was ich jetzt in Java machen möchte ist, effektiv in dem excel file zu suchen. Das heißt ich habe eine Eingabemaske in denen ich meine gewünschten Eigenschaften und Features der Modelle eingebe und will jetzt in der Exceldatei suchen, welche Modelle alle meine Anforderungen erfüllen.

Leider habe ich mit Datenbanken bis jetzt noch garnichts zu tun gehabt, sodass auch jdbc und sql zur Zeit noch böhmische Dörfer für mich sind.


----------



## Gast2 (6. Dez 2010)

Einfach mal bei google nach jdbc tutorials suchen, die gibts wie sand am meer


----------



## MartinDD (6. Dez 2010)

Hallo,

also das Grundgerüst habe ich jetzt glaube ich. Mein Problem ist jetzt noch, wie ich die Daten aus meinem Excel-File in die Datenbank reinbekomme. Ich habe zwar Lösungen gefunden (Read data from Excel worksheet - Real's Java How-to oder jGuru: How can I connect to an Excel spreadsheet file using jdbc?) jedoch kann man doch den Umweg über ODBC auch umgehen oder ? 

Die Exceldatei hole ich mir in meiner read-Methode direkt aus einem FileDialog. Was muss ich denn jetzt noch tun um die Daten in die Datenbank zu bekommen ? Das Tabellenblatt auf das ich zugreifen moechte heißt uebrigens "Uebersicht_Java".


```
public void read(){
        FileFilter[] filter =  {new ExcelFileFilter()};
        LFTFileDialog openDialog = new LFTFileDialog("OpenExcelFileDialog",LFTFileDialog.OPEN_DIALOG,filter);

        if (openDialog.getFile() != null){
            try {
                Workbook wb = Workbook.getWorkbook(openDialog.getFile());
                if (wb != null){
                    Sheet sheet = wb.getSheet("Uebersicht_Java");

                    try {
                        // Treiber laden
                        // Class c = Class.forName("org.h2.Driver");
                        Class.forName("org.h2.Driver");
                        // Verbindung erstellen
                        conn_ = DriverManager.getConnection("jdbc:h2:mem", "sa", "");
                        System.out.println("Get connection");
                        // Statement-Objekt definieren
                        state_ = conn_.createStatement();
                        // Datenbank einfügen

                        //String sql = "select * from [" + "Uebersicht_Java" + "$]";

                        //ResultSet rs = state_.executeQuery(sql);
                        
                        state_.close();
                        conn_.close();
                    } catch (SQLException ex) {
                        JOptionPane.showMessageDialog(this, "Fehler beim Öffnen der Datenbank!\n" + ex.getMessage(), "Fehler", JOptionPane.ERROR_MESSAGE);
                    } catch (ClassNotFoundException ex) {
                        JOptionPane.showMessageDialog(this, "Fehler beim Öffnen der Datenbank!\n" + ex.getMessage(), "Fehler", JOptionPane.ERROR_MESSAGE);
                    }
                }
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(this, "Fehler beim Öffnen!\n" + ex.getMessage(), "Fehler", JOptionPane.ERROR_MESSAGE);
            } catch (BiffException ex) {
                JOptionPane.showMessageDialog(this, "Fehler beim Öffnen!\n" + ex.getMessage(), "Fehler", JOptionPane.ERROR_MESSAGE);
            }

        }
    }
```


----------



## AlexSpritze (6. Dez 2010)

Wäre interessant zu wissen wie die Daten in deinem xls aussehen. Wenn es sowas wäre:


```
Name1 Zahl1 Ort1
Name2 Zahl2 Ort2
usw.
```

müsstest du vor dem ersten Gebrauch der Tabelle deren Struktur anlegen, das heißt sowas wie (in Pseudocode ):


```
CREATE TABLE Uebersicht(
id INTEGER PRIMARY_KEY,
name VARCHAR(255),
zahl NUMBER,
ort VARCHAR(255)
);
```

Und dann hättest du eine Struktur und könntest da die Zeilen aus deiner Exceltabelle einfügen:


```
INSERT INTO Uebersicht (name, zahl, ort) VALUES ('Name1', Zahl1, 'Ort1');
```

... um dir zumindest mal grob die Richtung zu zeigen ...  Ich hoffe ich habe nichts übersehen.

PS: Also vor dem Gebrauch der Datenbank musst du die Struktur definieren, das ist anders als bei Excel, wo in jeder Zeile irgendwas stehen kann.


----------



## z-mon (6. Dez 2010)

MartinDD hat gesagt.:


> Hallo,
> 
> reingeguckt habe ich, allerdings habe ich den Wald vor lauter Bäumen nicht gesehen und für meinen einfachen Fall kein passendes Beispiel gefunden.
> Ich habe so auf die schnelle nur Tutorials gefunden, die eine externe, auf einem Datenbankserver liegende DB nutzen, nichts jedoch wie ich intern in meinem Projekt eine anlege.
> ...



Hallo Martin,

auf meinem Blog findest du hilfreiche Tutorials die du ohne weiteres nachvollziehen solltest:
- Java HSQLDB (HyperSQL) Tutorial
- Java MySQL (JDBC) Tutorial

Viel Spaß


----------



## MartinDD (7. Dez 2010)

Vielen dank euch beiden,

meine Tabelle sieht in etwa folgendermaßen aus:



[head]Version|Name|Eigenschaft_1|Eigenschaft_2|Eigenschaft_3|Eigenschaft_4|...
V1|Modell1|Y|Y||Y             
V1|Modell2||Y||Y
V1|Modell3|Y|Y|Y
V2|Modell1|Y||Y|
V2|Modell2|Y||
V2|Modell3|Y|Y|Y

In den ersten Spalten stehen Strings und in den folgenden quasi boolsche Werte. Hat ein Modell die Eigenschaft steht in der Tabelle ein "Y", hat es diese nicht ist die Spalte leer.
Erkennt H2 bzw SQL die leeren Spalten? Ist es sinnvoll die "boolschen" Werte als CHAR in die SQL-Table zu schreiben oder gibt es da eine alternative richtung boolscher Operator (hier Datentypen in SQL steht etwas von einem bit-Datentyp, der würde mir ja hier reichen)?


----------



## AlexSpritze (7. Dez 2010)

Ein richtiger Boolean wie du ihn aus Java kennst, ist mir bisher noch nicht bei SQL über den Weg gelaufen, zumindest im Standard gibt es den nicht, denke ich. Darum einfach über char oder bit abbilden.

Leere Spalten, bzw. leere Zellen darin, wären einfach NULL, das unterstützt SQL auch, wie in Java, du kannst bei der Definition der Tabellenstrutkur aber konkret sagen, ob die Spalte NULL enthalten darf oder nicht.

Entweder du bildest deine obige Tabelle einfach 1:1 in SQL ab (was vielleicht nicht so geschickt ist) oder du erstellst eine Tabelle für deine Modelle und pro Eigenschaft eine weitere Tabelle, in der entweder der Name und die Version des Modells vermerkt ist, die diese Eigenschaft haben, oder besser, in der die IDs der Modelle stehen, die diese Eigenschaft haben.

Irgendwie so in Pseudo-SQL

```
CREATE TABLE MODELL(
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL,
version INTEGER NOT NULL
);

CREATE TABLE EIGENSCHAFT1(
modell_id INTEGER FOREIGN KEY [hier dann irgendwas mit references modell.id damit hier nur ids stehen können, die auch in der Tabelle MODELL sind]
);
```

Das erstmal mein bescheidener Beitrag zu deinen Fragen


----------



## MartinDD (9. Dez 2010)

Hallo Alex,

danke für die Hilfe. Außer der Übersichtlichkeit, welchen Vorteil hat denn die Unterteilung in Tabellen pro Eigenschaft? Kann ich trotz dieser Einteilung dann weiterhin über alle Eigenschaften suchen wenn ich ein passendes Modell finden will ?


----------



## AlexSpritze (9. Dez 2010)

Wenn ich mich recht erinnere hat diese Aufteilung mit der Normalisierung einer Datenbank zu tun. Wenn du besonders viele Modelle und/oder Versionen hast, macht es vielleicht Sinn, das Vorhandensein einer Eigenschaft nur für die Objekte abzuspeichern, die es haben. Implizit, wo es fehlt, ist es nicht gespeichert.

Du kannst auch weiterhin über alle Eigenschaften suchen: (ungetestet)


```
SELECT m.id, m.version, m.name
FROM modell m
WHERE m.id IN (SELECT modell_id FROM eigenschaft1) AND
       m.id NOT IN (SELECT modell_id FROM eigenschaft2);
```

Gibt dir alle Modell, die Eigenschaft1 haben und nicht Eigenschaft2 (nach dem Datenschema aus meinem vorherigen Post). Alle Daten sind weiterhin da, und können bei Bedarf wieder zur miteinander verschraubt werden.


----------

