Advertisement
Guest User

Untitled

a guest
Jul 3rd, 2017
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.18 KB | None | 0 0
  1. /*
  2.  * Datenbanksysteme (VL 4.0, 181.186)
  3.  * Laboruebungsteil, WS 2010/2011
  4.  *
  5.  * Beispiel 3
  6.  */
  7.  
  8. import java.sql.*;
  9. import java.text.DateFormat;
  10. import java.text.ParseException;
  11. import java.text.SimpleDateFormat;
  12.  
  13. public class Entlehnungsverwaltung {
  14.  
  15.     private static String driver = "jdbc:postgresql";
  16.     private static String server = "localhost";
  17.     private static String port = "5432";
  18.     private static String db = "u0925144";
  19.     private static String user = "u0925144";
  20.     private static String password = "derhase123";
  21.  
  22.     private Connection con = null;
  23.  
  24.  
  25.     public void dbConnect() {
  26.  
  27.         try {
  28.             Class.forName("org.postgresql.Driver");
  29.         } catch (ClassNotFoundException e) {
  30.             System.err.println("Couldn't find driver class:");
  31.             e.printStackTrace();
  32.         }
  33.  
  34.         try {
  35.             con = DriverManager.getConnection(driver + "://" + server + ":" + port + "/" + db, user, password);
  36.         } catch (SQLException e) {
  37.             System.out.println("Couldn't connect: print out a stack trace and exit.");
  38.             e.printStackTrace();
  39.             System.exit(1);
  40.         }
  41.  
  42.         if (con != null)
  43.             System.out.println("Hooray! We connected to the database!");
  44.         else
  45.             System.out.println("We should never get here.");
  46.     }
  47.  
  48.  
  49.     public void dbOutputKunden() {
  50.  
  51.         /**
  52.          * Methode "dbOutputKunden()", die alle Entlehnkartenbesitzer (Entlehnkartennummer, Vor- und Nachname,
  53.          * offene Gebuehren auf der Entlehnkarte) ausgibt, die Anzahl aller bisherigen Entlehnungen sowie die
  54.          * Gesamtsumme der Gebuehren, die durch alle Entlehnungen dieses Kunden bisher entstanden sind. Vergessen
  55.          * Sie nicht auf jene Kunden, fuer die noch keine Entlehnungen erfasst sind! Verwenden Sie dabei die
  56.          * Funktion "f_gebuehr", die Sie in Punkt 6.2 erstellt haben. Die Ausgabe soll als Comma-Separated List
  57.          * erfolgen, d.h.: eine Bildschirm-Zeile pro Zeile der Tabelle; die Spaltenwerte werden einfach nacheinander
  58.          * ausgegeben und mittels "," getrennt.
  59.          */
  60.         ResultSet rs1 = null;
  61.         ResultSet rs2 = null;
  62.         Statement stmt1 = null;
  63.         Statement stmt2 = null;
  64.         String getEidQuery = "Select p.pid, p.vname, p.nname, ek.nr, ek.gebuehr, eg.eid from Entlehnung eg " +
  65.                 "inner join Entlehnkarte ek on (eg.Entlehnkarte=ek.nr) " +
  66.                 "inner join Person p on (p.pid=ek.person)" +
  67.                 "order by p.pid;";
  68.         int pid_new = 0;
  69.         int pid_old = -1;
  70.         String vorname = "";
  71.         String nachname = "";
  72.         float gebuehr = 0;
  73.         int eid;
  74.         int anz = 0;
  75.         int nr = -1;
  76.         String ausgabe = "";
  77.         float summe = 0;
  78.  
  79.         try {
  80.             stmt1 = con.createStatement();
  81.             rs1 = stmt1.executeQuery(getEidQuery);
  82.  
  83.             System.out.println("\ndbOutPutKunde\npid\t|\tvorname\t\t|\tnachname\t|\tKartennr.\t|\tGebuehr\t|\tEntl.\t|\tKosten");
  84.             System.out.println("----------------------------------------------------------------------------------------");
  85.             while (rs1.next()) {
  86.                 pid_new = rs1.getInt("pid");
  87.                 eid = rs1.getInt("eid");
  88.  
  89.                 stmt2 = con.createStatement();
  90.                 rs2 = stmt2.executeQuery("select f_gebuehr(" + eid + ");");
  91.                 anz++;
  92.  
  93.                 if (pid_new == pid_old || pid_old == -1) {
  94.  
  95.                 } else {
  96.  
  97.                     ausgabe += pid_old + "\t|\t" + vorname + "\t|\t" + nachname + "\t|\t" + nr + "\t|\t" + this.setNullVorne(gebuehr, 4) + "\t|\t" + anz + "\t\t|\t" + summe;
  98.                     summe = 0;
  99.                     anz = 0;
  100.                     System.out.println(ausgabe);
  101.                     ausgabe = "";
  102.                 }
  103.                 while (rs2.next()) {
  104.                     summe += rs2.getFloat(1);
  105.                 }
  106.                 vorname = rs1.getString("vname");
  107.                 nachname = rs1.getString("nname");
  108.                 gebuehr = rs1.getFloat("gebuehr");
  109.                 nr = rs1.getInt("nr");
  110.                 pid_old = pid_new;
  111.  
  112.             }
  113.             ausgabe += pid_old + "\t|\t" + vorname + "\t|\t" + nachname + "\t|\t" + nr + "\t|\t" + this.setNullVorne(gebuehr, 4) + "\t|\t" + anz + "\t\t|\t" + summe;
  114.             System.out.println(ausgabe);
  115.         } catch (SQLException e) {
  116.             System.err.println("Error: " + e);
  117.         }
  118.  
  119.     }
  120.  
  121.     private String setNullVorne(float zahl, int laenge) {
  122.         String tmp = Float.toString(zahl);
  123.         int leng = tmp.length();
  124.         if (leng < laenge) {
  125.             for (; leng < laenge; leng++) {
  126.                 tmp = "0" + tmp;
  127.             }
  128.         }
  129.         return tmp;
  130.     }
  131.  
  132.  
  133.     public void editGebuehren(java.sql.Date dat) {
  134.  
  135.         /**
  136.          * Methode "editGebuehren()", die exakt die Funktionalitaet der PL/pgSQL-Prozedur von Punkt 6.3 bereitstellt.
  137.          * Beachten Sie bei der Erstellung dieser Methode folgende Punkte:
  138.          * - "editGebuehren()" soll die Funktion "f_gebuehr" aus Punkt 6.2 verwenden. Ansonsten duerfen keine weiteren
  139.          *   Benutzer-definierten Funktionen oder Prozeduren verwendet werden. Insbesonders darf nicht einfach die Prozedur
  140.          *   aus Punkt 6.3 aufgerufen werden.
  141.          * - Stellen Sie durch entsprechende Transaction Control Kommandos sicher, dass die Methode "editGebuehren()" entweder
  142.          *   die vorgesehene Aenderung erfolgreich durchfuehrt (und festschreibt) oder die Datenbank unveraendert laesst.
  143.          * - Vermeiden Sie in der Java-Methode die Verwendung von "*" in SELECT-Anweisungen. Listen Sie statt dessen in jeder
  144.          *   SELECT Anweisung explizit die Spalten auf, die Sie auslesen (oder veraendern) moechten, z.B.: In der Uni-DB wuerden
  145.          *   Sie "SELECT MatrNr, Name, Semester FROM Studenten" statt "SELECT * FROM Studenten" schreiben. Und wenn das Semester
  146.          *   in der Programmlogik keine Rolle spielt, wuerden Sie "SELECT MatrNr, Name FROM Studenten" schreiben.
  147.          */
  148.         ResultSet rs1 = null;
  149.         PreparedStatement stmt1 = null;
  150.  
  151.         ResultSet rs2 = null;
  152.         Statement stmt2 = null;
  153.         try {
  154.             float gebuehr = 0;
  155.             con.setAutoCommit(false);
  156.             String query = "select e.eid, e.entlehnkarte, ek.gebuehr from entlehnung e " +
  157.                     "left join entlehnkarte ek on (e.entlehnkarte = ek.nr) where e.adat = ?;";
  158.             stmt1 = con.prepareStatement(query);
  159.             stmt1.setDate(1, dat);
  160.             rs1 = stmt1.executeQuery();
  161.             System.out.println("\n\neditgebuehren\n\nvorher\neid\t|\tgebuehr");
  162.             while (rs1.next()) {
  163.                 System.out.println(rs1.getInt("eid")+"\t|\t"+rs1.getFloat("gebuehr"));
  164.                 gebuehr = rs1.getFloat("gebuehr");
  165.                 query = "select f_gebuehr(" + rs1.getInt("eid") + ");";
  166.                 stmt2 = con.createStatement();
  167.                 rs2 = stmt2.executeQuery(query);
  168.                 while (rs2.next()) {
  169.                     gebuehr += rs2.getFloat(1);
  170.                 }
  171.                 stmt2.executeUpdate("Update entlehnkarte Set gebuehr = " + gebuehr + " where nr = " + rs1.getInt("entlehnkarte") + ";");
  172.             }
  173.  
  174.  
  175.             con.commit();
  176.             rs1 = stmt1.executeQuery();
  177.             System.out.println("\n\nnachher\neid\t|\tgebuehr");
  178.             while (rs1.next()) {
  179.                 System.out.println(rs1.getInt("eid")+"\t|\t"+rs1.getFloat("gebuehr"));
  180.             }
  181.             con.setAutoCommit(true);
  182.         } catch (SQLException e) {
  183.             System.err.println("Rollback: " + e);
  184.             e.printStackTrace();
  185.             try {
  186.                 con.rollback();
  187.             } catch (SQLException e1) {
  188.                 System.err.println("Rollback failed!");
  189.             }
  190.         }
  191.  
  192.  
  193.     }
  194.  
  195.     public void resetGebuehren() {
  196.  
  197.         /**
  198.          * Methode "resetGebuehren()", die alle offenen Gebuehren aus der Tabelle "Entlehnkarte" auf "0.00" setzt.
  199.          * Die Methode soll auf der Konsole ausgeben, wieviele Datensaetze geaendert wurden.
  200.          */
  201.         PreparedStatement stmt = null;
  202.         int updatedRows = 0;
  203.  
  204.         try {
  205.             stmt = this.con.prepareStatement("UPDATE Entlehnkarte SET gebuehr = 0 WHERE gebuehr <> 0");
  206.             updatedRows = stmt.executeUpdate();
  207.         }
  208.         catch (SQLException e) {
  209.             e.printStackTrace();
  210.         }
  211.         System.out.println("\n\nresetGebuehren\nAnzahl aktualisierter Tupel: " + updatedRows);
  212.         try {
  213.             if (stmt != null)
  214.                 stmt.close();
  215.         } catch (SQLException e) {
  216.             e.printStackTrace();
  217.         }
  218.     }
  219.  
  220.     public void dbDisconnect() {
  221.         try {
  222.             con.close();
  223.         } catch (SQLException e) {
  224.             System.err.println("Couldn't close Connection!");
  225.             e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
  226.         }
  227.     }
  228.  
  229.     public void testEntlehnungsverwaltung() {
  230.  
  231.         /**
  232.          * Ueberlegen Sie sich eine sinnvolle Testabdeckung der Java-Klasse "Bestellungsverwaltung". Legen Sie dazu eine
  233.          * weitere Methode "testEntlehnungsverwaltung()" an, die die anderen Methoden aufruft und entsprechende Ausgaben erzeugt,
  234.          * so dass sich die erfolgreiche Durchfuehrung der Tests ueberpruefen laesst. Sie muessen in der Lage sein, diese Tests
  235.          * im Rahmen des Abgabegespraechs ablaufen zu lassen.
  236.          */
  237.         this.dbOutputKunden();
  238.         DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  239.         try {
  240.             long t = df.parse("2010-09-09").getTime();
  241.             this.editGebuehren(new Date(t));
  242.         } catch (ParseException e) {
  243.             System.err.println("Error: " + e);
  244.         }
  245.         this.resetGebuehren();
  246.     }
  247.  
  248.     public static void main(String[] args) {
  249.  
  250.         /**
  251.          * MAIN-Methode zum Aufrufen und Testen der erstellten
  252.          * Methoden.
  253.          */
  254.  
  255.         Entlehnungsverwaltung ev = new Entlehnungsverwaltung();
  256.  
  257.         ev.dbConnect();
  258.  
  259.         ev.testEntlehnungsverwaltung();
  260.  
  261.         ev.dbDisconnect();
  262.  
  263.     }
  264.  
  265. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement