JDBC

schwertmeister

Grünschnabel
Hallo an alle Helfenden:

Ich habe bis Sonntag noch Zeit für folgende Aufgabe:

" Struktieren Sie Ihren Code so, dass Sie eines der Architektur-Muster Table-Data-Gateway,
Row-Data-Gateway oder Data-Access-Object verwenden."

Kann mir jemand dabei helfen? Gerne auch PN an mich. Danke im Voraus.

Mein Code:

Java:
public class BelegungServiceImpl implements BelegungService {

  protected DataSource dataSource = null;

  public BelegungServiceImpl(String connectUri, String uname,
  String passwd) {
  JdbcUtils.loadDriver("oracle.jdbc.driver.OracleDriver");
  dataSource = JdbcUtils.getPooledDataSource(connectUri, uname, passwd,
  false, true);
  }

  @Override
  public Integer vergebePlaetze(Long verNr) throws OverbookException,
  DataAccessException { 
   
     zuweisungRangstufe1(verNr);
     zuweisungRangstufe2(verNr);
     zuweisungRangstufe3(verNr);
     zuweisungRangstufe4(verNr);
   
     int freiePlaetze = zulassung(verNr);

  return freiePlaetze;
  }
 
  private Integer ermittleMaxTeilnehmer(long verNr) {
     Connection connection = null;
  PreparedStatement ps = null;
  String query = null;
  ResultSet rs = null;
 
  int maxTeilnehmer;
 
  try
  {
     connection = JdbcUtils.getConnectionViaDataSource(dataSource);
  query = "select F.max_teilnehmer from Veranstaltung V INNER JOIN Fach F ON V.Fachnr=F.Fachnr where vernr = ?";

  ps = connection.prepareStatement(query);
  ps.setLong(1, verNr);
 
  rs = ps.executeQuery();
 
  if(!rs.next()) {
         throw new DataAccessException();
       } else {
         maxTeilnehmer = rs.getInt("max_teilnehmer");
       }


  }
  catch (SQLException e)
  {
  throw new RuntimeException();
  }
  catch (NullPointerException e)
  {
  throw new RuntimeException();
  }
  finally
  {
  JdbcUtils.closeStatementQuietly(ps);
  JdbcUtils.closeConnectionQuietly(connection);
  }

  return maxTeilnehmer;
  }
 
  private Integer ermittleZugeleasseneTeilnehmer(long verNr) {
     Connection connection = null;
  PreparedStatement ps = null;
  String query = null;
  ResultSet rs = null;
 
  int zugelasseneTeilnehmer;
 
  try
  {
     connection = JdbcUtils.getConnectionViaDataSource(dataSource);
  query = "SELECT COUNT(*) AS zugelassene_teilnehmer FROM Belegung WHERE Status= 'ZU' AND VerNr = ?";

  ps = connection.prepareStatement(query);
  ps.setLong(1, verNr);
 
  rs = ps.executeQuery();
 
  rs.next();
  zugelasseneTeilnehmer = rs.getInt("zugelassene_teilnehmer");
     
  }
  catch (SQLException e)
  {
  throw new RuntimeException();
  }
  catch (NullPointerException e)
  {
  throw new RuntimeException();
  }
  finally
  {
  JdbcUtils.closeStatementQuietly(ps);
  JdbcUtils.closeConnectionQuietly(connection);
  }

  return zugelasseneTeilnehmer;
  }
 

   


   private void zuweisungRangstufe(long verNr, long matrNr, int rangstufe) throws RuntimeException {
     Connection connection = null;
  PreparedStatement ps = null;
  String query = null;
 
  try
  {
     connection = JdbcUtils.getConnectionViaDataSource(dataSource);
   
       query = "UPDATE Belegung SET RANGSTUFE = ? WHERE VERNR = ? and MATRNR = ?";

       ps = connection.prepareStatement(query);
       ps.setInt(1, rangstufe);
       ps.setLong(2, verNr);
       ps.setLong(3, matrNr);
     
   
       ps.executeQuery();
  }
  catch (SQLException e)
  {
  throw new RuntimeException();
  }
  finally
  {
  JdbcUtils.closeStatementQuietly(ps);
  JdbcUtils.closeConnectionQuietly(connection);
  }
   }
 
  private void zuweisungRangstufe1(long verNr) {
     Connection connection = null;
  PreparedStatement ps = null;
  String query = null;
  ResultSet rs = null;
 
 
  try
  {
     connection = JdbcUtils.getConnectionViaDataSource(dataSource);
  query = "SELECT S.MATRNR FROM Veranstaltung V "
         + " INNER JOIN Fach F ON F.FACHNR = V.FACHNR"
         + " INNER JOIN Belegung B ON B.VERNR = V.VERNR"
         + " INNER JOIN Student S ON B.MATRNR = S.MATRNR"
         + " INNER JOIN Studium FS ON FS.MATRNR = S.MATRNR"
         + " WHERE B.VERNR=? AND B.Status != 'ZU'"
         + " AND FS.SGKN = F.SGKN AND FS.FACHSEMESTER = F.VORGEG_SEMESTER";

  ps = connection.prepareStatement(query);
  ps.setLong(1, verNr);
 
  rs = ps.executeQuery();
 
  while(rs.next()) {
     long matrNr = rs.getLong("MATRNR");
     zuweisungRangstufe(verNr, matrNr, 1);
       }

  }
  catch (SQLException e)
  {
  throw new RuntimeException();
  }
  catch (NullPointerException e)
  {
  throw new RuntimeException();
  }
  finally
  {
  JdbcUtils.closeStatementQuietly(ps);
  JdbcUtils.closeConnectionQuietly(connection);
  }

  }
 
  private void zuweisungRangstufe2(long verNr) {
     Connection connection = null;
  PreparedStatement ps = null;
  String query = null;
  ResultSet rs = null;
 
 
  try
  {
     connection = JdbcUtils.getConnectionViaDataSource(dataSource);
  query = "SELECT B1.MATRNR FROM Veranstaltung V1 "
         + " INNER JOIN Belegung B1 ON B1.VERNR = V1.VERNR"
         + " INNER JOIN Belegung B2 ON B2.MATRNR = B1.MATRNR"
         + " INNER JOIN Veranstaltung V2 ON B2.VERNR = V2.VERNR"
         + " WHERE V1.FACHNR = V2.FACHNR AND V1.VERNR != V2.VERNR"
         + " AND B1.Status = 'AN' AND B2.Status = 'ZU'"
         + " AND B1.Rangstufe IS NULL AND V1.VERNR=?";

  ps = connection.prepareStatement(query);
  ps.setLong(1, verNr);
 
  rs = ps.executeQuery();
 
  while(rs.next()) {
     long matrNr = rs.getLong("MATRNR");
     zuweisungRangstufe(verNr, matrNr, 2);
       }

  }
  catch (SQLException e)
  {
  throw new RuntimeException();
  }
  catch (NullPointerException e)
  {
  throw new RuntimeException();
  }
  finally
  {
  JdbcUtils.closeStatementQuietly(ps);
  JdbcUtils.closeConnectionQuietly(connection);
  }

  }
 
  private void zuweisungRangstufe3(long verNr) {
     Connection connection = null;
  PreparedStatement ps = null;
  String query = null;
  ResultSet rs = null;
 
 
  try
  {
     connection = JdbcUtils.getConnectionViaDataSource(dataSource);
  query = "SELECT S.MATRNR FROM Veranstaltung V"
       + " INNER JOIN Fach F ON F.FACHNR = V.FACHNR"
       + " INNER JOIN Belegung B ON B.VERNR = V.VERNR"
       + " INNER JOIN Student S ON B.MATRNR = S.MATRNR"
       + " INNER JOIN Studium FS ON FS.MATRNR = S.MATRNR"
       + " WHERE FS.SGKN = F.SGKN AND B.Status = 'AN'"
       + " AND B.Rangstufe IS NULL AND B.VERNR=?";

  ps = connection.prepareStatement(query);
  ps.setLong(1, verNr);
 
  rs = ps.executeQuery();
 
  while(rs.next()) {
     long matrNr = rs.getLong("MATRNR");
     zuweisungRangstufe(verNr, matrNr, 3);
       }

  }
  catch (SQLException e)
  {
  throw new RuntimeException();
  }
  catch (NullPointerException e)
  {
  throw new RuntimeException();
  }
  finally
  {
  JdbcUtils.closeStatementQuietly(ps);
  JdbcUtils.closeConnectionQuietly(connection);
  }

  }
 
  private void zuweisungRangstufe4(long verNr)
  {
  Connection connection = null;
  PreparedStatement ps = null;
  String query = null;
  ResultSet rs = null;

  try
  {
  connection = JdbcUtils.getConnectionViaDataSource(dataSource);
  query = "SELECT S.MATRNR FROM Veranstaltung V"
  + " INNER JOIN Fach F ON F.FACHNR = V.FACHNR"
  + " INNER JOIN Belegung B ON B.VERNR = V.VERNR"
  + " INNER JOIN Student S ON B.MATRNR = S.MATRNR"
  + " WHERE B.Status = 'AN'"
  + " AND B.Rangstufe IS NULL AND B.VERNR=?";

  ps = connection.prepareStatement(query);
  ps.setLong(1, verNr);

  rs = ps.executeQuery();

  while (rs.next())
  {
  long matrNr = rs.getLong("MATRNR");
  zuweisungRangstufe(verNr, matrNr, 4);
  }

  }
  catch (SQLException e)
  {
  throw new RuntimeException();
  }
  catch (NullPointerException e)
  {
  throw new RuntimeException();
  }
  finally
  {
  JdbcUtils.closeStatementQuietly(ps);
  JdbcUtils.closeConnectionQuietly(connection);
  }

  }

 
  private int zulassung(long verNr) {
     Connection connection = null;
  PreparedStatement ps = null;
  String query = null;
  ResultSet rs = null;
 
  int maxTeilnehmer = ermittleMaxTeilnehmer(verNr);
  int zugelasseneTeilnehmer = ermittleZugeleasseneTeilnehmer(verNr);
 
  try
  {
  connection = JdbcUtils.getConnectionViaDataSource(dataSource);
  query = "SELECT MATRNR FROM Belegung"
       + " WHERE Status ='AN' AND VERNR=?"
       + " ORDER BY Rangstufe ASC, dbms_random.random ASC";

  ps = connection.prepareStatement(query);
  ps.setLong(1, verNr);

  rs = ps.executeQuery();

  while (rs.next() && maxTeilnehmer > zugelasseneTeilnehmer)
  {
  long matrNr = rs.getLong("MATRNR");
 
  query = "UPDATE  Belegung SET Status = 'ZU' WHERE vernr = ? and matrnr = ?";

  ps = connection.prepareStatement(query);
  ps.setLong(1, verNr);
  ps.setLong(2, matrNr);
 
  ps.executeQuery();
 
  zugelasseneTeilnehmer += 1;
  }
 
   
     ablehnungOffenerBelegungen(verNr);
   
 
  }
  catch (SQLException e)
  {
  throw new RuntimeException();
  }
  catch (NullPointerException e)
  {
  throw new RuntimeException();
  }
  finally
  {
  JdbcUtils.closeStatementQuietly(ps);
  JdbcUtils.closeConnectionQuietly(connection);
  }
 
 
  int freiePlaetze = maxTeilnehmer - zugelasseneTeilnehmer;
 
  if (freiePlaetze < 0) {
       throw new OverbookException();
  }
 
  return freiePlaetze;
  }
 
  private void ablehnungOffenerBelegungen(long verNr) {
     Connection connection = null;
  PreparedStatement ps = null;
  String query = null;

  try
  {
  connection = JdbcUtils.getConnectionViaDataSource(dataSource);
  query = "UPDATE Belegung SET Status = 'AB' WHERE Status = 'AN' AND VerNr = ?";
     

  ps = connection.prepareStatement(query);
  ps.setLong(1, verNr);

  ps.executeQuery();
 
  }
  catch (SQLException e)
  {
  throw new RuntimeException();
  }
  catch (NullPointerException e)
  {
  throw new RuntimeException();
  }
  finally
  {
  JdbcUtils.closeStatementQuietly(ps);
  JdbcUtils.closeConnectionQuietly(connection);
  }
  }
   
}
 
Zuletzt bearbeitet:

vfl_freak

Premium-User
Moin,

die Code-Tags findest Du hier im Editor mit den "Einfügen"-Button (links neben dem Diskettensymbol) !

Sodann wären mal konkrete Info zur Aufgabenstellung rsp. zum gepostenen Code sowie konkrete Fragen sinnvoll !!! :rolleyes:

Gruß Klaus
 

schwertmeister

Grünschnabel
Ok zweiter Versuch :rolleyes::

code hab ich im esrten beitrag überarbeitet ...sollte jetzt korrekt dargestellt werden.

wir hatten eine umfangreiche belegaufgabe zu jdbc

...dort sollten diverse methoden geschrieben werden, die eine studienplatzvergabe an einer hochschule simulieren/berechnen

also nach rangstufen und eben angemeldet/zugelassen/abgelehnt etc.

Testfälle die mit JUNIT getestet werden sollen sind insgesamt 7 an der Zahl:

rangstufen darin mit dazugehörigem SQL-Code waren:

Rangstufe 1: Studierende, in deren Studiengang die Veranstaltung angeboten wird
und die diese Veranstaltung im vorgesehenen Semester belegen*/

/*********************************************************************************************************/

select * /*s.Matrnr*/
from Veranstaltung V
INNER JOIN Fach F ON F.FACHNR = V.FACHNR
INNER JOIN Belegung B ON B.VERNR = V.VERNR
INNER JOIN Student S ON B.MATRNR = S.MATRNR
INNER JOIN Studium FS ON FS.MATRNR = S.MATRNR

WHERE B.VERNR='4711'
AND FS.SGKN = F.SGKN
AND FS.FACHSEMESTER = F.VORGEG_SEMESTER
AND B.Status != 'ZU';

/**********************************************************************************************************/
/*testVergebePlaetze2()
Erfolgsfall: Der Testfall testet den Service zum Vergeben von Plaetzen nach Rangstufe 2.

Rangstufe 2: Wiederholerinnen und Wiederholer */

SELECT * FROM Veranstaltung V1
INNER JOIN Belegung B1 ON B1.VERNR = V1.VERNR
INNER JOIN Student S ON B1.MATRNR = S.MATRNR
INNER JOIN Belegung B2 ON B2.MATRNR = S.MATRNR
INNER JOIN Veranstaltung V2 ON B2.VERNR = V2.VERNR

WHERE V1.FACHNR = V2.FACHNR
AND V1.VERNR != V2.VERNR
AND B1.Status != 'ZU'
AND B2.Status = 'ZU'
AND V1.VERNR='4612';

/**************************************************************************************************/
/*testVergebePlaetze3()
Erfolgsfall: Der Testfall testet den Service zum Vergeben von Plaetzen nach Rangstufe 3.

Rangstufe 3: Studierende, in deren Studiengang die Veranstaltung angeboten wird,
die die Veranstaltung aber nicht im vorgesehenen Semester belegen*/

select * /*s.Matrnr*/
from Veranstaltung V
INNER JOIN Fach F ON F.FACHNR = V.FACHNR
INNER JOIN Belegung B ON B.VERNR = V.VERNR
INNER JOIN Student S ON B.MATRNR = S.MATRNR
INNER JOIN Studium FS ON FS.MATRNR = S.MATRNR

WHERE B.VERNR='4711'
AND FS.SGKN = F.SGKN

AND B.Status != 'ZU';


/*****************************************************************************************************/
/*testVergebePlaetze4()
Erfolgsfall: Der Testfall testet den Service zum Vergeben von Plaetzen nach Rangstufe 4.

Rangstufe 4: Studierende aus anderen Studiengängen*/


select * /*s.Matrnr*/
from Veranstaltung V
INNER JOIN Fach F ON F.FACHNR = V.FACHNR
INNER JOIN Belegung B ON B.VERNR = V.VERNR
INNER JOIN Student S ON B.MATRNR = S.MATRNR
WHERE B.VERNR='4711'

AND B.Status != 'ZU';


/*******************************************************************************/
/*testVergebePlaetze5()
Erfolgsfall: Der Testfall testet den Service zum Vergeben von Plaetzen
mit einem Rangstufen-Mix und Ablehnungen*/



/*******************************************************************************/
/*testVergebePlaetze6()
Fehlerfall: Der Testfall testet das Vergeben von Plaetzen
einer nicht existierenden Veranstaltung.


/*******************************************************************************/
/*testVergebePlaetze7()
Fehlerfall: Der Testfall testet das Vergeben von Plaetzen
bei einer bereits überbuchten Veranstaltung.


Soweit so gut...aber wie gesagt ...diese Aufgabe ist ja mit meinem Code komplett gelöst.

Interessant ist eben die Zusatzaufgabe die sagt, dass man eben den Code so umstrukturieren soll (teilweise auf mehrere klassen) ,
dass Table Data Gateway, RowData Gateway oder DataAccesObject kurz DAO realisiert werden soll.

und da liegt bei mir der Hase im Pfeffer, es übersteigt meine Javakenntnisse und ich weiß leider nicht was ich da noch wie umstrukturieren soll.

(War auch leider wegen privaten Gründen 2 Wochen abwesend von der Uni und muss bis Sonntag dafür ne Lösung haben)

Ich hoffe dass es jetzt klarer ist.

Nochmal es geht hier NICHT darum die 7 Testfälle inhaltlich zu bearbeiten, das ist mit dem Code oben schon realisiert und vom Dozenten auch abgesegnet worden.

Ich bin dankbar für jede Hilfe, gerne auch PN an mich.
 

vfl_freak

Premium-User
Moin,
und da liegt bei mir der Hase im Pfeffer, es übersteigt meine Javakenntnisse und ich weiß leider nicht was ich da noch wie umstrukturieren soll.
(War auch leider wegen privaten Gründen 2 Wochen abwesend von der Uni und muss bis Sonntag dafür ne Lösung haben)
hmm, solche Argumente kommen hier meist nicht sonderlich gut an :eek:

Ich denke, Du solltest es besser hier versuchen:
https://www.tutorials.de/forums/jobboerse-jobs-tutorials-de.312/

Gruß Klaus
 

schwertmeister

Grünschnabel
hm? mir würde ja schon reichen wenn jemand nen beispielcode mal darstellt und anschließend wie er in tabledatagaetway aussieht ? ich wollte hier keine fertig servierte lösung abwer wenn ich schon alles wüsste bräuchte ich nicht in ein anonymes forum posten ...
 

Technipion

Erfahrenes Mitglied
Hallo schwertmeister,
was vfl_freak gemeint hat ist, dass wir hier im Forum ein vergleichsweise hohes Niveau haben und daher grundsätzlich Eigenleistungen erwarten. Wenn du einfach nur eine Lösung für dein Problem suchst, schlage ich vor du postest noch einen Thread in einem der vielen anderen Foren die es zur Programmierung gibt (was du ja vermutlich eh getan hast). Ggf. kannst du wie oben angesprochen auch die hiesige Tauschbörse nutzen, dann kostet es allerdings natürlich etwas.

Falls du dich jedoch auf unsere Methode einlässt, hätte das große Vorteile für dich. Du würdest nicht nur das Programm fertig bekommen, sondern auch die 2 verpassten Wochen nachholen. Deshalb gebe ich dir hier mal ein paar Anhaltspunkte, wie du dich in das Thema einlesen kannst:
Alle 3 angesprochenen Begriffe (Table data gateway, Row data gateway, und Data access object) sind sogenannte Design patterns (engl. für Entwurfsmuster), genauer Design patterns für objektrelationale Abbildung, also Muster die man benutzt um Objekte in einer relationalen Datenbank abzulegen und anzusprechen. Es gibt hierfür den deutschen Wikipedia-Artikel "Entwurfsmuster" und natürlich das englischsprachige Pendant, womit du dich erst einmal grundsätzlich in Design patterns einarbeiten kannst (falls du das noch nicht getan haben solltest). In der englischen Wikipedia gibt es außerdem zu jedem o.g. Pattern einen eigenen Artikel, auch wenn die Artikel sehr kurz ausfallen. In solchen Fällen kannst du ja mal den Quellen folgen, du findest dort detailliertere Beschreibungen der Patterns, und sogar Schemaskizzen ;).
Ich vermute weiterhin, dass es an der Uni irgendwelches Material gibt, womit du dir zumindest einen groben Überblick über die erwähnten Techniken verschaffen kannst.

Mein Vorschlag ist jetzt: In den nächsten paar Tagen holst du die Theorie nach und meldest dich dann (z.B. Mittwoch/Donnerstag) wieder hier. Du hast dann zumindest schon einmal Ansätze parat, wie man das Realisieren könnte. Vielleicht hast du ja sogar schon eines der Patterns eingebaut. Und wenn du dann konkrete Fragen zum Vorgehen hast, helfen wir dir gerne (kostenlos) weiter :).

Das ist zwar nicht der Weg des geringsten Widerstandes, aber wenn du ihn beschritten hast bist du hinterher froh und stolz darauf.

Grüße Technipion