Conference Management System

Page 1

ΠΡΟΑΙΡΕΤΙΚΗ ΕΡΓΑΣΙΑ-Ε#24 ΣΧΕΔΙΑΣΜΟΣ ΜΙΑΣ ΒΔ ΟΡΓΑΝΩΣΗΣ ΕΝΟΣ ΣΥΝΕΔΡΙΟΥ

Βάσεις Δεδοµένων 2012-2013 Overview Η βάση που σχεδιάσαµε αφορά ένα επιστηµονικό συνέδριο όπου οι φοιτητές παρουσιάζουν τις εργασίες τους.Σαν πρότυπο µας είχαµε ένα συνέδριο όπως το ΣΦΗΜΜΥ. Παρακάτω περιγράφονται αναλυτικά οι οντότητες, τα γνωρίσµατά τους και οι συσχετίσεις µεταξύ τους:

ΦΑΣΗ Α

8o Εξάµηνο

Mέλη:

Μάριος Μπίκος-7323 Δηµήτρης Σκρεπετός-7380 E-Mails: ece7323@upnet.gr, ece7380@upnet.gr

Materials gliffy.com àERD MySQLWorkBenchà Λογικό Μοντέλο MySQL Community Server MySQL ConnectorJ Java+JDBCàΕφαρµογή

Milestones 08/04/13 (2 ώρες)

Οντότητες Ο volunteer έχει: 1. FirstName (var char[20]) 2. LastName (var char[20]) 3. Address (var char[20]) 4. PhoneNumber (string) 5. Position (αν είναι µέλος ή υπεύθυνος) (var char[20]) 6. Code (unsigned int, prim key) Έχει τις εξής υποκλάσεις οι οποίες είναι αµοιβαία αποκλειόµενες: 1. Volunteer SE (βοηθάει σε µία συνεδρία) και συνδέεται µε τουλάχιστον µία session στην οποία βοηθάει (σχέση oversees). 2. Volunteer FR (χορηγοί) και συνδέεται µε τουλάχιστον έναν ή περισσότερους sponsors µε τους οποίους επικοινωνεί (σχέση liaison with). Πιθανά ερωτήµατα προς τη βάση, έτσι ώστε να βρει ο χρήστης µέσω της εφαρµογής τα εξής: 1. Όλους τους volunteer. 2. Τους volunteer FR ή SE (µέλη ή υπεύθυνοι ή και τα δύο). 3. Τους volunteer που συνδέονται µε έναν sponsor. 4. Τους volunteer που συνδέονται µε µία session.

2012-2013

1η συνάντηση των µελών της οµάδας και καθορισµός στόχων εφαρµογής.Έρευνα για εφαρµογές διαχείρισης συνεδρίων και διαδικασιών συνεδρίων.Συνοπτική περιγραφή µικρόκοσµου+ERD 13/04/13 (3 ώρες) 2η Συνάντηση των µελών της οµάδας.Αναλυτική περιγραφή του µικρόκοσµου.Αρκετές αλλαγές και νέο ERD. 15/05/13 - 16/05/13 (20 ώρες) 3η Συνάντηση των µελών της οµάδας.Δηµιουργία Λογικού µοντέλου µέσω MySQL Workbench και δηµιουργία εφαρµογής σε Java µε JDBC API.

1


Ο scholar έχει: 1. FirstName (var char[20]) 2. LastName (var char[20]) 3. Address (var char[20]) 4. PhoneNumber (var char[20]) 5. ScientificField (var char[20]) 6. Organization (var char[20]). 7. Code (unsigned int, prim key) και τις εξής σχέσεις: 1. Συνδέεται µε το πολύ ένα hotel στο οποίο διαµένει (σχέση stays at). Έχει τις εξής υποκλάσεις: 1. Scientific committee member (εάν συµµετέχει στην οργανωτική επιτροπή του συνεδρίου) και έχει θέση (µέλος ή πρόεδρος). Συνδέεται µε ακριβώς µία session την οποία εποπτεύει (σχέση is chair of) 1-1. 2. Presenter (εάν είναι οµιλητής του συνεδρίου). Συνδέεται µε τουλάχιστον µία presentation την οποία εκπορεύει στα πλαίσια µίας session (σχέση presents). Πιθανά ερωτήµατα προς τη βάση, έτσι ώστε να βρει ο χρήστης µέσω της εφαρµογής τα εξής: 1. Τους επιστήµονες ενός συνεδρίου. 2. Τα µέλη της επιστηµονικής επιτροπής ενός συνεδρίου. 3. Τους οµιλητές ενός συνεδρίου. 4. Το ξενοδοχείο διαµονής των επιστηµόνων ενός συνεδρίου. 5. Την συνεδρία που εποπτεύει ένα µέλος της επιστηµονικής επιτροπής. 6. Την οµιλία που εκπορεύει ένας οµιλητής.

Το hotel έχει: 1. Name (var char[20]) 2. Address (var char[20]) 3. PhoneNumber (var char[20]) 4. Website (var char[20]) 5. Category (var char[20]) 6. Code (unsigned int, prim key). Πιθανά ερωτήµατα προς τη βάση, έτσι ώστε να βρει ο χρήστης µέσω της εφαρµογής τα εξής: 1. Τα hotel του συνεδρίου (γνωρίσµατα ή/και αριθµό). 2. Τον αριθµό των φιλοξενούµενων κάθε hotel. 3. Τα hotels µίας κατηγορίας.

Η session έχει: 1. ScientificField (var char[20]) 2. Date (date) 3. Start time(time) 4. End time(time) 5. Code (unsigned int, prim key) και τις εξής συσχετίσεις: 1. εποπτεύεται από ακριβώς ένα scientific committee member (σχέση supervises).

2012-2013

2


2. εποπτεύεται από τουλάχιστον έναν volunteer SE (σχέση helps). 3.Σε κάθε HALL διεξάγονται 1 ή περισσότερα sessions Πιθανά ερωτήµατα προς τη βάση, έτσι ώστε να βρει ο χρήστης µέσω της εφαρµογής τα εξής: 1. Τις session του συνεδρίου (γνωρίσµατα ή/και αριθµό). 2. Τις speechs µίας session. 3. Τις sessions µίας ηµεροµηνίας. 4. Το εποπτεύον scientific committee member. 5. Τους εποπτεύοντες volunteer SE.

Η presentation έχει τα εξής γνωρίσµατα: 1. StartTime (time) 2. EndTime (time) 3. Title (var char[20]) 4. Code (unsigned int, prim key) και τις εξής σχέσεις: 1. Την κάνουν το πολύ δύο performer στο πλαίσιο ακριβώς µίας session. Πιθανά ερωτήµατα προς τη βάση, έτσι ώστε να βρει ο χρήστης µέσω της εφαρµογής τα εξής: 1. Την ηµεροµηνία, την ώρα έναρξης, την ώρα λήξης και το θέµα µίας speech. 2. Τις presentations µίας date. 3. Τον presenter µίας presentation. 4. Την session µίας presentation. 5. Τους volunteer SE της συνεδρίας µίας presentation. 6. Το scientific committee meber της session της presentation.

Η hall έχει: 1. Name (var char[20]) 2. Capacity (var char[20]) 3. RentPrice (double) 3. Code (unsigned int, prim key) και τις εξής σχέσεις: 1. Σε κάθε αίθουσα διεξάγονται sessions (takes place at). Πιθανά ερωτήµατα προς τη βάση, έτσι ώστε να βρει ο χρήστης µέσω της εφαρµογής τα εξής: 1. Τις halls του συνεδρίου. 2. Τις halls µίας session. 3. Την χωρητικότητα των halls. 4. Το ενοίκιο των halls.

Ο sponsor έχει: 1. Name (var char[20]) 2. Address (var char[20]) 3. Website (var char[20]) 4. Email (var char[20]) 5. PhoneNumber (var char[20]) 2012-2013

3


6. Sponsorship(double) 7. Code (unsigned int, prim key) Έχει τις εξής σχέσεις: 1. Υπάρχει ένας volunteer FR υπεύθυνος για την επικοινωνία µε τον sponsor. Πιθανά ερωτήµατα προς τη βάση, έτσι ώστε να βρει ο χρήστης µέσω της εφαρµογής τα εξής: 1. Τους sponsors ενός συνεδρίου (όλα τα γνωρίσµατα, ή τον αριθµό). 2. Την συνολική τιµή χορηγίας. 3. Τον volunteer FR κάθε sponsor.

Όλα τα γνωρίσµατα όλων των οντοτήτων είναι απλά, µονότιµα και αποθηκευόµενα. Συνοψίζοντας, έχουµε τις παρακάτω οντότητες: 1 Volunteer 2 Volunteer FR 3 Volunteer SE 4 Scholar 5 Scientific Committee Member 6 Presenter 7 Hotel 8 Session 9 Presentation 10 Hall 11 Sponsor Και τις παρακάτω συσχετίσεις: 1 oversees (M-N µεταξύ volunteer SE και session) Kάθε SE Volunteer µπορεί να “oversees” από 1 εως 3 sessions του συνεδρίου. Κάθε session του συνεδρίου γίνεται “oversees” από 1 έως 5 SE Volunteers 2 liaison with (1-N µεταξύ volunteer FR και sponsor) Κάθε FR Volunteer µπορεί να είναι liaison µε 1 έως 10 sponsors Κάθε sponsor έχει για liaison µόνο 1 FR Volunteer 3 stays at (1-N µεταξύ scholar και hotel) Kάθε Scholar µπορεί να stays at σε 1 µόνο ξενοδοχείο Σε κάθε ξενοδοχείο µπορεί να stays at 1 έως 30 Scholars 4 is chair of (1-1 µεταξύ scientific committee member και session) Κάθε Scientific Committee Member is chair of 1 µόνο session Κάθε session έχει σαν chair µόνο 1 Scientific Committee Member 5 presents (1-Μ-Ν µεταξύ session και presenter και presentation) Σε κάθε session, κάθε presentation µπορεί να γίνει από 1 έως 2 presenters Κάθε presenter,σε κάθε session µπορεί να κάνει από 1 έως 2 παρουσιάσεις Κάθε presenter,µπορεί να κάνει presentation σε 1 µόνο session 6 takes place at (1-N µεταξύ session και hall) Kάθε session takes place at ένα µόνο hall. Κάθε hall φιλοξενεί από 1 έως 10 sessions. Επιπλέον περιορισµοί: 1 Σε µία hall γίνεται µόνο µία session σε κάθε χρονική στιγµή. 2 Δεν µπορούν δύο sessions να γίνονται ταυτόχρονα. Ένας presenter δεν µπορεί να παρουσιάζει ταυτόχρονα δύο οµιλίες.

2012-2013

4


Το εκτεταµένο µοντέλο οντοτήτων-συσχετίσεων (EERD):

2012-2013

5


Λογικό Σχεσιακό Μοντέλο:

2012-2013

6


ΦΑΣΗ Β΄ Αξίζει να σηµειώσουµε ότι δώσαµε έµφαση σε περιορισµούς αναφορικής ακεραιότητας µε τις εντολές ON DELETE SET NULL, ON UPDATE CASCADE και αντίστοιχα σε άλλες περιπτώσεις προσαρµόζαµε κατάλληλα τις εντολές. Οι εντολές SQL για την δηµιουργία της βάσης δεδοµένων είναι:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; USE `mydb` ;

-- ------------------------------------------------------ Table `mydb`.`VOLUNTEER` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `mydb`.`VOLUNTEER` ( `code` INT NOT NULL , `FirstName` VARCHAR(45) NULL , `LastName` VARCHAR(45) NULL , `Address` VARCHAR(45) NULL , `PhoneNumber` VARCHAR(45) NULL , `Position` VARCHAR(45) NULL , PRIMARY KEY (`code`) ) ENGINE = InnoDB;

-- ------------------------------------------------------ Table `mydb`.`FR_VOLUNTEER` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `mydb`.`FR_VOLUNTEER` ( `VOLUNTEER_code` INT NOT NULL , INDEX `fk_FR VOLUNTEER_VOLUNTEER1_idx` (`VOLUNTEER_code` ASC) , PRIMARY KEY (`VOLUNTEER_code`) ,

2012-2013

7


CONSTRAINT `fk_FR VOLUNTEER_VOLUNTEER1` FOREIGN KEY (`VOLUNTEER_code` ) REFERENCES `mydb`.`VOLUNTEER` (`code` ) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB;

-- ------------------------------------------------------ Table `mydb`.`SPONSOR` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `mydb`.`SPONSOR` ( `code` INT NOT NULL , `Name` VARCHAR(45) NULL , `Address` VARCHAR(45) NULL , `Website` VARCHAR(45) NULL , `Email` VARCHAR(45) NULL , `PhoneNumber` VARCHAR(45) NULL , `Sponsorship` DOUBLE NULL , `FR_VOLUNTEER_VOLUNTEER_code` INT NOT NULL , PRIMARY KEY (`code`) , INDEX `fk_SPONSOR_FR VOLUNTEER1_idx` (`FR_VOLUNTEER_VOLUNTEER_code` ASC) , CONSTRAINT `fk_SPONSOR_FR VOLUNTEER1` FOREIGN KEY (`FR_VOLUNTEER_VOLUNTEER_code` ) REFERENCES `mydb`.`FR_VOLUNTEER` (`VOLUNTEER_code` ) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE = InnoDB;

-- ------------------------------------------------------ Table `mydb`.`HALL` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `mydb`.`HALL` (

2012-2013

8


`code` INT NOT NULL , `Name` VARCHAR(45) NULL , `Capacity` INT(11) NULL , `RentPrice` DOUBLE NULL , PRIMARY KEY (`code`) ) ENGINE = InnoDB;

-- ------------------------------------------------------ Table `mydb`.`PRESENTATION` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `mydb`.`PRESENTATION` ( `code` INT NOT NULL , `Date` DATE NULL , `StartTime` TIME NULL , `EndTime` TIME NULL , `Title` VARCHAR(45) NULL , PRIMARY KEY (`code`) ) ENGINE = InnoDB;

-- ------------------------------------------------------ Table `mydb`.`HOTEL` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `mydb`.`HOTEL` ( `code` INT NOT NULL , `Name` VARCHAR(45) NULL , `Address` VARCHAR(45) NULL , `PhoneNumber` VARCHAR(45) NULL , `Website` VARCHAR(45) NULL , `Category` VARCHAR(45) NULL , PRIMARY KEY (`code`) ) ENGINE = InnoDB;

2012-2013

9


-- ------------------------------------------------------ Table `mydb`.`SCHOLAR` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `mydb`.`SCHOLAR` ( `code` INT NOT NULL , `FirstName` VARCHAR(45) NULL , `LastName` VARCHAR(45) NULL , `Address` VARCHAR(45) NULL , `PhoneNumber` VARCHAR(45) NULL , `ScientificField` VARCHAR(45) NULL , `Organization` VARCHAR(45) NULL , `HOTEL_code` INT NULL , PRIMARY KEY (`code`) , INDEX `fk_SCHOLAR_HOTEL1_idx` (`HOTEL_code` ASC) , CONSTRAINT `fk_SCHOLAR_HOTEL1` FOREIGN KEY (`HOTEL_code` ) REFERENCES `mydb`.`HOTEL` (`code` ) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE = InnoDB;

-- ------------------------------------------------------ Table `mydb`.`SCIENTIFIC_COMMITTEE_MEMBER` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `mydb`.`SCIENTIFIC_COMMITTEE_MEMBER` ( `SCHOLAR_code` INT NOT NULL , INDEX `fk_SCIENTIFIC COMMITTEE MEMBER_SCHOLAR1_idx` (`SCHOLAR_code` ASC) , PRIMARY KEY (`SCHOLAR_code`) , CONSTRAINT `fk_SCIENTIFIC COMMITTEE MEMBER_SCHOLAR1` FOREIGN KEY (`SCHOLAR_code` ) REFERENCES `mydb`.`SCHOLAR` (`code` ) ON DELETE CASCADE

2012-2013

10


ON UPDATE CASCADE) ENGINE = InnoDB;

-- ------------------------------------------------------ Table `mydb`.`SESSION` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `mydb`.`SESSION` ( `code` INT NOT NULL , `ScientificField` VARCHAR(45) NULL , `Date` DATE NULL , `StartTime` TIME NULL , `EndTime` TIME NULL , `HALL_code` INT NOT NULL , `SCIENTIFIC_COMMITTEE_MEMBER_SCHOLAR_code` INT NULL , PRIMARY KEY (`code`) , INDEX `fk_SESSION_HALL1_idx` (`HALL_code` ASC) , INDEX `fk_SESSION_SCIENTIFIC COMMITTEE MEMBER1_idx` (`SCIENTIFIC_COMMITTEE_MEMBER_SCHOLAR_code` ASC) , CONSTRAINT `fk_SESSION_HALL1` FOREIGN KEY (`HALL_code` ) REFERENCES `mydb`.`HALL` (`code` ) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_SESSION_SCIENTIFIC COMMITTEE MEMBER1` FOREIGN KEY (`SCIENTIFIC_COMMITTEE_MEMBER_SCHOLAR_code` ) REFERENCES `mydb`.`SCIENTIFIC_COMMITTEE_MEMBER` (`SCHOLAR_code` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;

-- ------------------------------------------------------ Table `mydb`.`PRESENTER` -- -----------------------------------------------------

2012-2013

11


CREATE TABLE IF NOT EXISTS `mydb`.`PRESENTER` ( `SCHOLAR_code` INT NOT NULL , INDEX `fk_PRESENTER_SCHOLAR1_idx` (`SCHOLAR_code` ASC) , PRIMARY KEY (`SCHOLAR_code`) , CONSTRAINT `fk_PRESENTER_SCHOLAR1` FOREIGN KEY (`SCHOLAR_code` ) REFERENCES `mydb`.`SCHOLAR` (`code` ) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB;

-- ------------------------------------------------------ Table `mydb`.`SE_VOLUNTEER` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `mydb`.`SE_VOLUNTEER` ( `VOLUNTEER_code` INT NOT NULL , INDEX `fk_SE VOLUNTEER_VOLUNTEER_idx` (`VOLUNTEER_code` ASC) , PRIMARY KEY (`VOLUNTEER_code`) , CONSTRAINT `fk_SE VOLUNTEER_VOLUNTEER` FOREIGN KEY (`VOLUNTEER_code` ) REFERENCES `mydb`.`VOLUNTEER` (`code` ) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB;

-- ------------------------------------------------------ Table `mydb`.`SESSION_has_SE_VOLUNTEER` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `mydb`.`SESSION_has_SE_VOLUNTEER` ( `SESSION_code` INT NOT NULL , `SE_VOLUNTEER_VOLUNTEER_code` INT NOT NULL , PRIMARY KEY (`SESSION_code`, `SE_VOLUNTEER_VOLUNTEER_code`) ,

2012-2013

12


INDEX `fk_SESSION_has_SE VOLUNTEER_SE VOLUNTEER1_idx` (`SE_VOLUNTEER_VOLUNTEER_code` ASC) , INDEX `fk_SESSION_has_SE VOLUNTEER_SESSION1_idx` (`SESSION_code` ASC) , CONSTRAINT `fk_SESSION_has_SE VOLUNTEER_SESSION1` FOREIGN KEY (`SESSION_code` ) REFERENCES `mydb`.`SESSION` (`code` ) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_SESSION_has_SE VOLUNTEER_SE VOLUNTEER1` FOREIGN KEY (`SE_VOLUNTEER_VOLUNTEER_code` ) REFERENCES `mydb`.`SE_VOLUNTEER` (`VOLUNTEER_code` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;

-- ------------------------------------------------------ Table `mydb`.`PRESENTATION_has_PRESENTER` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `mydb`.`PRESENTATION_has_PRESENTER` ( `PRESENTATION_code` INT NOT NULL , `PRESENTER_SCHOLAR_code` INT NOT NULL , `SESSION_code` INT NOT NULL , PRIMARY KEY (`PRESENTATION_code`, `PRESENTER_SCHOLAR_code`) , INDEX `fk_PRESENTATION_has_PRESENTER_PRESENTER1_idx` (`PRESENTER_SCHOLAR_code` ASC) , INDEX `fk_PRESENTATION_has_PRESENTER_PRESENTATION1_idx` (`PRESENTATION_code` ASC) , INDEX `fk_PRESENTATION_has_PRESENTER_SESSION1_idx` (`SESSION_code` ASC) , CONSTRAINT `fk_PRESENTATION_has_PRESENTER_PRESENTATION1` FOREIGN KEY (`PRESENTATION_code` ) REFERENCES `mydb`.`PRESENTATION` (`code` ) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_PRESENTATION_has_PRESENTER_PRESENTER1` FOREIGN KEY (`PRESENTER_SCHOLAR_code` ) REFERENCES `mydb`.`PRESENTER` (`SCHOLAR_code` )

2012-2013

13


ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_PRESENTATION_has_PRESENTER_SESSION1` FOREIGN KEY (`SESSION_code` ) REFERENCES `mydb`.`SESSION` (`code` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;

USE `mydb` ;

SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

2012-2013

14


Φάση Γ Περιβάλλον ανάπτυξης της εφαρμογής: Γλώσσα προγραμματισμού, εργαλεία ανάπτυξης και σύνδεσης βάσεων δεδομένων

Για την υλοποίηση της εφαρμογής χρησιμοποιήσαμε την γλώσσα προγραμματισμού Java για τους εξής λόγους: 1. 2. 3.

Την γνωρίζουμε αρκετά καλά, Έχει έτοιμα αρκετά απαραίτητα και χρήσιμα πράγματα για εργασίες με βάσεις δεδομένων, και Τέλος είναι υψηλού επιπέδου κάτι το οποίο μας επέτρεψε να δημιουργήσουμε την εφαρμογή χωρίς να ανησυχούμε για τυχόν ιδιοτροπίες της γλώσσας Για να δημιουργήσουμε την βάση δεδομένων από το αρχείο .sql που παρήχθη από το MySQL Workbench χρησιμοποιήσαμε το MySQL Commynity Server 5.6.11 (http://dev.mysql.com/downloads/mysql/). Για να συνδέσουμε την Java με την MySQL χρησιμοποιήσαμε το MySQL (http://dev.mysql.com/downloads/connector/j/).

Οι κλάσεις του Java Api που χρησιμοποιήσαμε είναι οι εξής: • • • • • •

java.sql.Connection: Συνδέει την MySQL με την Java java.sql.Statement: Επιτρέπει την εκτέλεση ερωτημάτων στην MySQL java.sql.DriverManager: Διαχειρίζεται την σύνδεση της MySQL με την Java java.sql.ResultSet: Αναπαριστά το αποτέλεσμα της ερώτησης SQL που κάναμε java.sql.ResultSetMetaData: Μετατρέπει το αποτέλεσμα σε αναγνώσιμη μορφή java.sql.SQLException: Απαραίτητο για την διαχείριση εξαιρέσεων Τις κλάσεις αυτές τις κάναμε import στην αρχή του κώδικά μας.

Εγκατάσταση του MySQL Community Server και MySQL Community J

Όπως προειπώθηκε, επιλέξαμε να δημιουργήσουμε την εφαρμογή στην γλώσσα προγραμματισμού Java στο περιβάλλον Mac OS X αξιοποιώντας το API του JDBC. Για τον λόγο αυτό έπρεπε να εγκαταστήσουμε το MySQL Community Server (για το ανέβασμα της βάσης δεδομένων) και το MySQL Connector J (για την σύνδεση της βάσης με την Java. Είναι ένα jar αρχείο το οποίο το τοποθετούμε στον φάκελο του project της εφαρμογής και το συνδέουμε στο build path).

Μετά την εγκατάσταση του MySQL Community Server ανοίγουμε το Terminal και εισάγουμε τα εξής:

PATH=$PATH:/usr/local/mysql/bin mysql -­‐h localhost -­‐u root USE mysql;

2012-2013

15


create user ‘admin’@’localhost’ identified by ‘admin’; grant select, insert, update, delete, create, drop, references, execute on *.*to ‘admin’@’localhost’; exit; Έπειτα κάνουμε τα εξής: Μετακινόμαστε στον φάκελο που είναι το αρχείο db.sql (πχ desktop). Στη συνέχεια: mysql -­‐h localhost -­‐u admin -­‐p Δίνουμε κωδικό admin Και έπειτα: create database db; source db.sql; Και για να είμαστε σίγουροι ότι όλα πήγαν καλά τυπώνουμε τους πίνακες: show tables;

Ερωτήσεις SQL μέσω Java

SELECT μέσω Java κάνουμε μέσω της εξής πρότασης:

resultSet = statement.executeQuery(“(SELECT * FROM SE_VOLUNTEER WHERE Position='Chair')”);

Η πρόταση αυτή της Java εκτελεί την εξής ερώτηση της SQL:

SELECT * FROM SE_VOLUNTEER WHERE Position='Chair';

Η πρόταση αυτή επιλέγει τον Υπεύθυνο (Chair) των SE Volunteers.

Οι ερωτήσεις SQL μέσω Java γίνονται όπως και μέσω phpMyAdmin, μόνο που βάζουμε ένα statement.executeQuery (για SELECT) και την ερώτηση SQL μέσα σε (“ “).

Η επεξεργασία των αποτελεσμάτων της ερώτησης γίνεται ως εξής:

metaData = resultSet.getMetaData(); // Βάζουμε στο metaData το αποτέλεσμα της ερώτησης numberOfColumns = metaData.getColumnCount(); // Τυπώνουμε μία γραμμή για τα ορίσματα

2012-2013

16


for(int i=1; i <= numberOfColumns; i++)

System.out.printf("%-­‐15s\t",metaData.getColumnName(i));

System.out.println();

while( resultSet.next() ) {

for(int i=1; i <=numberOfColumns; i++)

System.out.println();

System.out.printf("%-­‐15s\t”,resultSet.getObject(i));

} Τυπώνει το αποτέλεσμα της ερώτησης. Η χρησιμοποίηση μεταβλητών του προγράμματος στην SQL γίνεται όπως στο παρακάτω παράδειγμα, το οποίο βρίσκει όλες τις παρουσιάσεις σε μία ημερομηνία που είναι στο String str : resultSet = statement.executeQuery("(SELECT COUNT(*) FROM PRESENTATION WHERE PRESENTATION.Date = "+str+")"); Η χρησιμοποιήση μεταβλητών του προγράμματος μέσα σε ερωτήσεις SQL είναι εύκολη: απλά κάνουμε ένωση αλφαριθμητικών.

INSERT μέσω Java κάνουμε με την εξής πρόταση:

statement.executeUpdate("INSERT INTO FR_VOLUNTEER ( VOLUNTEER_code) VALUES ("+volunteer_code+") "); Το INSERT ακολουθεί την ίδια λογική με το SELECT, αλλά αντί για executeQuery έχουμε executeUpdate. Επίσης, παραμένει ίδιος ο χειρισμός μεταβλητών του προγράμματος.

Σενάρια Χρήσης 1. 2. 3.

Η εφαρμογή που αναπτύξαμε δίνει στους χρήστες τις εξής δυνατότητες: Εισαγωγή προκαθορισμένων δεδομένων που διαμορφώνουν ένα μικρό συνέδριο Διάφορα SELECT για πληθώρα δεδομένων, όπως π.χ. βρες τον αριθμό φιλοξενούμενων κάθε ξενοδοχείου Εισαγωγή νέων δεδομένων, με ιδιαίτερη προσοχή σε περιορισμούς αναφορικής ακεραιότητας

Περιορισμοί

Σχετικά με τους περιορισμούς αναφορικής ακεραιότητας προσέξαμε πάρα πολύ κατά την φάση εισαγωγής δεδομένων, όπου υποχρεώνουμε τον χρήστη εάν επιθυμεί να εισάγει κάτι του οποίου το ξένο κλειδί δεν δείχνει σε κάποιο στιγμιότυπο της οντότητας, να το εισάγει (κάτι τέτοιο επιβαλλόταν και από την ολική συμμετοχή των περισσότερων οντοτήτων στις σχέσεις).

2012-2013

17


Επίσης, έχουμε διασφαλίσει κατά την φάση δημιουργίας των πινάκων ότι αν διαγραφεί κάποιο στιγμιότυπο τότε θα διαγραφούν και όλα τα άλλα που δείχνουν σε αυτό (μιας και είχαμε σχεδόν παντού ολικές εξαρτήσεις). Δεν υλοποιήσαμε πολλούς σημασιολογικούς περιορισμούς (πχ η ώρα έναρξης ενός συνεδρίου να είναι πριν την ώρα λήξης κτλπ) εκτός από τον έλεγχο εάν υπάρχει ήδη κάποιος υπεύθυνος των εθελοντών μίας ομάδας, λόγω έλλειψης χρόνου. Υλοποιήσαμε τους περισσότερους δομικούς περιορισμούς, εκτός από δύο που σχετίζουν εθελοντές με συνεδρίες και συνεδρίες με αίθουσες, λόγω έλλειψης χρόνου.

Μενού Εφαρμογής -­‐ Μερικά παραδείγματα:

Το μενού έχει 3 επιλογές:

1. 2. 3.

'0' για φόρτωση μερικών προκαθορισμένων από εμάς δεδομένων που διαμορφώνουν ένα μικρό συνέδριο '1' για εισαγωγή νέων δεδομένων '2' για επιλογή εμφάνισης δεδομένων επιλογής μας Αν επιλέξουμε το '1' θα έχουμε 2 επιλογές:

1. 2.

'1' για εισαγωγή εθελοντών fr και χορηγού '2' για εισαγωγή ημερίδας, ομιλητών κτλπ Αν επιλέξουμε το '2' θα έχουμε 21 επιλογές:

1. Εύρεση όλων των ξενοδοχείων 2. Εύρεση όλων των χορηγών 3. Εύρεση όλων των ημερίδων 4. Εύρεση όλων των εθελοντών se 5. Εύρεση όλων των εθελοντών fr 6. Εύρεση όλων των μελών επιστημονικής επιτροπής 7. Εύρεση όλων των ομιλητών. 8. Εύρεση όλων των παρουσιάσεων. 9. Εύρεση όλων των αιθουσών. 10. Εύρεση του υπεύθυνου των εθελοντών se 11. Εύρεση του υπεύθυνου των εθελοντών se 12. Εύρεση του εθελοντή fr που επικοινωνεί με ένα χορηγό, το όνομα του οποίου δίνει ο χρήστης 13. Εύρεση του εθελοντή se που βοηθάει σε μία ημερίδα, το όνομα της οποίας δίνει ο χρήστης 14. Εύρεση του ξενοδοχείου που μένει ένας επιστήμονας, το όνομα του οποίου δίνει ο χρήστης 15. Εύρεση της ημερίδας που επιβλέπει ένα μέλος της επιστημονικής επιτροπής, το όνομα της οποίας δίνει ο χρήστης 16. Εύρεσης της ομιλίας που κάνει ένας ομιλητής, το όνομα του οποίου δίνει ο χρήστης 17. Εύρεση του αθροίσματος όλων των χορηγιών 18. Εύρεση το μέσου όρου ενοικίασης των αιθουσών 19. Εύρεση του αριθμού παρουσιάσεων μίας ημέρας, το όνομα της οποίας δίνει ο χρήστης 20. Εύρεση του αριθμού παρουσιάσεων ταξινομημένο ανά ημερομηνία 21. Εύρεση του αριθμού των επιστημόνων κάθε ξενοδοχείο, ταξινομημένο ως προς το όνομα του ξενοδοχείου Οι βασικές έννοιες των εντολών SQL μέσω Java εξηγήθηκαν σε προγενέστερο σημείου του κειμένου και προκειμένου να μην παραθέσουμε μεγάλη ποσότητα ανούσιας πληροφορίας τις αφήσαμε στον κώδικά μας.

Μερικά παραδείγματα χρήσης της εφαρμογής μας:

Αρχικά πατάμε '0' για να φορτωθούν τα δεδομένα μας.

Θέλουμε να δούμε τον αριθμό των παρουσιάσεων κάθε ημέρας. Επιλέγουμε αρχικά '1' και μετά '20' και έχουμε τα εξής:

Date 2012-2013

COUNT(*) 18


2013-­‐05-­‐24 2

2013-­‐05-­‐25 1

Ας δοκιμάσουμε να προσθέσουμε ένα ακόμα υπεύθυνο των fr volunteer:

Enter: 0 for insertion of some pre-­‐defined data: 1 for insertions: 2 for selections: 1 1 to insert a volunteer FR and a sponsor 2 to insert a session 1 Give the first name of the fr volunteer: Marios Give the last name of the fr volunteer: Mariopoulos Give the address of the fr volunteer: Patra Give the phone number of the fr volunteer: 243525223 Give the position of the fr volunteer: Chair Their is already a chair of fr volunteers. Aborted Βλέπουμε ότι η εφαρμογή μας ενημερώνει ότι υπάρχει ήδη ένας υπεύθυνος εθελοντών fr και δεν μας αφήνει να προσθέσουμε ακόμα ένα.

Ας δούμε τους εθελοντές fr και τους χορηγούς:

VOLUNTEER_code code 1 1 3 3

FirstName LastName Marios Bikos George Pap

code Name Address Website

Address PhoneNumber Position Lemessou 2611101732 Chair Germanou 2610333333 Member

PhoneNumber Sponsorship FR_VOLUNTEER_VOLUNTEER_code 1 Loux Athens www.loux.gr loux@loux.gr 2611102130 2310.0 1 2 Fix Patras www.fix.gr fix@gmail.gr 2611303332 1900.0 3 2012-2013

Email

19


Έστω ότι εισάγουμε ένα εθελοντή fr και έναν χορηγό ως εξής:

Enter: 0 for insertion of some pre-­‐defined data: 1 for insertions: 2 for selections: 1 1 to insert a volunteer FR and a sponsor 2 to insert a session 1 Give the first name of the fr volunteer: Marios Give the last name of the fr volunteer: Dimitropoulos Give the address of the fr volunteer: Patra Give the phone number of the fr volunteer: 21423423 Give the position of the fr volunteer: Member Give the name of the sponsor: Glu Glu Give the address of the sponsor: Athens Give the web site of the sponsor: glu.gr Give the email of the sponsor: glu@gmail.com

2012-2013

20


Give the phone number of the sponsor: 234324233 Give the sponsorship of the sponsor: 2342

Τυπώνουμε πάλι τους εθελοντές fr και τους χορηγούς και παίρνουμε τα εξής αποτελέσματα:

VOLUNTEER_code 1 3 6 code 1 3 4

code 1 3 6

FirstName Marios George Marios

Name Address Website Loux Athens www.loux.gr Fix Patras www.fix.gr Glu Athens glu.gr

LastName Bikos Pap Dimitropoulos

Email loux@loux.gr fix@gmail.gr glu@gmail.com

Address Lemessou Germanou Patra

PhoneNumber 2611102130 2611303332 234324233

PhoneNumber 2611101732 2610333333 21423423

Sponsorship 2310.0 1900.0 2342.0

Position Chair Member Member

FR_VOLUNTEER_VOLUNTEER_code 1 3 6

Βλέπουμε ότι όλα έγιναν κανονικά. Ένα άλλο παράδειγμα είναι όταν εισάγουμε μία συνεδρία. Αρχικά εισάγουμε τον υπεύθυνο της επιστημονικής επιτροπής και το ξενοδοχείο του (αν δεν υπάρχει ήδη). Έπειτα, εισάγουμε τις πληροφορίες της συνεδρίας και ύστερα εισάγουμε έως 5 εθελοντές se. Τέλος, εισάγουμε όσους ομιλητές θέλουμε (μαζί με τα ξενοδοχεία τους εάν δεν υπάρχουν) και έως 2 ομιλίες ανά ομιλητή. είναι:

Πριν από την εισαγωγή οι πίνακες Scientific Committee Member, Hotel, Session, Presentation, Volunteer Se, Presenter

SCHOLAR_code

code

FirstName

LastName

Address

PhoneNumber ScientificField

1

1

Nikos

Avouris

Rion

2610000001 HCI

2

2

Alexandros

Toubakaris

Rion

3

3

Antonis

Tzes

Rion

U Patras

Organization HOTEL_code 1

2610200001 Information Theory

U Patras

2

2610003001 Robotics

1

U Patras

code

Name

Address

PhoneNumber

Website

Category

1

Astir

Patra

2222222222

www.astir.gr

4

2

Britannia

Patra

2222232222

www.brit.gr

3

code

ScientificField

Date

StartTime

EndTime

HALL_code

SCIENTIFIC_COMMITTEE_MEMBER_SCHOLAR_code

1

Computer Science

2013-05-24

15:00:00

17:00:00

1

1

2

Communications

2013-05-24

15:00:00

17:00:00

1

2

3

Robotics

2013-05-24

17:00:00

17:00:00

2

3

code

Date

StartTime

EndTime

Title

FirstName

LastName

ScientificField

1

2013-05-24

15:00:00

16:00:00

Embedded Systems

Kleanthis

Thraboulidis

Computer Science

2

2013-05-24

16:00:00

17:00:00

Modern Antennas

Konstantinos

Moustakas

Communications

3

2013-05-25

17:00:00

18:00:00

Robotic Vision

Konstantinos

Sorras

Robotics

2012-2013

21


VOLUNTEER_code

code

FirstName

LastName

Address

PhoneNumber

Position

2

2

Alexis

Kogas

EMB

2610333303

Chair

4

4

Dim

Skr

Maizonos

2611103132

Member

5

5

Alex

Osna

Agia Sofia

2611106132

Member

SCHOLAR_code

code

FirstName

LastName

Address

PhoneNumber

ScientificField

4

4

Kleanthis

Thraboulidis

Rion

2610003301

Software Engineering

5

5

Konstantinos

Moustakas

Rion

2610303301

Computer Vision

U Patras

1

6

6

Konstantinos

Patras

2610353301

Electromagnetics

U Patras

1

Sorras

Organization

HOTEL_code

U Patras

1

Φάση Δ Ανασκόπηση της εφαρμογής • • • •

Με μία προσεκτική ανασκόπηση της εφαρμογής παρατηρήσαμε ότι: Η επιλογή της Java μας βοήθησε όντως αρκετά Μάθαμε πολύ καλά να συνδέουμε και να χειριζόμαστε βάσεις δεδομένων MySQL και Java Η εφαρμογή είναι απλή αλλά όχι απλοΪκή, καταφέρνει να επιδείξει τα βασικά-­‐ουσιώδη σημεία Αποκτήσαμε σημαντική τεχνογνωσία και είμαστε έτοιμοι να την χρησιμοποιήσουμε όταν χρειαστεί για σχεδιασμό και υλοποίηση πραγματικής εφαρμογής

Ανασκόπηση της εργασίας -­‐ Βελτιώσεις -­‐ Επεκτάσεις

Η αντίστοιχη ανασκόπηση του συνόλου της εργασίας μας δίδαξε τα εξής:

• • • •

Να κατασκευάζουμε από το μηδέν έως το επίπεδο εφαρμογής την βάση δεδομένων ενός μικρόκοσμου Να χειριζόμαστε βάσεις δεδομένων με MySQL και Java Ίσως μερικές οντότητες να πλεονάζουν (π.χ. Αίθουσα) Ίσως μερικές υποκλάσεις να έπρεπε να είναι ξεχωριστές οντότητες (π.χ. Οι ομάδες εθελοντών) Πιθανές βελτιώσεις και επεκτάσεις είναι οι εξής:

Πρέπει να δίνουμε πλήρεις δυνατότητες εισαγωγής, διαγραφής και ανανέωσης δεδομένων τηρώντας τους περιορισμούς (π.χ. Να διαγράφουμε ομιλίες ή να αλλάζουμε τα δεδομένα ομιλητών) Μία γραφική διεπαφή χρήστη (GUI) θα βοηθούσε αρκετά, ιδιαίτερα εάν πρόκειται για εφαρμογή με εμπορική χρησιμοποίηση Θα πρέπει να δίνεται η δυνατότητα ταυτόχρονων δοσοληψιών με απόλυτη ασφάλεια των δεδομένων (πχ να μπορούν οι υπεύθυνοι να ανανεώνουν ταυτόχρονα τα δεδομένα της βάσης) Θα πρέπει κάθε χρήστης να έχει διαφορετικά δικαιώματα χρήσης (π.χ. άλλα ο υπεύθυνος του συνεδρίου, και άλλα ένας εθελοντής)

• • •

2012-2013

22


ΕΝΟΤΗΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΕΡΓΑΣΙΩΝ Στο συγκεκριµένο project εργαστήκαµε από κοινού σε κοινή τοποθεσία. Συνολικά έγιναν 4 συναντήσεις συνολικής διάρκειας 23 ωρών. Στο 1ο κοµµάτι εργασιών έγινε έρευνα από κάθε φοιτητή σε ξεχωριστά πεδία.Ο Μάριος Μπίκος ανέλαβε την έρευνα συνεδρίων και διαδικασιών συνεδριών, καθώς και την εύρεση των οντοτήτων που κρίνονται απαραίτητες σε συνέδρια(http://www.ieee.org/conferences_events/conferences/organizers/index.html ).Ο Δηµήτρης Σκρεπετός ανέλαβε την έρευνα παρόµοιων έτοιµων συστηµάτων διοργάνωσης συνεδρίων(http://www.openconf.com , http://www.conftool.net ). Στο 2ο κοµµάτι εργασιών σχεδιάσαµε σε πίνακα το διάγραµµα οντοτήτων συσχετίσεων.Έπειτα ο Μάριος Μπίκος δηµιούργησε στο gliffy.com το ERD ενώ ο Δηµήτρης Σκρεπετός ανέλαβε την συγγραφή της περιγραφής του αναλυτικού µικρόκοσµου και των πιθανών ερωτήσεων(queries). Στο 3ο κοµµάτι εργασιών ο Μάριος Μπίκος δηµιούργησε στο MySQLWorkBench το λογικό µοντέλο.Έπειτα ο Δηµήτρης Σκρεπετός ανέλαβε την εγκατάσταση του MySQL Community Server και την εγκατάσταση των απαραίτητων εργαλείων(π.χ Connector Java-DB). Τέλος, στο κοµµάτι της ανάπτυξης της εφαρµογής ο Μάριος Μπίκος ανέλαβε το menu µε τις ερωτήσεις προς τη βάση δεδοµένων(SELECT MENU) , ενώ ο Δηµήτρης Σκρεπετός ανέλαβε το δύσκολο κοµµάτι της εισόδου δεδοµένων από τον χρήστη προς τη βάση καθώς και την εύρεση λύσεων σε περιορισµούς που επηρεάζουν την ακεραιότητα του προγράµµατος.Ο Μάριος Μπίκος ανέλαβε επίσης την συγγραφή της τελικής αναφοράς. Συνοπτικά: Μάριος Μπίκος ERD Λογικό Μοντέλο Προγραµµατισµός SELECT MENU(queries) Κατασκευή Παρουσίασης

2012-2013

Δηµήτρης Σκρεπετός Περιγραφή Μικρόκοσµου Εγκατάσταση MySQL-σύνδεση µε JAVA Προγραµατισµός INSERT MENU Συγγραφή Αναφοράς

23


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.