Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Datenbanksysteme (VL 4.0, 181.186)
- * Laboruebungsteil, WS 2010/2011
- *
- * Beispiel 3
- */
- import java.sql.*;
- import java.text.DateFormat;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- public class Entlehnungsverwaltung {
- private static String driver = "jdbc:postgresql";
- private static String server = "localhost";
- private static String port = "5432";
- private static String db = "u0925144";
- private static String user = "u0925144";
- private static String password = "derhase123";
- private Connection con = null;
- public void dbConnect() {
- try {
- Class.forName("org.postgresql.Driver");
- } catch (ClassNotFoundException e) {
- System.err.println("Couldn't find driver class:");
- e.printStackTrace();
- }
- try {
- con = DriverManager.getConnection(driver + "://" + server + ":" + port + "/" + db, user, password);
- } catch (SQLException e) {
- System.out.println("Couldn't connect: print out a stack trace and exit.");
- e.printStackTrace();
- System.exit(1);
- }
- if (con != null)
- System.out.println("Hooray! We connected to the database!");
- else
- System.out.println("We should never get here.");
- }
- public void dbOutputKunden() {
- /**
- * Methode "dbOutputKunden()", die alle Entlehnkartenbesitzer (Entlehnkartennummer, Vor- und Nachname,
- * offene Gebuehren auf der Entlehnkarte) ausgibt, die Anzahl aller bisherigen Entlehnungen sowie die
- * Gesamtsumme der Gebuehren, die durch alle Entlehnungen dieses Kunden bisher entstanden sind. Vergessen
- * Sie nicht auf jene Kunden, fuer die noch keine Entlehnungen erfasst sind! Verwenden Sie dabei die
- * Funktion "f_gebuehr", die Sie in Punkt 6.2 erstellt haben. Die Ausgabe soll als Comma-Separated List
- * erfolgen, d.h.: eine Bildschirm-Zeile pro Zeile der Tabelle; die Spaltenwerte werden einfach nacheinander
- * ausgegeben und mittels "," getrennt.
- */
- ResultSet rs1 = null;
- ResultSet rs2 = null;
- Statement stmt1 = null;
- Statement stmt2 = null;
- String getEidQuery = "Select p.pid, p.vname, p.nname, ek.nr, ek.gebuehr, eg.eid from Entlehnung eg " +
- "inner join Entlehnkarte ek on (eg.Entlehnkarte=ek.nr) " +
- "inner join Person p on (p.pid=ek.person)" +
- "order by p.pid;";
- int pid_new = 0;
- int pid_old = -1;
- String vorname = "";
- String nachname = "";
- float gebuehr = 0;
- int eid;
- int anz = 0;
- int nr = -1;
- String ausgabe = "";
- float summe = 0;
- try {
- stmt1 = con.createStatement();
- rs1 = stmt1.executeQuery(getEidQuery);
- System.out.println("\ndbOutPutKunde\npid\t|\tvorname\t\t|\tnachname\t|\tKartennr.\t|\tGebuehr\t|\tEntl.\t|\tKosten");
- System.out.println("----------------------------------------------------------------------------------------");
- while (rs1.next()) {
- pid_new = rs1.getInt("pid");
- eid = rs1.getInt("eid");
- stmt2 = con.createStatement();
- rs2 = stmt2.executeQuery("select f_gebuehr(" + eid + ");");
- anz++;
- if (pid_new == pid_old || pid_old == -1) {
- } else {
- 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;
- summe = 0;
- anz = 0;
- System.out.println(ausgabe);
- ausgabe = "";
- }
- while (rs2.next()) {
- summe += rs2.getFloat(1);
- }
- vorname = rs1.getString("vname");
- nachname = rs1.getString("nname");
- gebuehr = rs1.getFloat("gebuehr");
- nr = rs1.getInt("nr");
- pid_old = pid_new;
- }
- 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;
- System.out.println(ausgabe);
- } catch (SQLException e) {
- System.err.println("Error: " + e);
- }
- }
- private String setNullVorne(float zahl, int laenge) {
- String tmp = Float.toString(zahl);
- int leng = tmp.length();
- if (leng < laenge) {
- for (; leng < laenge; leng++) {
- tmp = "0" + tmp;
- }
- }
- return tmp;
- }
- public void editGebuehren(java.sql.Date dat) {
- /**
- * Methode "editGebuehren()", die exakt die Funktionalitaet der PL/pgSQL-Prozedur von Punkt 6.3 bereitstellt.
- * Beachten Sie bei der Erstellung dieser Methode folgende Punkte:
- * - "editGebuehren()" soll die Funktion "f_gebuehr" aus Punkt 6.2 verwenden. Ansonsten duerfen keine weiteren
- * Benutzer-definierten Funktionen oder Prozeduren verwendet werden. Insbesonders darf nicht einfach die Prozedur
- * aus Punkt 6.3 aufgerufen werden.
- * - Stellen Sie durch entsprechende Transaction Control Kommandos sicher, dass die Methode "editGebuehren()" entweder
- * die vorgesehene Aenderung erfolgreich durchfuehrt (und festschreibt) oder die Datenbank unveraendert laesst.
- * - Vermeiden Sie in der Java-Methode die Verwendung von "*" in SELECT-Anweisungen. Listen Sie statt dessen in jeder
- * SELECT Anweisung explizit die Spalten auf, die Sie auslesen (oder veraendern) moechten, z.B.: In der Uni-DB wuerden
- * Sie "SELECT MatrNr, Name, Semester FROM Studenten" statt "SELECT * FROM Studenten" schreiben. Und wenn das Semester
- * in der Programmlogik keine Rolle spielt, wuerden Sie "SELECT MatrNr, Name FROM Studenten" schreiben.
- */
- ResultSet rs1 = null;
- PreparedStatement stmt1 = null;
- ResultSet rs2 = null;
- Statement stmt2 = null;
- try {
- float gebuehr = 0;
- con.setAutoCommit(false);
- String query = "select e.eid, e.entlehnkarte, ek.gebuehr from entlehnung e " +
- "left join entlehnkarte ek on (e.entlehnkarte = ek.nr) where e.adat = ?;";
- stmt1 = con.prepareStatement(query);
- stmt1.setDate(1, dat);
- rs1 = stmt1.executeQuery();
- System.out.println("\n\neditgebuehren\n\nvorher\neid\t|\tgebuehr");
- while (rs1.next()) {
- System.out.println(rs1.getInt("eid")+"\t|\t"+rs1.getFloat("gebuehr"));
- gebuehr = rs1.getFloat("gebuehr");
- query = "select f_gebuehr(" + rs1.getInt("eid") + ");";
- stmt2 = con.createStatement();
- rs2 = stmt2.executeQuery(query);
- while (rs2.next()) {
- gebuehr += rs2.getFloat(1);
- }
- stmt2.executeUpdate("Update entlehnkarte Set gebuehr = " + gebuehr + " where nr = " + rs1.getInt("entlehnkarte") + ";");
- }
- con.commit();
- rs1 = stmt1.executeQuery();
- System.out.println("\n\nnachher\neid\t|\tgebuehr");
- while (rs1.next()) {
- System.out.println(rs1.getInt("eid")+"\t|\t"+rs1.getFloat("gebuehr"));
- }
- con.setAutoCommit(true);
- } catch (SQLException e) {
- System.err.println("Rollback: " + e);
- e.printStackTrace();
- try {
- con.rollback();
- } catch (SQLException e1) {
- System.err.println("Rollback failed!");
- }
- }
- }
- public void resetGebuehren() {
- /**
- * Methode "resetGebuehren()", die alle offenen Gebuehren aus der Tabelle "Entlehnkarte" auf "0.00" setzt.
- * Die Methode soll auf der Konsole ausgeben, wieviele Datensaetze geaendert wurden.
- */
- PreparedStatement stmt = null;
- int updatedRows = 0;
- try {
- stmt = this.con.prepareStatement("UPDATE Entlehnkarte SET gebuehr = 0 WHERE gebuehr <> 0");
- updatedRows = stmt.executeUpdate();
- }
- catch (SQLException e) {
- e.printStackTrace();
- }
- System.out.println("\n\nresetGebuehren\nAnzahl aktualisierter Tupel: " + updatedRows);
- try {
- if (stmt != null)
- stmt.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- public void dbDisconnect() {
- try {
- con.close();
- } catch (SQLException e) {
- System.err.println("Couldn't close Connection!");
- e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
- }
- }
- public void testEntlehnungsverwaltung() {
- /**
- * Ueberlegen Sie sich eine sinnvolle Testabdeckung der Java-Klasse "Bestellungsverwaltung". Legen Sie dazu eine
- * weitere Methode "testEntlehnungsverwaltung()" an, die die anderen Methoden aufruft und entsprechende Ausgaben erzeugt,
- * so dass sich die erfolgreiche Durchfuehrung der Tests ueberpruefen laesst. Sie muessen in der Lage sein, diese Tests
- * im Rahmen des Abgabegespraechs ablaufen zu lassen.
- */
- this.dbOutputKunden();
- DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
- try {
- long t = df.parse("2010-09-09").getTime();
- this.editGebuehren(new Date(t));
- } catch (ParseException e) {
- System.err.println("Error: " + e);
- }
- this.resetGebuehren();
- }
- public static void main(String[] args) {
- /**
- * MAIN-Methode zum Aufrufen und Testen der erstellten
- * Methoden.
- */
- Entlehnungsverwaltung ev = new Entlehnungsverwaltung();
- ev.dbConnect();
- ev.testEntlehnungsverwaltung();
- ev.dbDisconnect();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement