"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Java: Query aus Java DB in Tabelle ausgeben

Bunny 20.02.2012 - 14:01 2877 6
Posts

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
Hallo,

also nach stundenlanger Suche im Internet frag ich jetzt euch....
Ich bastel grad an einer GUI mit Netbeans/Swing ...

Weiters verwende ich die Java DB (Derby) ... soweit so gut, Datensatz kann ich eintragen, nur über die Hürde mir die Daten ausgeben zu lassen komm ich nicht.

hier mal der Java Code den ich geschrieben habe.

Code: JAVA
         EntityManagerFactory emf = Persistence.createEntityManagerFactory("schulePU");
         EntityManager em = emf.createEntityManager(); 
         Person p = new Person();
         p.setName(zuname);   
         p.setVorname(vorname);    
         p.setAdresse(adresse);     
         p.setTelefon(telefon); 
    
        em.getTransaction().begin(); 
        em.persist(p);    
        em.getTransaction().commit(); 
  
       em.close();    
       emf.close();

Also wie man sehn kann ist das nichts aufregendes. Nur beim erstellen von Query kenn ich mich leider nicht aus...

ich denk mal das der Query vlt so ähnlich aussehn sollte, oda ?

Code: JAVA
Query query = em.createQuery("select * from TEST.PERSON");

ALso ich möchte alles ausgeben von der Tabelle, deshalb SELECT * ....
Wenn ich falsch liege bitte mich korrigieren.

Muss ich dann den Query in einen String casten bzw. in ein Array damit ich dann die einzelnen Spalten damit belege ? Da steckt leider meine unwissenheit drin :D

Achja, ich möchte diese jTable verwenden die bei Swing dabei ist.



Dieser Code steht bei der jTable jetzt drin:

Code: JAVA
  jTable2 = new javax.swing.JTable();

  jTable2.setModel(new javax.swing.table.DefaultTableModel(  
   new Object [][] {         {null, null, null, null}, 
        {null, null, null, null}, 
        {null, null, null, null}, 
        {null, null, null, null}, 
    },    
 new String [] {         "Vorname", "Zuname", "Telefon", "Adresse"     } )); 
 jScrollPane4.setViewportView(jTable2);


wäre nett wenn hier ein netbeans spezialist wäre :D

LG !

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3278
also mit netbeans hat das mal eher am rande zu tun, die frage nach einem netbeans-spezialisten lässt also völlige planlosigkeit erahnen ;)
was du verwendest nennt sich JPA (java persistence api), ich würd also mal nach tutorials zu dem thema googlen...

jedenfalls musst du den query, den du vom entitymanager kriegst, ausführen und dann die ergebnisse in deine tabelle kriegen. im einfachsten mal mit query.getResultList ausführen und dann über die liste, die du zurückkriegst, iterieren und dein tablemodel entsprechend befüllen. scheint bei netbeans sogar über die gui zu gehen (http://rubenlaguna.com/wp/2009/08/1...jpa-pagination/ - halt von 2009, ymmv)

Smoldi

rape diem
Avatar
Registered: Oct 2000
Location: Wien
Posts: 1371
Eine JTable braucht ein TableModel.
Könnte für deinen Fall ca. so aussehen:

Code: JAVA
public MyTableModel extends AbstractTableModel {
  private List<Person> persons;
  
  public MyTableModel(List<Person> persons) {
     this.persons = persons;
  }
  public int getRowCount() {
        return persons.size();
  }
  public int getColumnCount() {
     return 4;
  }
  public Object getValueAt(int row, int column) {
     Person person = persons.get(row);
     switch(column) {
        case 0:
           return person.getName();
        [etc.]
      }
  }
}

Ich würde dir allerdings empfehlen es so zu machen, wies DKCH beschrieben hat. ;)

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
okay danke mal, ich spiel mich grad damit...

Denne

Here to stay
Avatar
Registered: Jan 2005
Location: Germany
Posts: 2801
Als ich mal sowas programmiert habe, hatte ich es so gelöst (ist nur copy paste aus dem programm, damit du eine idee bekommst:
Code: JAVA
int tablecounter = 0, columncounter = 0, primarykeycounter = 0, foreignkeycounter = 0;
		System.out.println("Tabellen werden überprüft...");
		connect();
		Connection con = getConnection();

		try {
			Statement stmt = con.createStatement();
			ResultSet rstables = stmt.executeQuery("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'PUBLIC'");
			ResultSetMetaData metatables = rstables.getMetaData();
			int tableCount = metatables.getColumnCount();

			// Checkt Tabellennamen
			while (rstables.next()) {
				columncounter = 0; primarykeycounter = 0; foreignkeycounter = 0;
				tablecounter++;

				String[] tables = new String[tableCount];
				for (int i = 0; i < tableCount; i++) {
					tables[i] = rstables.getString(i + 1);

					if (tablenames.contains(tables[i])) {
						System.out.println("\r\n" + "Tabelle '" + tables[i] + "' gefunden.");

						ResultSet rscolumns = stmt.executeQuery("select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" +  tables[i] + "'");
						ResultSetMetaData metacolumns = rscolumns.getMetaData();
						int colCount = metacolumns.getColumnCount();

						// Checkt die Spalten der einzelnen Tabellen
						while (rscolumns.next()) {
							columncounter++;
							String[] columns = new String[colCount];

							for (int j = 0; j < colCount; j++) {
								columns[j] = rscolumns.getString(j + 1);
							}

							switch (tables[i]) {

							case "MOVIES":
								for (int k = 0; k < colCount; k++) {
									if(moviesstructure.contains(columns[k])) {
										System.out.println("Spalte '" + columns[k] + "' in Tabelle '" + tables[i] + "' gefunden.");
									} else {
										System.out.println("Spalte '" + columns[k] + "' in Tabelle '" + tables[i] + "' nicht gefunden. Tabelle beschädigt.");
										return false;
									}
								}
								break;

connect und getConnection sind dabei zwei Methoden von mir, sehen ca so aus:

Code: JAVA
/**
	 * Gibt die Verbindung mit der Datenbank zurück.
	 * @return Connection zur Datenbank.
	 */
	public Connection getConnection() {	
		if (this.con != null) {
			return this.con;
		} else {
			connect();
			return this.con;
		}
	}

	/**
	 * Erstellt eine Verbindung mit der Datenbank.
	 */
	public void connect() {

		// Treiberklasse laden
		try {
			Class.forName("org.hsqldb.jdbcDriver");
		}
		catch ( ClassNotFoundException e ) {
			System.err.println( "Treiberklasse nicht gefunden!" );
			return;
		}

		// Connection aufbauen
		try {
			this.con = DriverManager.getConnection(db, username, password);
		}
		catch ( SQLException e ) {
			e.printStackTrace();
		}
	}

Daten landen bei mir ein einem abstractTableModel und afaik über einen Vektor, dh DB -> Vektor -> Table.
Hat den Sinn, dass wenn ich etwas sortiere, suche etc (Ist eine Datenbank für Filme und Serien gewesen) ich immer nur den Vektor manipuliere (gibt für Sortieren und Suchen vordefinierte Methoden in Java, deshalb die Entscheidung damals).
Das mit dem Vektor kann man sicher auch auslassen.

Sorry für das fixe Copy und Paste, hab aber atm leider nicht so viel Zeit und wollte dir nur schnell antworten ;)

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3278
also, ganz ehrlich, ich zieh meinen studenten gerne etwas ab, wenn sie zuerst die ganze datenbank laden und dann die liste sortieren ;)
und entweder fehlt da ein signifikanter teil, aber was vom ursprungsproblem (jtable mit daten aus datenbank füllen) du in deinen snippets löst, erschließt sich mir leider nicht...

Denne

Here to stay
Avatar
Registered: Jan 2005
Location: Germany
Posts: 2801
ja, da fehlt einiges, wäre einfach viel zu viel gewesen (und es hätte kein mehrwert gehabt,da sich alles wiederholt).

wenn die datenbank geladen wird, sollte es stets nach der id sortiert im table erscheinen (wollte ich so). nur während der programmausführung möchte man (in meinem fall) zb die filme oft nach erscheinungsfahr, titel, ratings etc sortieren, was nur im vektor passiert.
was besser ist, kann ich nicht sagen, da mir einfach die erfahrung fehlt. war mein erstes projekt mit datenbanken, um es einfach mal zu lernen (bin selbst noch student).

Ich hatte die Frage so verstanden, dass er zusätzlich nicht wirklich weiß, was er mit dem query anstellen soll.
ich habe mir an dieser stelle das query ganz anders ausgeben lassen, was die weiterverarbeitung vllt einfacher macht (noch nie mit dem entitymanager) gearbeitet, deswegen kann ich es nicht beurteilen.
Wie man es dann in ein Tablemodel bekommt, habe ich ja danach kurz geschrieben, weil ich den code leider nicht parat habe.
Falls er dort Probleme haben sollte, kann er sich ja gerne noch einmal melden :)

sorry fürs ot

edit: ich habe das beispiel gefunden, nach welchem ich mich damals orientiert hatte, hth

http://www.java2s.com/Code/JavaAPI/...letoaJTable.htm
Bearbeitet von Denne am 20.02.2012, 17:48
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz