# Java-MysQl: Ermittlung von Mitarbeiter Status



## sos (10. Dezember 2011)

Hallo liebe Leute,
Ich kann mich erfolgreich mit einer Db verbinden die folgend aufgebaut ist: 
Abteilungsleiter(leiter ID)---->(id)Angestellter(personID)---->(id)Personen.
mit anderen worten jeder Abteilungsleiter ist Angesteller und Person ...usw..aber nicht umgekehrt.

dafür habe ich folgende Methode, die bislang unterschied zwischen einer Person und Angestellten macht, allerdings noch nicht festellen kann ob der Angestellter  auch Abteilungsleiter ist.

```
private boolean anmelden(){
		// teste Vollständigkeit der Eingabedaten
		String message = "";
		if (txtVorname.getText().trim().equals(""))
			message = " Vorname";
		if(txtNachname.getText().trim().equals(""))
			message += " Nachname";
		// keine Passwort-Prüfung, denn dies Feld kann auch leer sein
		if(message.length() > 0){
			statusleiste.setText("Fehlende Eingabe:" + message);
		}
		else {
			this.getDbManager(); // DbManager sicherstellen
			person = new Person(txtVorname.getText().trim(), txtNachname.getText().trim());
			/* Wiederholungsaufgabe 4.3: */
			
			dbManager.startTransaction();
			angestellter = new Angestellter(person);
			abteilung = new Abteilung(angestellter);
			
		
			if(person.retrieveObject(dbManager)) {
				
				
			     
			
			            if(angestellter.retrieveObject(dbManager)){
			            	
				    	// Lesen des Kunden war erfolgreich
				     	statusleiste.setText("Angestellter "
				  			+  person.getVorname() + " " + person.getNachname() + "!");
					     this.setAnmeldungErfolgreich(true);
					
					
				      	dbManager.endTransaction(true);
				      	statusleiste.setText("ZUGANG VERWEIGERT:"
							+  person.getVorname() + " " + person.getNachname() + " ist kein Abteilungsleiter!"); 
				      	return true;
				     }else{
		
				
				// Lesen des Kunden war erfolgreich
				statusleiste.setText("Angestellter "
						+  person.getVorname() + " " + person.getNachname() + "!");
				this.setAnmeldungErfolgreich(true);
				
				dbManager.endTransaction(true);
				statusleiste.setText("  :"
						+  person.getVorname() + " " + person.getNachname() + " ist kein Angestellter");
				
			}
				return true;
				
					
			}else
			statusleiste.setText("Person"
					+  person.getVorname() + " " + person.getNachname() + " existiert nicht in der DB");
		
		dbManager.endTransaction(true);
		/* "endTransaction(f a l s e)"-Aufruf nicht erforderlich, da keine Änderungen
		 * in der Datenbank erfolgen und lediglich das serielle (isolierte) Lesen
		 * sichergestellt werden muss. */
		return true;
	}
	return false;
}
```

Die SQL-Abfragen sowie Spreicherung des Resultselts ist in der Klassen Person, Angesteller , Abteilung, die eine PersistenzInterface implementieren

```
import java.sql.ResultSet; 
import java.sql.SQLException;


public class Angestellter implements PersistenzInterface {

	/* ****** PI-Properties ****** */
	private boolean persistent;
	public boolean isPersistent() { return persistent; }
	public void setPersistent(boolean newValue) { this.persistent = newValue; }

	private boolean modified;
	public boolean isModified() { return modified; }
	public void setModified(boolean newValue) { this.modified = newValue; }

	/* Konstruktoren */
	public Angestellter(int id) {
		this.id = id;
	}

	public Angestellter(Person person) {
		this.person = person;
	}
	/* ausgewählte Properties Angestelltendaten, ausreichend für Kunden-Client */
	private int id;		// auch von PI gefordert
	public int getId() { return id; }
	public void setId(int id) { this.id = id;  this.setModified(true); }

	private Abteilung abteilung;
	public Abteilung getAbteilung() { return abteilung; }
	public void setAbteilung(Abteilung abteilung) { this.abteilung = abteilung;  this.setModified(true); }

	private String geschlecht;
	public String getGeschlecht() { return geschlecht; }
	public void setGeschlecht(String geschlecht) { this.geschlecht = geschlecht;  this.setModified(true); }

	private Person person;
	public Person getPerson() { return person; }
	public void setPerson(Person person) { this.person = person;  this.setModified(true); }

	/* weitere Felder */
	private String message;
	public String getMessage() { return message; }

	/* ****** Datenbankoperationen ****** */
	public boolean retrieveObject(DbManager dbManager) {
		if(this.isPersistent()) {
			message = "ausDbLesen: Der Angestellte wurde schon aus der DB gelesen";
			return true;
		} else {
			if(!dbManager.executeRetrieve(this)) { // alternative Suche nach id oder Name in
				message = "ausDbLesen: Kein Angestellter in der Datenbank";
				return false;
			} else {
				return true;
			}
		}
	}
	public boolean deleteObject(DbManager dbManager) {
		// TODO Auto-generated method stub
		return false;
	}
	public boolean updateObject(DbManager dbManager) {
		// TODO Auto-generated method stub
		return false;
	}
	public boolean insertObject(DbManager dbManager) {
		// TODO Auto-generated method stub
		return false;
	}
	/* ****** SQL-Anweisungen erstellen ****** */
	public String getDeleteSQL() {

		// TODO Auto-generated method stub
		return null;
	}
	public String getInsertSQL() {
		// TODO Auto-generated method stub
		return null;
	}
	public String getRetrieveSQL() {
		String queryString = null;
		if(this.getId() > 0) { 	// noch nicht gelesen, aber schon in DB (id ist dann > 0)
			queryString = "SELECT id, abtID, geschlecht, personID FROM angestellte WHERE id=" + this.getId();
		} else {				// Objekt ist transient
			if(this.getPerson().getId() > 0)
				queryString = "SELECT id, abtID, geschlecht, personID FROM angestellte WHERE personID=" + this.getPerson().getId();
			else
				message = "Angestellter.ausDbLesen: PersonID muss gesetzt sein (ist aber 0)";
		}
		return queryString;
	}
	public String getUpdateSQL() {
		// TODO Auto-generated method stub
		return null;
	}
	public boolean loadObjProps(ResultSet rs) {
		try {
			if(rs != null && rs.next()) {
				this.setId(rs.getInt(1));
				int newID = rs.getInt(2);
				if(abteilung == null)	//für temporäre Objekte
					abteilung = new Abteilung(rs.getInt(2));
				if(newID != this.getAbteilung().getId()) // sonst würde das eingebettete Person-Objekt als "verändert" markiert!
					this.getAbteilung().setId(newID);
				this.setGeschlecht(rs.getString(3));
				newID = rs.getInt(4);
				if(person == null)	//für temporäre Objekte
					person = new Person(newID);
				if(newID != this.getPerson().getId()) // sonst würde das eingebettete Person-Objekt als "verändert" markiert!
					this.getPerson().setId(newID);
				return true;
			}
		} catch (SQLException sqle) {
			System.out.println("Angestellter.ladeObjekt - " + sqle.toString());
		}
		return false;
	}

	/* ******* sonstige Hilfsmethoden ****** */
	@Override
	public boolean equals(Object object){
		// TODO implement
		return false;
	}
	@Override
	public String toString() {
		return "Angestellter id=" + id + " " + this.getPerson() + ", Abteilung " + abteilung;//.getId();//this.getAbteilung().getName();
	}
	@Override
	public String getPufferKey() {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void setPufferKey(String pufferKey) {
		// TODO Auto-generated method stub
		
	}
}
```


```
import java.sql.ResultSet;



/* Das Interface muss auch in dieses Projekt aufgenommen werden,
 * da es den DbManager dieser Projektversion verwendet. Daher ist kein
 * Import aus "lektion4" möglich.  */


public interface PersistenzInterface extends Cloneable {

	/* Persistenzeigenschaften */
	boolean isPersistent();
	void    setPersistent( boolean newValue );

	boolean isModified();
	void    setModified( boolean newValue );

	/* id-Eigenschaft für ale PI-Objekte ab Lektion 4 */
	void setId(int id);
	int getId();

	/* Fügt das aktuelle Objekt in die Datenbank ein (SQL-INSERT). */
	boolean insertObject(DbManager dbManager);

	/* Liest ein Objekt aus der Datenbank (SQL-SELECT).
	 * In Lektion 5 erhält die Methode eine andere Rückgabe, um alternativ das
	 * Original oder das Pufferobjekt durchreichen zu können. */
	boolean retrieveObject(DbManager dbManager);

	/* Ändert den Objektzustand in der Datenbank (SQL-UPDATE).  */
	boolean updateObject(DbManager dbManager);

	/* Löscht das aktuelle Objekt aus der Datenbank (SQL-DELETE). */
	boolean deleteObject(DbManager dbManager);

	/* SQL-String- und Verwaltungsmethoden - ab Lektion 4 */
	String getInsertSQL();
	String getRetrieveSQL();
	String getUpdateSQL();
	String getDeleteSQL();

	/* Läd die Properties (Eigenschaften) eines perssistenzfähigen Objekts aus
	 * dem übergebenen ResaultSet-Objekt - Ergebnis einer Datenbankabfrage.
	 * Der Methodenname kürzt "loadObjectProperties" ab. */
	boolean loadObjProps(ResultSet rs);

	/* Ergänzung in Lektion 5:
	 * Das mapping dient der S u c h e ("find" - bzw. "retrieve" aus CRUD)
	 * im Puffer - also muss ein Wert erzeugt werden, mit dem typischerweise
	 * gesucht wird. Die Schlüsseldefinition sollte auf die angebotenen
	 * Konstruktoren (bzw. deren Parameter) abgestimmt werden.  */
	String getPufferKey();
	void setPufferKey(String pufferKey);

	
	
	/****WAS SOLL DAS ***/
	//PersistenzInterface clone() throws CloneNotSupportedException;

	String getMessage();
}
```

Die Klasse Abteilung habe ich soweit geschrieben und habe die anmelden() so umgeändert
mit dem Ergebnis : 





> DbManager.executeSelect - java.sql.SQLException: Can not issue NULL query.





```
private boolean anmelden(){
		// teste Vollständigkeit der Eingabedaten
		String message = "";
		if (txtVorname.getText().trim().equals(""))
			message = " Vorname";
		if(txtNachname.getText().trim().equals(""))
			message += " Nachname";
		// keine Passwort-Prüfung, denn dies Feld kann auch leer sein
		if(message.length() > 0){
			statusleiste.setText("Fehlende Eingabe:" + message);
		}
		else {
			this.getDbManager(); // DbManager sicherstellen
			person = new Person(txtVorname.getText().trim(), txtNachname.getText().trim());
			/* Wiederholungsaufgabe 4.3: */
			
			dbManager.startTransaction();
			angestellter = new Angestellter(person);
			abteilung = new Abteilung(angestellter);
			if(angestellter.retrieveObject(dbManager)){
				
				if(abteilung.retrieveObject(dbManager)){
            		statusleiste.setText("Angestellter "
				  			+  person.getVorname() + " " + person.getNachname() + "!");
					     this.setAnmeldungErfolgreich(true);
					
					
				      	dbManager.endTransaction(true);
			    	 System.out.println("Hopla");
			    	 return true;
			     }
				else{
					
					
					// Lesen des Kunden war erfolgreich
					statusleiste.setText("Angestellter "
							+  person.getVorname() + " " + person.getNachname() + "!");
					this.setAnmeldungErfolgreich(true);
					
					dbManager.endTransaction(true);
					statusleiste.setText("  :"
							+  person.getVorname() + " " + person.getNachname() + " ist kein Abteildjhf");
					
				}
					return true;
					
						
				}
			else
		
			if(person.retrieveObject(dbManager)) {
				
				
			     
			
			            if(angestellter.retrieveObject(dbManager)){
			            	
			            	
			            	
				    	// Lesen des Kunden war erfolgreich
				     	statusleiste.setText("Angestellter "
				  			+  person.getVorname() + " " + person.getNachname() + "!");
					     this.setAnmeldungErfolgreich(true);
					
					
				      	dbManager.endTransaction(true);
				      	statusleiste.setText("ZUGANG VERWEIGERT:"
							+  person.getVorname() + " " + person.getNachname() + " ist kein Abteilungsleiter!"); 
				      	return true;
				     }else{
		
				
				// Lesen des Kunden war erfolgreich
				statusleiste.setText("Angestellter "
						+  person.getVorname() + " " + person.getNachname() + "!");
				this.setAnmeldungErfolgreich(true);
				
				dbManager.endTransaction(true);
				statusleiste.setText("  :"
						+  person.getVorname() + " " + person.getNachname() + " ist kein Angestellter");
				
			}
				return true;
				
					
			}else
			statusleiste.setText("Person"
					+  person.getVorname() + " " + person.getNachname() + " existiert nicht in der DB");
		
		dbManager.endTransaction(true);
		/* "endTransaction(f a l s e)"-Aufruf nicht erforderlich, da keine Änderungen
		 * in der Datenbank erfolgen und lediglich das serielle (isolierte) Lesen
		 * sichergestellt werden muss. */
		return true;
	}
	return false;
}
```

Ich wäre euch sehr dankbar für jeden Tipp oder Anregung.


----------



## Akeshihiro (10. Dezember 2011)

Man man man, den Code muss ja erst umformatieren...

Aber egal. Wenn ich das richtig verstanden habe, dann willst du herausfinden, ob ein Angestellter auch ein Abteilungsleiter ist. In der Klasse Angestellter lädst du aber nur den Kram für den Angestellten, jedenfalls habe ich sonst nix gefunden, auch nicht in den SQLs. Wo wird denn die Information zum Abteilungsleiter hinterlegt? Gibt es dafür eine weitere Tabelle oder wie oder was.


----------



## sos (10. Dezember 2011)

Danke  Abteilung ist eine Weiter Tabelle ja, hier ist die Klasse Abteilung : 
	
	
	



```
import java.sql.ResultSet;
import java.sql.SQLException;



public class Abteilung implements PersistenzInterface {

	/* ****** PI-Properties ****** */
	private boolean persistent;
	public boolean isPersistent() { return persistent; }
	public void setPersistent(boolean newValue) { this.persistent = newValue; }

	private boolean modified;
	public boolean isModified() { return modified; }
	public void setModified(boolean newValue) { this.modified = newValue; }

	/* Konstruktoren */
	public Abteilung(int id) {
		this.id = id;
	}
	private Angestellter angestellter;

	public Abteilung(Angestellter angestellter) {
		this.angestellter = angestellter;
	}

	/* Properties zu Abteilungsdaten */
	private int id;
	public int getId() { return id; }
	public void setId(int id) { this.id = id; this.setModified(true); }

	private String name;
	public String getName() { return name; }
	public void setName(String name) { this.name = name; }

	private String message;
	public String getMessage() {	return message;}
	
	private String geschlecht;
	public String getGeschlecht() { return geschlecht; }
	public void setGeschlecht(String geschlecht) { this.geschlecht = geschlecht;  this.setModified(true); }

	private Person person;
	
	public Angestellter getAngestellter() { return angestellter; }
	public void setAngestellter(Angestellter angestellter) { this.angestellter = angestellter; this.setModified(true);}

	/* ****** Datenbankoperationen ****** */
	public boolean retrieveObject(DbManager dbManager) {
		if(this.isPersistent()) {
			message = "ausDbLesen: Der Angestellte wurde schon aus der DB gelesen";
			return true;
		} else {
			if(!dbManager.executeRetrieve(this)) { // alternative Suche nach id oder Name in
				message = "ausDbLesen: Kein Angestellter in der Datenbank";
				return false;
			} else {
				return true;
			}
		}
	}
	public boolean deleteObject(DbManager dbManager) {
		// TODO Auto-generated method stub
		return false;
	}
	public boolean updateObject(DbManager dbManager) {
		// TODO Auto-generated method stub
		return false;
	}
	public boolean insertObject(DbManager dbManager) {
		// TODO Auto-generated method stub
		return false;
	}
	/* ****** SQL-Anweisungen erstellen ****** */
	public String getDeleteSQL() {
		// TODO Auto-generated method stub
		return null;
	}
	public String getInsertSQL() {
		// TODO Auto-generated method stub
		return null;
	}
	public String getRetrieveSQL() {
		
		String queryString = null;
		if(this.getId() > 0) { 	// noch nicht gelesen, aber schon in DB (id ist dann > 0)
			queryString =  "SELECT id, name, leiterID FROM abteilung WHERE id=" + this.getId();
		} else {				// Objekt ist transient
			if(this.getAngestellter().getId()> 0)
				queryString = "Select abteilungen.id ,abteilungen.name, abteilungen.leiterID , vorname, " +
						"nachname from personen left JOIN (Select personID,id from angestellte) A " +
		                   "on personen.id=A.personID Left join abteilungen on A.id=abteilungen.leiterID " +
		                   "where A.id in (SELECT leiterID FROM abteilungen) =" + this.getAngestellter().getId();
			else
				message= ("Angestellter.ausDbLesen: PersonID muss gesetzt sein (ist aber 0)");
		}
		
        return queryString;
	}

	public String getUpdateSQL() {
		// TODO Auto-generated method stub
		return null;
	}
	public boolean loadObjProps(ResultSet rs) {
		try {
			if(rs != null && rs.next()) {
				id = rs.getInt(1);
				int newID = rs.getInt(2);
				this.setGeschlecht(rs.getString(3));
				newID = rs.getInt(4);
				if(person == null)	//für temporäre Objekte
					person = new Person(newID);
				if(newID != this.getAngestellter().getId()) // sonst würde das eingebettete Person-Objekt als "verändert" markiert!
					this.getAngestellter().setId(newID);
				return true;
			}
		} catch (SQLException sqle) {
			System.out.println("Kunde.loadObjProps - " + sqle.toString());
		}
		return false;
	}


	/* ******* sonstige Hilfsmethoden ****** */
	/* "equals" wird überschrieben, um zwei Abteilungsobjeke auf Gleichheit
	 * zu testen. */
	@Override
	public boolean equals(Object object){
		// TODO implement
		return false;
	}
	@Override
	public String toString() {
		return  new Integer(id).toString();
	}
	@Override
	public String getPufferKey() {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void setPufferKey(String pufferKey) {
		// TODO Auto-generated method stub
		
	}
	
	
}
```


----------



## Akeshihiro (10. Dezember 2011)

Ähm... Du hast die Tags vertauscht. Das erste Tag ist ohne Slash (/), das muss in das zweite Tag, um das Ende zu kennzeichnen.

EDIT:
Bei deinem SQL sieht was komisch aus:

```
"where A.id in (SELECT leiterID FROM abteilungen) =" + this.getAngestellter().getId();
```
Das müsste eigentlich so aussehen:

```
"where A.id = " + this.getAngestellter().getId();
```


----------

