Datenbank auslesen und Werte in JTable überführen!

Lautsprecher

Erfahrenes Mitglied
Hallo,
kann mir jemand vielleicht bei folgendem Problem mit Logik und evtl. Codebeispielen weiter helfen?
Ich möchte eine Tabelle vom MS SQL Server auslesen und diese Daten, dann einer JTable anzeigen. Meine JTable hat immer 7 Spalten (Bsp. Nachname, Vorname, Anschrift,etc.)
Das Auslesen und die Anzeige der Daten in der Console klappt soweit: (Code-Auszug)

Code:
while( rs.next() ) 
{
     for( i=1; i<=n; i++ ) 
    System.out.print( extendStringTo14( rs.getString( i ) ) );
    System.out.println("");
}

Da die Datensätze in der Datenbank varrieren habe ich mir gedacht irgendwie den
rs.getString(i) in eine Hashmap einzulesen. Jedoch weiß ich nicht ob das überhaupt funkioniert bzw. ob und wie das rs.getString(i) in "Scheiben" geschnitten wird.

Da meine Spaltenzahl immer fix ist sieht mein TableModel dafür momentan so aus:

Code:
class Datenmodel extends AbstractTableModel 
{
	private int size = 7;
	private Hashtable data;	
	public void Datenmodel()
	{
	this.data = new Hashtable();
                }	
		
	public int getColumnCount()
	{
		return size;
	}

public Object getValueAt(int rowIndex, int columnIndex) 
    {
    	String key = "[" + rowIndex + "," + columnIndex + "]";
    	String value =(String)data.get(key);
    	return value == null ? "-" : value;
                  }
}


Wie bekomme ich aber die Anzahl der Zeilen hin, wenn die Datensätzlänge immer variiert.
Kann man das irgendwie über die Hashmap machen oder gibt es beim auslesen irgendeinen Befehl wie in Visual Basic der zunächst mal die RecordLänge ermittelt?

Danke
 
Hallo!

Schau mal hier:
Code:
 /**
  * 
  */
 package de.tutorials;
 
 import java.awt.BorderLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Vector;
 
 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JScrollPane;
 import javax.swing.JTable;
 import javax.swing.table.DefaultTableModel;
 
 import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
 
 /**
  * @author Tom
  * 
  */
 public class JTableJDBCExample extends JFrame {
 
 	static {
 		try {
 			Class.forName("com.mysql.jdbc.Driver");
 		} catch (ClassNotFoundException e) {
 			e.printStackTrace();
 		}
 	}
 
 	public final static Vector COLUMN_IDENTIFIERS = new Vector() {
 		{
 			add("id");
 			add("name");
 			add("dateOfBirth");
 			add("balance");
 		}
 	};
 
 	JTable table;
 
 	JButton btnRefresh;
 
 	DefaultTableModel defaultTableModel;
 
 	Connection con;
 
 	public JTableJDBCExample() {
 		super("JTableJDBCExample");
 		setDefaultCloseOperation(EXIT_ON_CLOSE);
 
 		defaultTableModel = new DefaultTableModel(1, 4);
 		defaultTableModel.setColumnIdentifiers(COLUMN_IDENTIFIERS);
 		table = new JTable(defaultTableModel);
 
 		btnRefresh = new JButton("refresh");
 		btnRefresh.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent e) {
 				Vector results = findAllPersons();
 		    	defaultTableModel.setDataVector(results, COLUMN_IDENTIFIERS);
 				defaultTableModel.fireTableDataChanged();
 			}
 		});
 
 		add(new JScrollPane(table), BorderLayout.CENTER);
 		add(btnRefresh, BorderLayout.SOUTH);
 
 		initDatabaseStuff();
 
 		pack();
 		setVisible(true);
 	}
 
 	private void initDatabaseStuff() {
 		MysqlDataSource mds = new MysqlDataSource();
 		mds.setServerName("localhost");
 		mds.setPort(3306);
 		mds.setDatabaseName("test");
 		mds.setUser("root");
 		mds.setPassword("");
 		try {
 			con = mds.getConnection();
 		} catch (SQLException e) {
 			throw new RuntimeException(e);
 		}
 
 		Runtime.getRuntime().addShutdownHook(new Thread() {
 			public void run() {
 				try {
 					if (!con.isClosed()) {
 						con.close();
 					}
 				} catch (SQLException e) {
 					e.printStackTrace();
 				}
 			}
 		});
 	}
 
 	protected Vector findAllPersons() {
 
 		Vector results = new Vector();
 		try {
 			Statement statement = con.createStatement();
 			ResultSet rs = statement
 		    		.executeQuery("SELECT id, name, dateOfBirth, balance FROM person");
 
 			while (rs.next()) {
 				Vector person = new Vector();
 				person.add(rs.getString("id"));
 				person.add(rs.getString("name"));
 				person.add(rs.getString("dateOfBirth"));
 				person.add(rs.getString("balance"));
 				results.add(person);
 			}
 
 		} catch (SQLException e) {
 			e.printStackTrace();
 		}
 
 		return results;
 	}
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {
 		new JTableJDBCExample();
 	}
 }

Gruß Tom
 
Hi Thomas,
super Danke dir! Es funktioniert.
Zwei kleine Fragen habe ich noch: In der JTable dürfen von den Benutzer keine Veränderungen vorgenommen werden.

Code:
JTable table = new JTable(defaultTableModel);

Reicht es einfach wann ich:

Code:
table.enabled(false);
setze oder muss ich da ins defaultTableModel eingreifen?

2. Die Daten des SQL Servers sollen gleich beim Programmstart in der JTable
angezeigt werden.
Drück der Mitarbeiter den Button soll seine "Kommen-Zeit" in der Datenbank hinterlegt
werden und sein Name, Zeit in der JTable hinzugefügt werden.

Muss ich für die Ausgabe dafür erstmal die JTable leeren, bevor ist sie wieder befüllen kann. oder reicht es mit der Methode fireTableDataChanged(); und noch einem addTableModelListener aus?

Gruß
 
Hallo!

Reicht es einfach wann ich:

Code:
table.enabled(false);​

setze oder muss ich da ins defaultTableModel eingreifen?
ich denke das reicht... sollte es Probleme geben kannst du immernoch die isCellEditable.. Methode im TableModel überschreiben und immer false zurück geben.

Muss ich für die Ausgabe dafür erstmal die JTable leeren, bevor ist sie wieder befüllen kann. oder reicht es mit der Methode fireTableDataChanged(); und noch einem addTableModelListener aus?
Nein, siehe unten. (Ein einfaches addRow... am TableModel reicht aus um Daten zur JTable hinzuzufügen.... die Datensätze werden einfach unten angefügt, natürlich solltest du das nur machen, wenn das vorherige Insert Statement erfolgreich war.
Spezialitäten wie das Einfügen an "richtiger" Stelle in einer sortierten Datenbasis sind da schon ein wenig anspruchsvoller...)

Code:
  /**
   * 
   */
  package de.tutorials;
  
  import java.awt.BorderLayout;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.sql.Connection;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  import java.sql.Statement;
  import java.util.Date;
  import java.util.Vector;
  
  import javax.swing.JButton;
  import javax.swing.JFrame;
  import javax.swing.JScrollPane;
  import javax.swing.JTable;
  import javax.swing.table.DefaultTableModel;
  
  import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
  
  /**
   * @author Tom
   * 
   */
  public class JTableJDBCExample extends JFrame {
  
  	static {
  		try {
  			Class.forName("com.mysql.jdbc.Driver");
  		} catch (ClassNotFoundException e) {
  			e.printStackTrace();
  		}
  	}
  
  	public final static Vector COLUMN_IDENTIFIERS = new Vector() {
  		{
  			add("id");
  			add("name");
  			add("dateOfBirth");
  			add("balance");
  		}
  	};
  
  	JTable table;
  
  	JButton btnArrive;
  
  	DefaultTableModel defaultTableModel;
  
  	Connection con;
  
  	public JTableJDBCExample() {
  		super("JTableJDBCExample");
  		setDefaultCloseOperation(EXIT_ON_CLOSE);
  
  		defaultTableModel = new DefaultTableModel(1, 4);
  		defaultTableModel.setColumnIdentifiers(COLUMN_IDENTIFIERS);
  		table = new JTable(defaultTableModel);
  		table.setEnabled(false);
  
  		btnArrive = new JButton("arrive");
  		btnArrive.addActionListener(new ActionListener() {
  			public void actionPerformed(ActionEvent e) {
 				//entspreche inserts in die Datenbank machen...
 		 	defaultTableModel.addRow(new Object[]{""+System.currentTimeMillis(),"Foo",new Date().toString(),"1000"});
  			}
  		});
  		
  		
  
  		add(new JScrollPane(table), BorderLayout.CENTER);
  		add(btnArrive, BorderLayout.SOUTH);
  
  		initDatabaseStuff();
  		refreshTableDate();
  
  		pack();
  		setVisible(true);
  	}
  	
  	void refreshTableDate(){
  		Vector results = findAllPersons();
  		defaultTableModel.setDataVector(results, COLUMN_IDENTIFIERS);
  		defaultTableModel.fireTableDataChanged();
  	}
  
  	void initDatabaseStuff() {
  		MysqlDataSource mds = new MysqlDataSource();
  		mds.setServerName("localhost");
  		mds.setPort(3306);
  		mds.setDatabaseName("test");
  		mds.setUser("root");
  		mds.setPassword("");
  		try {
  			con = mds.getConnection();
  		} catch (SQLException e) {
  			throw new RuntimeException(e);
  		}
  
  		Runtime.getRuntime().addShutdownHook(new Thread() {
  			public void run() {
  				try {
 					if (!con.isClosed()) {
 						con.close();
  					}
  				} catch (SQLException e) {
 					e.printStackTrace();
  				}
  			}
  		});
  	}
  
  	Vector findAllPersons() {
  
  		Vector results = new Vector();
  		try {
  			Statement statement = con.createStatement();
  			ResultSet rs = statement
 		 		.executeQuery("SELECT id, name, dateOfBirth, balance FROM person");
  
  			while (rs.next()) {
  				Vector person = new Vector();
  				person.add(rs.getString("id"));
 				person.add(rs.getString("name"));
 				person.add(rs.getString("dateOfBirth"));
 				person.add(rs.getString("balance"));
  				results.add(person);
  			}
  
  		} catch (SQLException e) {
  			e.printStackTrace();
  		}
  
  		return results;
  	}
  
  	/**
  	 * @param args
  	 */
  	public static void main(String[] args) {
  		new JTableJDBCExample();
  	}
  }

Gruß tom
 
Zurück