# Vokabelprogramm mit DB



## qerzo (7. Apr 2011)

Hi erstmal,
Es handelt sich nicht sdirekt um eine Hausaufgabe sondern vielmehr um meine Abipräsentationsprüfung.
Und zwar soll ich einen Vokabeltest programmieren der die Vokabeln bezüglich ihrer Schreibweise analysiert, bei dem die Testvokabeln komfortabel verwaltet werden können, der den Test automatisch bewertet (Wie soll das denn anders gehn?) und bei dem eine schriftliche Darstellung des bewerteten Test ausgedruckt werden kann. Mein Problem ist nun (da ich auch nicht unbedingt der fitteste in Java bin) das komfortable Verwalten der Vokabeln???:L
Das spricht an sich für ne Datenbank, allerdings haben wir damals lediglich MySQL Datenbanken mit PHP angesteuert -.-
Also hier meine Frage: Welche Datenbank eignet sich (am Besten) für Java? 
Und ein Link mit Tutorial wär auch noch nett... Will aber nicht zu viel erwarten
Grüße und vielen Dank
qerzo


----------



## Ironzwerg (8. Apr 2011)

MySQL kannst du ruhig verwenden.
MySQL :: Using MySQL With Java
Java und MySQL
MySQL and Java JDBC - Tutorial

Ich könnte ewig so weitermachen.
Es gibt also ne Menge Tuts und Infomaterial.


----------



## Tomate_Salat (8. Apr 2011)

Ich würde hier eher zu H2 raten. Die kann man embedded verwenden und du musst keinen MySQL-Server bereitstellen/mitliefern.


----------



## Ironzwerg (8. Apr 2011)

Die DB klingt gar nicht mal schlecht.
Habe ich noch nie was von gehört.
Nimm lieber H2


----------



## qerzo (8. Apr 2011)

Danke für die Antworten werde mich einfach mal schlau machen und gucken womit ich leichter zurecht komme
qerzo

EDIT: So hab jetzt maln bisschen gelesen. Wenn ich H2 embedded verwende ist das dann quasi so, dass ich meine Datenbank in das Programm eingebettet hab oder wie muss ich das verstehn?


----------



## Ironzwerg (8. Apr 2011)

Genau so ist das.
Du musst also nicht darauf achten, ob du irgendwo nen Db-Server am Laufen hast.
Wenn du das Programm auslieferst, ist die DB mit dabei.


----------



## fastjack (8. Apr 2011)

Zur Übung kannst Du Dir auch eine Schnittstelle zum Datenzugriff schreiben, dann kannst Du verschiedene Möglichkeiten zur Datenhaltung entwickeln, z.B. Serialisieren, XML, oder auch in die Datenbank.


----------



## qerzo (26. Apr 2011)

So ich hab jetzt das Grundgerüst meines Programms fertig....
Nur stellt sich mir jetzt eine Frage: wie bettet man H2 überhaupt ein. Ich bin echt verzweifelt;(
Bitte, bitte kann mir das jemand erklären oder mirn Link schicken???? Das muss doch irgendwo im H2 Tutorial stehen! Ich hab das bestimmt schon 10 mal überlesen - wäre nett wenn jemand mit seinem Finger drauf zeigt^^
Grüße qerzo


----------



## qerzo (27. Apr 2011)

find den Edit Button nich aber egal 
Also ich hab jetzt was gefunden:

Add the h2*.jar to the classpath (H2 does not have any dependencies)
Use the JDBC driver class: org.h2.Driver
The database URL jdbc:h2:~/test opens the database test in your user home directory
A new database is automatically created

Mh Irgendwie versteh ich das nicht ???:L
Also ich hab mir jetzt die h2.jar runtergeladen - wie add ich die zum classpath, und wie benutze ich die JDBC driver class? Ich bin echt ratlos.


----------



## Tomate_Salat (27. Apr 2011)

Nutzt du eine IDE (z.B.: Eclipse oder Netbeans)?


----------



## qerzo (28. Apr 2011)

ich benutze eclipse


----------



## Tomate_Salat (28. Apr 2011)

erstelle in deinem Projektordner ein Verzeichnis und nenn es (standardmäßig) lib.
Dort legst du die h2*.jar ab. Also hast du etwa folgende Struktur:

```
PROJEKT
   |-- lib
   |     |- H2.jar
   |-- src
...
```

Wenn du eclipse offen hast, wählst du dein Projektbaum aus und drückst erstmal F5 (dann solltest du auch den Ordner [c]lib[/c] sehen). Danach machst du einen rechtsklick auf dein Projekt dort auf Properties. Dann öffnen sich die Eigenschaften. Links im Baum klickst du auf [c]Java Build Path[/c] wählst rechts den Reiter [c]Libraries[/c] aus und klickst auf [Add JARs...]. Dann öffnet sich ein Baum und von dort navigierst zu deinem ordner lib und makierst die H2-DB...fertig.


----------



## qerzo (28. Apr 2011)

Das funktioniert jetzt
Nur wirft das jetzt alles noch mehr weiterführende Fragen auf :autsch:

EDIT: zB Kann ich die Datensätze direkt mit JAVA-Befehlen auslesen?


----------



## timbeau (2. Mai 2011)

Wie wärs mal mit Lesen des Tutorials? Oder ein Buch in der örtlichen Bibliothek? 

Stichworte: sessionFactory, session, Query, HQL vs SQL Query


----------



## qerzo (3. Mai 2011)

Ja hatte nich so viel zeit zum lesen - musste für gestern auch nochn roboter programmiern-.-
aber du hast natürlich recht
danke für die stichworte


----------



## qerzo (4. Mai 2011)

poah das h2 tutorial verwirrt mich nur noch mehr...
versteh kein wort???:L
an welcher stelle steht denn bitte wie man die datensätze ausliest. da bekomm ich eiskalt en brechreiz

EDIT: Ich suche jetzt explizit ein Tutorial in dem steht wie ich die H2 DB mit java auslesen kann. Und zwar so das ich das verstehe. Ich hab echt keine Ahnung von der materie -.-
Das h2 tut hilft mir echt nich weiter... da steht drin wie ich die db mit java über jdbc verbinde - aber das reicht mir ja nich. zudem noch ne menge sql befehle für die db aba wie, WIE lese ich datensätze aus???


----------



## Tomate_Salat (4. Mai 2011)

Galileo Computing :: Java ist auch eine Insel – 24.6 Datenbankabfragen lies dir mal das Thema in der Insel durch und schau dir vllt mal allgemein SQL an.


----------



## qerzo (5. Mai 2011)

ach thx
Ich glaub ich habs.
über jdbc wird ne verbindung mit der db aufgebaut mit der ich dann indirekt über sql befehle spreche.
so grob :bae:


----------



## qerzo (6. Mai 2011)

Mir ist was saublödes passiert....
Auf der Login-Seite habbich bei Setting Name zufällig auf Remove geklickt. Jetzt kann ich nicht mehr Generic H2 embedded angeben. Was mache ich jetzt um das wieder hinzubekommen??
ne Neuinstallation hat nichts gebracht. Und da ich jetzt verzweifelt und mit meinem Latein am Ende bin...
Ich kann ja jetzt nich mal mehr auf meine DB zugreifen
Das schlaucht echt ziemlich-.-


----------



## Tomate_Salat (6. Mai 2011)

sind ja nur "templates", kannst du dir ganz einfach wieder einstellen:
Gibst bei Einstellungs-name: Generic H2(Embedded) ein
bei Driver Class: org.h2.Driver
JDBC URL: odbc:h2:~test
Benutzername: sa

und danach speichern drücken. Dann hast du das wieder.


----------



## fastjack (6. Mai 2011)

Also ich würde Dir immer noch empfehlen ein Interface zu Ansteuerung an die Daten zu machen. In der Software benutzt Du dann nur noch das Interface, um Daten zu lesen oder schreiben etc. Schreib Dir anfangs eine einfache Implementierung, die z.B. die Serialisierung/XML oder so benutzt. Das hat den Vorteil, dass Du mit Deiner Software vorankommst, schon mal erste Ergebnisse siehst. 
Dann kannst Du später immer eine Implementierung mit Hilfe einer Datenbankschicht machen.


----------



## qerzo (6. Mai 2011)

oh man wie leicht 
danke


----------



## qerzo (7. Mai 2011)

fastjack hat gesagt.:


> Also ich würde Dir immer noch empfehlen ein Interface zu Ansteuerung an die Daten zu machen. In der Software benutzt Du dann nur noch das Interface, um Daten zu lesen oder schreiben etc. Schreib Dir anfangs eine einfache Implementierung, die z.B. die Serialisierung/XML oder so benutzt. Das hat den Vorteil, dass Du mit Deiner Software vorankommst, schon mal erste Ergebnisse siehst.
> Dann kannst Du später immer eine Implementierung mit Hilfe einer Datenbankschicht machen.



Ja, das Problem ist einfach das Ich von der Materie keine Ahnung habe....
Und auch nicht mehr viel Zeit - musste die Woche 3 referate halten und noch 2 arbeiten schreiben, da kam die programmierung leider zu kurz
ich werd jetzt einfach versuchen das ganze so gut es geht hinter mich zu bekommen...

Ich habe mich jetzt mal daran versucht 2 werte der datenbank als label auszugeben...
Aber irgendwie bekomm ich das nicht auf die reihe
Naja ich poste mal mein java quellcode

```
import java.awt.*;
import java.sql.*;
import java.applet.*;
public class trainer extends Applet{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	 public static void main(String[] a)//verbindung zur DB laut h2 turorial
     throws Exception {
 Class.forName("org.h2.Driver");//lädt den Treiber
 Connection conn = DriverManager.//Öffnet eine Verbindung
     getConnection("jdbc:h2:~/test", "sa", "");//Datenbank URL, Benutzername und Passwort

 //versuch einer datenbankabfrage
 Statement stmt = conn.createStatement();//anweisungobjekt um sql kommandos abzusetzen
 String query = "SELECT DEUTSCH FROM VOKABEL";
 ResultSet rs = stmt.executeQuery( query );
 while ( rs.next() )//geht mit einer while Schleife durch die gesamte Ergebnismenge und gibt di ersten 3 Ergebniss auf dem Bildschirm aus
	 LV1.setText(rs.getString(1));
 LV2.setText(rs.getString(2));
 System.out.println(rs.getString(1));
 rs.close();
 stmt.close();
 conn.close();
	 }
	
(...)
		
		Label LUeb=new Label("Vokabeltrainer");
		Label LV1=new Label();
		Label LV2=new Label();
		
	public void init(){	
	
		LUeb.setFont(new Font("Arial", Font.BOLD, 25));
	add(LUeb);
	
	add(LV1);
	add(LV2);
	
	}
	}
```
Das Problem ist das es nicht funktioniert:autsch:
Sieht jemand den Fehler???:L
Durch stupides ausprobieren habe ich ihn nicht gefunden...
Eclipse sagt: connat make a static reference to a non-static field (ZEILE 21/22)
Wie kann ich das lösen?


----------



## fastjack (8. Mai 2011)

Die Textfields sind whl. nicht static, die main Methode aber. Applet mit main ist auch nicht richtig. Mach für die DB-Verbindung eine Klasse, mit der Du verbinden kannst usw. Schreib dir eine Klasse in der die Businesslogik enthalten ist, also Labels aus DB holen usw. Aus den Methoden kommen dann Datenobjekte zurück, mit denen Du dann die GUI füllen kannst.


----------



## qerzo (8. Mai 2011)

wtf:autsch:
hat mich nur verwirrt


----------



## Gast2 (8. Mai 2011)

nochmal zum mitschreiben:
du hast nen applet => da gibts keine main-Methode
du versuchst aus nem staischen kontext (deiner main-Methode) auf nicht-statische Variablen zuzugreifen => das geht nicht

wie du das ganze besser machen kannst steht oben


----------



## qerzo (8. Mai 2011)

ich bin verloren.
das kann ich nie in einer woche lernen + schreiben.
die fehler leuchten mir ein - aber ich hatte nie die notwendigkeit ne eigene klasse zu schreiben...
die lösungansätze hören sich gut an - aber da muss ich schon tief im thema drin sein mh?
is wenigstens die art der connection richtig? also klappt das wennich das dann in ne eigene klasse pack?
oder gibts da noch ne andre möglichkeit für applets? mein im tutorial "java ist auch eine insel" wurde die conn anders aufgebaut? und wenn ich das alles als bildschirmausgabe geschafft hab mussich ja noch logische vergleiche ziehn um die richtigkeit der antworten zu prüfen.....


----------



## qerzo (10. Mai 2011)

wäre es vll leichter ne *.txt datei auszulesen?


----------



## fastjack (11. Mai 2011)

Deswegen meinte ich ja, programmiere alles gegen ein BusinessInterface, z.b:


```
List<Vokabel> getVokabeln(Sprache sprache);
List<Sprache> getSprachen();
```

oder in deinem Beispiel:


```
public static void main(String[] a)//verbindung zur DB laut h2 turorial
        throws Exception {
    BusinessInterface intf = new DatabaseBusinessInterface();
//    BusinessInterface intf = new SerializeBusinessInterface();
//    BusinessInterface intf = new TextBusinessInterface();
//    BusinessInterface intf = new XMLBusinessInterface();
    List<Vokabel> list = intf.getDeutscheVokabeln();      
    for(int i = 0, i < list.size(); i ++) {
        Vokabel vokabel = list.get(i);
        labels[i].setText(vokabel.gettext()); // labels in Array oder List oder so
    }
}
```

Aber wie oben gesagt, keine main() method machen.

usw. Dieses Interface benutzt Du dann, um auf die Daten zuzugreifen. Du hast dann die Auswahl, wie Du das Interface implementierst, also für datenbanken, eine entsprechende DB-Implementierung. Textdateien würde ich nicht empfehlen, wenns nicht anders geht, dann irgendwie Property-Format, XML geht auch, ist aber dann wieder etwas komplexer. Du kannst auch Serialisierung verwenden, ist nicht kompliziert.


----------



## qerzo (11. Mai 2011)

so ich bin fast fertig...
hab mich da mal durchgewühlt (was ne arbeit)
allerdings tritt jetzt doch noch ein (kleines?) problem auf
der test soll ja automatisch bewerten. Ich hab mir das so vorgestellt, dass bei jedem durchlauf geprüft wird ob die antwort richtig ist oder nicht. hab dafür schon ne if/else anweisung geschrieben die jeweils nette texte bzw. die richtige lösung ausgibt.
allerding sollte ganz am ende nochmal ne info erscheinen a la: sie haben 4 von 10 vokabeln richtig beantwortet...
da würde ja eigentlich ne integer in der if anweisung reichen die bei jeder richtigen antwort um 1 erhöht wird.
jetzt meine frage: wie erhöht man die variable um eins. is wohl mehr ne anfänger frage aber ich kann mich beim besten willen nicht erinnern
google ist auch nicht mein freund aber vll such ich ja auch nur nach den falschen begriffen
selbst mein treues java büchlein lässt mich im stich 
aber vll kann mir ja hier jemand sagen wie ich das mach


----------



## frapo (11. Mai 2011)

qerzo hat gesagt.:


> jetzt meine frage: wie erhöht man die variable um eins. is wohl mehr ne anfänger frage aber ich kann mich beim besten willen nicht erinnern




```
// irgendwo am Anfang Deiner Methode Deine variable deklarieren:
int variable = 0;

// an gegebender Stelle dann um 1 erhöhen
variable += 1;
	
// oder 
variable = variable + 1;
```

Grüße
frapo


----------



## bone2 (11. Mai 2011)

noch einfacher:

```
variable++;
```


----------



## qerzo (12. Mai 2011)

danke. ich erinner mich auch wieder


----------

