Model-View-Controller

Status
Nicht offen für weitere Antworten.
K

Kris

Gast
Hallo

ich wollte fragen ob dieses Prinzip einem Model-View-Controller entspricht.

Model:
Code:
import java.sql.*;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class DBDaten {
	
	Connection con;
	ResultSet rs;
	
	public DBDaten() throws Exception{
		con = verbinden();
	}
	
	public DBDaten(String abfrage) throws Exception{
		con = verbinden();
		abfrage(abfrage);
	}
	
	public Connection verbinden() throws SQLException{
		
		MysqlDataSource dataSource = new MysqlDataSource();        
		dataSource.setServerName("localhost");        
		dataSource.setPort(3306);        
		dataSource.setDatabaseName("java");        
		dataSource.setUser("root");        
		dataSource.setPassword("router");
		return dataSource.getConnection();
		
	}
}

Control:
Code:
import java.util.*;
import javax.swing.table.*;

public class Haupt {

	public static void tabelleFüllen(DefaultTableModel dtm, String sql) throws Exception{
		
		Vector<String> col = new Vector<String>();
		Vector<Vector<Object>> row = new Vector<Vector<Object>>();
		
		DBDaten dat = new DBDaten();
		dat.abfrage(sql);
		
		for(int i=0;i<dat.rs.getMetaData().getColumnCount();i++){
			col.add(dat.rs.getMetaData().getColumnName(i+1));
		}
		
		
		while(dat.rs.next()){
			Vector<Object> zelle = new Vector<Object>();
			for(int i=0;i<dat.rs.getMetaData().getColumnCount();i++){
				zelle.addElement(dat.rs.getString(i+1));
			}
			row.add(zelle);
		}
		
		dtm.setDataVector(row, col);
		dtm.fireTableDataChanged();
	}
	
	public static void main(String[] args) throws Exception{
		
		
		String abfrage ="Select * From tblPerson";
		Grafik fen = new Grafik();
		
		tabelleFüllen(fen.dtm,abfrage);
	}
	
}

View:
Code:
import javax.swing.*;
import javax.swing.table.*;

public class Grafik {

	JFrame jf;
	JTable tab;
	DefaultTableModel dtm = new DefaultTableModel();
	
	public Grafik(){
		
		jf = new JFrame("Test");
		tab = new JTable(dtm);
		JScrollPane jsp = new JScrollPane(tab);
		jf.add(jsp);
		jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		jf.setSize(200,300);
		jf.setVisible(true);
	}
	
}

Falls dies nicht dem Model entspricht, wäre es nett, wenn man erläutern könnte wie es ausehn müßte.
Danke im voraus.
 

tfa

Top Contributor
Prinzipiell geht das in die richtige Richtung. Ein paar Sachen sollte man noch verbessern:

Definiere eine eigene Klasse für die Datensätze, die du aus der Tabelle holst. Also z.B. "User", "Adresse", "Bestellung", je nachdem, was die Daten fachlich bedeuten.
Für die Fachklasse kannst du dann später auch ein eigene TableModel schreiben. Das ist praktischer als mit verschachtelten Vectoren zu arbeiten.

Dann sollte die SQL-Abfrage nicht in der Controller-Klasse (bei dir Haupt) stattfinden (ich meine das Abarbeiten des ResultSets), sondern in einer eigenen (z.B. DBDaten). Man nennt sowas dann ein Data Access Object (DAO). Hier definiert man z.B. Methoden wie selectAllObjects(), selectById(), saveObject(), usw. Das ganze JDBC-Zeug findet hier statt. (Später mal kannst du dir auch ein Persistenz-Framework ansehen, das diese Aufgaben übernimmt).

Noch eins: das TableModel würde ich in der View ("Grafik") aufheben sondern im Controller. So ist es möglich, mehrere verschiedene Views für ein und das selbe Model zu definieren.
 
K

Kris

Gast
Also der Gelesene Datensaatz besteht aus ID, Name, Vorname, Geburtsdatum.
1. Sollte dann eine Fachklasse erstellt werden, in der die Klassen wie User, Adresse, Bestellung erstellt werden oder für jede Art eine eigene Klasse anlegen?
2. Wie sollte man das denn machen, wenn für jeden Datensatz eine Klasse erstellt wird? Ein Object mit den Inhalten in eine Tabelle einfügen?
3. Sollte jetzt die Klasse, die auf die Datenbank zugreift nur für den zugriff erstellt werden und ihre Ergebnisse an die neu erstellte Klasse (z.B. User) weiter geben? (Oder wie ist das mit den Methoden gemeint?) Wird dann im Control eine DBDaten Klasse erstellt die
4. Im Controller ein allgemeines TableModel anlegen, welches später einfach in alle Tabellen des Views angepasst eingefügt werden kann?

Sorry bin jedoch noch mit den Anfangsschwierigkeiten beschäftigt.
 

tfa

Top Contributor
Also der Gelesene Datensaatz besteht aus ID, Name, Vorname, Geburtsdatum.
1. Sollte dann eine Fachklasse erstellt werden, in der die Klassen wie User, Adresse, Bestellung erstellt werden oder für jede Art eine eigene Klasse anlegen?


User, Adresse, Bestellung waren nur Beispiele. Für deinen Fall könnte es so aussehen:
Code:
public class Person {
   private int id;
   private String name;
   private String vorname;
   private Date geburtstag;
  /* Konstruktoren, Getter, Setter.... */
}

2. Wie sollte man das denn machen, wenn für jeden Datensatz eine Klasse erstellt wird? Ein Object mit den Inhalten in eine Tabelle einfügen?
3. Sollte jetzt die Klasse, die auf die Datenbank zugreift nur für den zugriff erstellt werden und ihre Ergebnisse an die neu erstellte Klasse (z.B. User) weiter geben? (Oder wie ist das mit den Methoden gemeint?) Wird dann im Control eine DBDaten Klasse erstellt die


Für jeden Datensatz gibt es ein Objekt. Vorschlag für DAO-Klasse:
Code:
public class PersonDAO  {
    
    public List<Person> selectAll() {
        String query = "select * from tblPerson";
        ResultSet rset = /* Query ausführen... */;
            
        List<Person> result = new ArrayList<Person>();
        while (rset.next()) {
            Person nextPerson = new Person();
            nextPerson.setName(rset.getString("name"));
            /* Attribute aus rset in nextPerson setzen */
            result.add(nextPerson);
        }
        return result;            
    }
    
    public Person selectById(int id) {
        String query = "select * from tblPerson where id="+id;
        ResultSet rset = /* Query ausführen... */;
        ...        
    }
    public void savePerson(Person p) {
        String query="insert into tblPerson....";
        ....
    }
}


4. Im Controller ein allgemeines TableModel anlegen, welches später einfach in alle Tabellen des Views angepasst eingefügt werden kann?

Im Java-FAQ ist beschrieben, wie man das macht (4. Möglichkeit).
 
K

Kris

Gast
Nur zum Verständnis. Wenn PersonDAO sich nur auf die Klasse Person bezieht, könnte man die Methoden von PersonDAO direkt in Person einfügen, oder?
 

tfa

Top Contributor
Könnte man - der Einfachheit halber (man könnte sie als statische Methoden implementieren). Für ein kleines Programm ist das sicherlich OK. Normalerweise würde man das aber trennen, bzw. gleich ein Framework nehmen.
 
K

Kris

Gast
Wie würde denn ein Framework aussehen? Gibt es irgendwo ein kleines Codebeispiel? Hab mir auf Wikipedia durchgelesen was ein Framework sein soll aber verstehe das nicht wirklich auf anhieb.
Wenn ich eine View Komponente aufbaue, die einige JInternalFrames beinhaltet, sollte ich eine Klasse erstellen, die alles beihaltet( sprich DestopPane, Internal Frame, Tbellen, Buttons, etc.) oder für jedes InternalFrame zum Beipsiel eine sperate Klasse?
Wenn ich einem TableModel einen TableModelListener zuweise, sollte dieses immernoch im Control bleiben? Der Listener soll herausfinden welche Zelle zum Beispiel verändert wurde und den veränderten Wert in die Datenbank schreiben .
 

tfa

Top Contributor
Mit Framework meine ich beispielsweise Hibernate oder iBATIS. Infos und Beispiele sollte es auf den Homepages geben.
Kris hat gesagt.:
Wenn ich eine View Komponente aufbaue, die einige JInternalFrames beinhaltet, sollte ich eine Klasse erstellen, die alles beihaltet( sprich DestopPane, Internal Frame, Tbellen, Buttons, etc.) oder für jedes InternalFrame zum Beipsiel eine sperate Klasse?
Wenn du mehrere (verschieden aussehende) Frames hast, wirst du sicherlich auch separate Klassen haben. Kommt wohl ganz auf das konkrete Problem an.
Kris hat gesagt.:
Wenn ich einem TableModel einen TableModelListener zuweise, sollte dieses immernoch im Control bleiben? Der Listener soll herausfinden welche Zelle zum Beispiel verändert wurde und den veränderten Wert in die Datenbank schreiben .
Wenn du jede Änderung in die DB schreiben willst, ist das wohl so. Ansonsten könnte man einen Speichern-Knopf anbieten, dessen Action das Abspeichern veranlasst.
 
K

Kris

Gast
Danke schon mal. Soweit ich das verstehe, ist das ein Modul, dass ins Programm intigiert wird und den Zugriff auf die Datenbank vereinfacht, indem es SQLCodes überflüssig macht. (Wie auch immer)
Gibt es irgendwo eine Anweisung wie man ein Framework integriert? (Deutsch) :oops:
Ich hab jetzt par Stunden lang geübt und meinen Übungscode umgeschrieben. Wie fällt dieser aus?


Code:
import java.sql.Date;

public class Person {

	private int id;
	private String vorname;
	private String nachname;
	private Date geburtsdatum;
	
	public Person(){
		
	}
	
	public Person(int idn, String vorn, String nachn, Date geb){
		id = idn;
		vorname = vorn;
		nachname = nachn;
		geburtsdatum = geb;
	}
	
	public int getID(){
		return id;
	}
	
	public String getVorname(){
		return vorname;
	}
	
	public String getNachname(){
		return nachname;
	}
	
	public Date getGeburtsdatum(){
		return geburtsdatum;
	}
	
	public void setID(int id){
		this.id = id;
	}
	
	public void setVorname(String vorname){
		this.vorname = vorname;
	}
	
	public void setNachname(String nachname){
		this.nachname = nachname;
	}
	
	public void setGeburtsdatum(Date geburtsdatum){
		this.geburtsdatum = geburtsdatum;
	}
	
	public void setGeburtsdatum(String geburtsdatum){
		this.geburtsdatum = Date.valueOf(geburtsdatum);
	}
	
}

Code:
import java.sql.*;
import java.sql.Date;
import java.util.*;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class PersonDAO {

	public PersonDAO(){
		
	}
	
	public Connection getConnection(){
		
		Connection con=null;
		MysqlDataSource mds = new MysqlDataSource();
 		mds.setServerName("localhost");
 		mds.setPort(3306);
 		mds.setDatabaseName("java");
 		mds.setUser("root");
 		mds.setPassword("router");
		try{
			con = mds.getConnection();
		}
		catch(Exception e){
			
		}
		return con;
	}
	
	public List<Person> selectAll(){
		String abfrage = "Select * From tblPerson";
		List<Person> result = new ArrayList<Person>();
		try{
			ResultSet rs = getConnection().createStatement().executeQuery(abfrage);
			while(rs.next()){
				Person nextPer = new Person();
				nextPer.setID(rs.getInt("ID"));
				nextPer.setNachname(rs.getString("Nachname"));
				nextPer.setVorname(rs.getString("Vorname"));
				nextPer.setGeburtsdatum(rs.getDate("Geburtsdatum"));
				result.add(nextPer);
			}
		}
		catch(SQLException e){
			e.printStackTrace();
		}
		return result;
	}
	
	public Person selectByID(int ids){
		
		String abfrage = "Select * From tblPerson where id=" + ids;
		Person Per = new Person();
		
		try{
			ResultSet rs = getConnection().createStatement().executeQuery(abfrage);
			while(rs.next()){
				Per.setID(rs.getInt("ID"));
				Per.setNachname(rs.getString("Nachame"));
				Per.setVorname(rs.getString("Vorname"));
				Per.setGeburtsdatum(rs.getDate("Geburtsdatum"));
			}
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht geladn werden.");
			e.printStackTrace();
		}
		return Per;
	}
	
	public void insertPerson(Person p){
		String eingabe = "Insert Into tblPerson(Nachname,Vorname,Geburtsdatum) Values (\""+p.getNachname()+"\",\""+p.getVorname()+"\",\""+p.getGeburtsdatum().toString()+"\")";
		try{
			getConnection().createStatement().execute(eingabe);
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht eingetragen werden.");
			e.printStackTrace();
		}
	}
	
	public void insertPerson(String nnam, String vnam, Date geb){
		String eingabe = "Insert Into tblPerson(Nachname,Vorname,Geburtsdatum) Values (\""+nnam+"\",\""+vnam+"\",\""+geb+"\")";
		try{
			getConnection().createStatement().execute(eingabe);
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht eingetragen werden.");
			e.printStackTrace();
		}
	}

	public void updateNachname(String nnam, int idu){
		String refresh = "UPDATE tblPerson SET Nachname=\""+nnam+"\" WHERE ID="+idu;
		try{
			getConnection().createStatement().executeUpdate(refresh);
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht aktualisiert werden.");
			e.printStackTrace();
		}
	}
	
	public void updateVorname(String vnam, int idu){
		String refresh = "UPDATE tblPerson SET Vorname=\""+vnam+"\" WHERE ID="+idu;
		try{
			getConnection().createStatement().executeUpdate(refresh);
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht aktualisiert werden.");
			e.printStackTrace();
		}
	}
	
	public void updateGeburtsdatum(String geb, int idu){
		String refresh = "UPDATE tblPerson SET Geburtsdatum=\""+geb+"\" WHERE ID="+idu;
		try{
			getConnection().createStatement().executeUpdate(refresh);
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht aktualisiert werden.");
			e.printStackTrace();
		}
	}
	
	public void updateGeburtsdatum(Date geb, int idu){
		String refresh = "UPDATE tblPerson SET Geburtsdatum=\""+geb+"\" WHERE ID="+idu;
		try{
			getConnection().createStatement().executeUpdate(refresh);
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht aktualisiert werden.");
			e.printStackTrace();
		}
	}
	
	public void updatePerson(Person p){
		String refresh = "UPDATE tblPerson SET Nachname=\""+p.getNachname()+"\",Vorname=\""+p.getVorname()+"\",Geburtsdatum=\""+p.getGeburtsdatum()+"\" WHERE ID="+p.getID();
		try{
			getConnection().createStatement().executeUpdate(refresh);
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht aktualisiert werden.");
			e.printStackTrace();
		}
	}
	
	public void updatePerson(int idu, String nnam, String vnam, Date geb){
		String refresh = "UPDATE tblPerson SET Nachname=\""+nnam+"\",Vorname=\""+vnam+"\",Geburtsdatum=\""+geb+"\" WHERE ID="+idu;
		try{
			getConnection().createStatement().executeUpdate(refresh);
		}
		catch(SQLException e){
			System.out.println("Datensatz konnte nicht aktualisiert werden.");
			e.printStackTrace();
		}
	}
	
	public Vector<String> getColumns(){
		String abfrage = "Select * From tblPerson";
		Vector<String> col = new Vector<String>();
		try{
			ResultSet rs = getConnection().createStatement().executeQuery(abfrage);
			for(int i=0;i<rs.getMetaData().getColumnCount();i++){
				col.addElement(rs.getMetaData().getColumnLabel(i+1));
			}
		}
		catch(SQLException e){
			System.out.println("Abfrage konnte nicht ausgeführt werden.");
			e.printStackTrace();
		}
		return col;
	}
}

Code:
import java.awt.*;
import javax.swing.*;

public class Ausgabe {

	JFrame jf = new JFrame("Ausgabe");
	JTable tab;
	JPanel pan = new JPanel();
	JButton b = new JButton("Test");
	
	public Ausgabe(){
		
		tab = new JTable();
		tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		tab.setCellSelectionEnabled(true);
		tab.setEnabled(true);
		jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		pan.setLayout(new FlowLayout());
		JScrollPane jsp = new JScrollPane(tab);
		b.setActionCommand("Scan");
		pan.add(b);
		pan.add(jsp);
		
		jf.add(pan);
		jf.setSize(400, 300);
		jf.setVisible(true);
	}
}

Code:
import java.awt.event.*;
import java.util.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class Control implements ActionListener, TableModelListener{

	PersonDAO p = new PersonDAO();
	List<Person> personen = p.selectAll();
	Ausgabe aus = new Ausgabe();
	DefaultTableModel dtm = new DefaultTableModel(personen.size(),p.getColumns().size());
	
	public Control(){
		
		for(int i=0;i<personen.size();i++){
			Person temp = personen.get(i);
			dtm.setValueAt(temp.getID(), i, 0);
			dtm.setValueAt(temp.getNachname(), i, 1);
			dtm.setValueAt(temp.getVorname(), i, 2);
			dtm.setValueAt(temp.getGeburtsdatum(), i, 3);
		}
		
		aus.b.addActionListener(this);
		dtm.addTableModelListener(this);
		aus.tab.setModel(dtm);
	}
	
	public static void main(String[] args) {
		new Control();
	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getActionCommand() == "Scan"){
			System.out.println(dtm.getValueAt(aus.tab.getSelectedRow(), aus.tab.getSelectedColumn()));
		}
	}
	
	public void tableChanged(TableModelEvent e){
		
		int id = Integer.parseInt(String.valueOf(dtm.getValueAt(aus.tab.getSelectedRow(), 0)));
		
		switch (aus.tab.getSelectedColumn()){
			case 1:{
				p.updateNachname((String)dtm.getValueAt(aus.tab.getSelectedRow(), aus.tab.getSelectedColumn()), id);
				break;
			}
			case 2:{
				p.updateVorname((String)dtm.getValueAt(aus.tab.getSelectedRow(), aus.tab.getSelectedColumn()), id);
				break;
			}
			case 3:{
				p.updateGeburtsdatum((String)dtm.getValueAt(aus.tab.getSelectedRow(), aus.tab.getSelectedColumn()), id);
				break;
			}
		}
	}
	
}

Ich hoffe, dass die Struktur nun stimmt, dann kann ich mit dem normalen Programm objektorientiert anfangen. :D
 

tfa

Top Contributor
Danke schon mal. Soweit ich das verstehe, ist das ein Modul, dass ins Programm intigiert wird und den Zugriff auf die Datenbank vereinfacht, indem es SQLCodes überflüssig macht. (Wie auch immer)
Richtig, das SQL wird von dem Framework vollautomatisch generiert. Auch um das Öffnen und Schließen der DB-Connections und das Caching der Objekte muss man sich nicht kümmern (es muss nur konfiguriert werden, was manchmal schwierig genug ist).

Gibt es irgendwo eine Anweisung wie man ein Framework integriert? (Deutsch) :oops:
Per Google hab ich sowas gefunden: www.torsten-horn.de/techdocs/java-hibernate.htm
Möglicherweise ist das für den Anfang ein bisschen zu kompliziert und abschreckend. Er spricht nichts dagegen, die Persistenz erstmal selbst zu programmieren ohne Framework.

Ich hab jetzt par Stunden lang geübt und meinen Übungscode umgeschrieben. Wie fällt dieser aus?

Sieht schon sehr gut aus. Trotzdem noch ein paar kleine Anmerkungen:

Code:
 if(e.getActionCommand() == "Scan")
Das ist gefährlich.

Die Fehlerbehandlung in dem DAO ist ein bisschen zu minimal. Wenn z.B. in selectByID() kein Objekt gefunden wird (oder sonst eine SQLException auftritt), gibst du einfach ein "leeres" Person-Objekt zurück. Es wird zwar eine Meldung auf die Konsole geschrieben, aber das reicht meistens nicht. Gib wenigstens null zurück oder schmeiß eine Exception.
Die ganzen speziellen update-Methoden halte ich für überflüssig. updatePerson() reicht völlig.

Hier noch ein Vorschlag für ein alternatives TableModel. Das DefaultTableModel finde ich grundsätzlich nicht so toll.
Code:
import java.sql.Date;
import java.util.List;

import javax.swing.table.AbstractTableModel;

public class PersonTableModel extends AbstractTableModel {

	private List<Person> list;
	private String[] columns = {"ID", "Vorname", "Nachname", "Geburtstag"};
	
	public PersonTableModel(List<Person> list) {
		this.list = list;
	}
	
	public int getColumnCount() {
		return columns.length;
	}

	public String getColumnName(int column) {
		return columns[column];
	}

	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return columnIndex!=0; // ID nicht editierbar
	}
	public int getRowCount() {
		return list.size();
	}
	
	public void setValueAt(Object value, int rowIndex, int columnIndex) {
		Person person = list.get(rowIndex);
		switch (columnIndex) {
			case 0: throw new IllegalArgumentException();
			case 1: person.setVorname((String)value); break;
			case 2: person.setNachname((String)value); break;
			case 3: person.setGeburtsdatum((Date)value); break;
			default: throw new IllegalArgumentException();
		}
	}

	public Object getValueAt(int rowIndex, int columnIndex) {
		Person person = list.get(rowIndex);
		switch (columnIndex) {
			case 0: return person.getID();
			case 1: return person.getVorname();
			case 2: return person.getNachname();
			case 3: return person.getGeburtsdatum();
			default: throw new IllegalArgumentException();
		}
	}

}
Ungetestet. (Das Editieren des Geburtstags wird z.B. so nicht klappen. Da fehlt noch ein entsprechender CellEditor.)
 
K

Kris

Gast
Zu den Anmerkungen:

Code:
String a=new String("test");
String b=new String("test");
if(a==b){
    System.out.println("true");
}
if(a.equals(b)){
    System.out.println("false");
}

Ausgabe; false

Code:
String a="test";
String b="test";
if(a==b){
    System.out.println("true");
}
if(a.equals(b)){
    System.out.println("false");
}

Ausgabe: true und false

Verstehe nicht warum. Wenn der Inhalt von b="test2" wäre, dann würde der == trotzdem funktionieren. Wo liegt die Gefahr.

Zu selctByID():
wenn der Datensatz nicht gefunden wird, dann wird nichteinmal was in die Konsole geschrieben. Die catch Klausel wird nicht aufgerufen. Wie soll man dann Null zurückgegeben werden oder eine Exceptionn geworfen werden.
Code:
throw new SQLException();
in der catch Klausel funktionier nicht.

Ich dachte die einzelnen updateXXX Methoden wären ökonomischer, weil Werte, die ohnehin nicht verändert wurden, nicht unnötig in die Tabelle geschrieben werden. Aber ich denke mal, dass das nicht gerade den Prozessor in die Knie zwingt.

Das AbstractModel habe ich so ähnlich aufgestellt, bevor ich das mit dem DefaultTable gemacht habe. Dachte, dass das DefaultTable ja ohnehin das AbstractTable beinhaltet. Dazu hat es noch Methoden wie addColumn oder removeRow(). Kann man diese auch im AbstractTable einbauen? Ziel wäre selektierte Zeilen zu löschen oder einzufügen.
 

tfa

Top Contributor
Verstehe nicht warum. Wenn der Inhalt von b="test2" wäre, dann würde der == trotzdem funktionieren. Wo liegt die Gefahr.
Mit == wird auf Objektidentität verglichen, nicht auf den Stringinhalt. Wenn du zwei verschiedene Stringobjekte hast, deren Inhalt aber gleich ist, liefert == false, obwohl du true erwartest.

Zu selctByID():
wenn der Datensatz nicht gefunden wird, dann wird nichteinmal was in die Konsole geschrieben. Die catch Klausel wird nicht aufgerufen. Wie soll man dann Null zurückgegeben werden oder eine Exceptionn geworfen werden.
Code:
throw new SQLException();
in der catch Klausel funktionier nicht.
Zum Beispiel so:

Code:
 public Person selectByID(int ids){ 
       
      String abfrage = "Select * From tblPerson where id=" + ids; 
      Person per = null; 
       
      try{ 
         ResultSet rs = getConnection().createStatement().executeQuery(abfrage); 
         if(rs.next()){ 
            per=new Person();
            per.setID(rs.getInt("ID")); 
            per.setNachname(rs.getString("Nachame")); 
            per.setVorname(rs.getString("Vorname")); 
            per.setGeburtsdatum(rs.getDate("Geburtsdatum")); 
         } 
      } 
      catch(SQLException e){ 
         System.out.println("Datensatz konnte nicht geladn werden."); 
         e.printStackTrace(); 
         throw new MeinePersistenzException("Datensatz konnte nicht geladn werden.");
      } 
      return per; 
   }


Das AbstractModel habe ich so ähnlich aufgestellt, bevor ich das mit dem DefaultTable gemacht habe. Dachte, dass das DefaultTable ja ohnehin das AbstractTable beinhaltet. Dazu hat es noch Methoden wie addColumn oder removeRow(). Kann man diese auch im AbstractTable einbauen? Ziel wäre selektierte Zeilen zu löschen oder einzufügen.
Du kannst natürlich PersonTabelModel auch von DefaultTableModel ableiten. Das funktioniert genauso, und du hast alles, was DefaultTableModel kann.
 
K

Kris

Gast
Code:
throw new MeinePersistenzException("Datensatz konnte nicht geladn werden.");

Verstehe ich nicht. Muss ich eine Klasse MeinePersistenzException erstellen? Sollte nicht irgendein Fehler auftreten, wenn kein Datensatz gefunden wird? So, dass die catch Klausel aufgerufen werden müßte.
 

tfa

Top Contributor
Verstehe ich nicht. Muss ich eine Klasse MeinePersistenzException erstellen?
Könntest du.

Sollte nicht irgendein Fehler auftreten, wenn kein Datensatz gefunden wird? So, dass die catch Klausel aufgerufen werden müßte.
Nein. Wenn nichts gefunden wird, liefert rs.next() false und kein Person-Objekt wird angelegt. Exception gibt's nur, wenn was mit der DB nicht stimmt, Server läuft icht oder so.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Model View Controller Java Basics - Anfänger-Themen 7
S Model View Controller: Verständnisproblem Java Basics - Anfänger-Themen 13
C OOP Model View Controller - Prinzip Java Basics - Anfänger-Themen 6
K Frage zum Model View Controller Prinzip Java Basics - Anfänger-Themen 6
megachucky Model View Controller Pattern - Suche Hilfe bei Anwendung Java Basics - Anfänger-Themen 4
S Model-View-Controller Konzept Beispiel Java Basics - Anfänger-Themen 11
I Klassen Java Qt Model/View Datenhaltung Java Basics - Anfänger-Themen 4
G Einbindung von MVC (Model-View-Controll) Java Basics - Anfänger-Themen 8
richis-fragen JTable den angezeigten WERT nicht den Wert aus dem Model ausgeben. Java Basics - Anfänger-Themen 3
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
G Model mit Models füllen Java Basics - Anfänger-Themen 9
W Befüllung einer Tabelle mit Checkbox, Trennung GUI und Model Java Basics - Anfänger-Themen 5
Q MVC Verständnisproblem: Controller vs model.modelChanged() Java Basics - Anfänger-Themen 0
M Problem mit JTable und Model Java Basics - Anfänger-Themen 3
C Bounded Range Model Java Basics - Anfänger-Themen 1
M Input/Output Vom Model zur Database? Java Basics - Anfänger-Themen 7
propra Wie mache ich einem JPanel mein bereits instanziertes Model bekannt Java Basics - Anfänger-Themen 9
F MVC: Model Klasse erstellen Java Basics - Anfänger-Themen 3
N local variable model is accessed from within inner class; needs to be declared final Java Basics - Anfänger-Themen 4
L Eigenes List Model für Icon + String -> Speicherhungrig? Java Basics - Anfänger-Themen 8
S Forumlare nach dem MVC-Model Java Basics - Anfänger-Themen 5
hdi Fehler beim Model-Update einer JList (DefaultListModel) Java Basics - Anfänger-Themen 3
hdi JList mit Model und Observer -> Chaos, blicke nicht durch Java Basics - Anfänger-Themen 22
K Problem mit Abstract Table Model Java Basics - Anfänger-Themen 5
C JTable Model - getValueAt (int) Java Basics - Anfänger-Themen 3
G JTable mit eigenen Model neu zeichnen Java Basics - Anfänger-Themen 4
L Model einer Table bekommen Java Basics - Anfänger-Themen 6
E Model und i18n bzw. Properties Java Basics - Anfänger-Themen 10
P Tabelle mit Model -> getSelectedRow Java Basics - Anfänger-Themen 4
M model übergeben? Java Basics - Anfänger-Themen 16
I Kamera anschließen / Bild machen / Live View / Externe Blitz Java Basics - Anfänger-Themen 19
sserio Java Fx, wie erstellt man einen EventHandler, der durch das Drücken eines Button Texte in eine Table view einfügt Java Basics - Anfänger-Themen 17
G SQL View query Java Basics - Anfänger-Themen 4
H Best Practice View probleme Java Basics - Anfänger-Themen 2
L Java Package View Java Basics - Anfänger-Themen 6
S Modell View Controller Verständnisfrage Java Basics - Anfänger-Themen 24
M Erste Schritte Eclipse + design view Java Basics - Anfänger-Themen 3
R aktualisierung des View im MVC-Pattern Java Basics - Anfänger-Themen 5
G Eclipse: In Problems View schreiben? Java Basics - Anfänger-Themen 10
A Datentypen Typecast im View Java Basics - Anfänger-Themen 4
A OOP MVC Frage View Java Basics - Anfänger-Themen 2
F View überwachen Java Basics - Anfänger-Themen 6
S JTree, Problem mit View Update Java Basics - Anfänger-Themen 2
K JAVA HEX View! Java Basics - Anfänger-Themen 2
M Controller + View: Fehlermeldungen Java Basics - Anfänger-Themen 2
E MVC - Was darf View Java Basics - Anfänger-Themen 15
E MVC - ein View für mehrere Models Java Basics - Anfänger-Themen 2
EchtKeineAhnungManchmal Controller aus FXML Datei entfernen Java Basics - Anfänger-Themen 49
B Objekt von EJB in Controller (CDI) - Klasse füllen? Java Basics - Anfänger-Themen 3
H Eine befühlte Klasse weiter geben an Controller Java Basics - Anfänger-Themen 12
R Variablen Variable an FXML-Controller übergeben Java Basics - Anfänger-Themen 4
N JavaFX - (Controller) - Klasse verkleinern Java Basics - Anfänger-Themen 8
J MVC Pattern, mehrere Controller/Views/Models Java Basics - Anfänger-Themen 0
F MVC -> Probleme beim Controller Java Basics - Anfänger-Themen 6
F Viele Controller-Klassen Java Basics - Anfänger-Themen 5
Antoras Singleton oder Controller / Datenverwaltungsklasse? Java Basics - Anfänger-Themen 10
T Kommunikation zwischen Controller und GUI Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben