Issuu on Google+

ΠΡΟΑΙΡΕΤΙΚΗ ΕΡΓΑΣΙΑ-Ε#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


Conference Management System