Βάσεις Δεδομένων και web-based Εφαρμογές Μελέτες περίπτωσης: Πωλήσεις αυτοκινήτων Διαχείριση Προσωπικού -Χρήση JDBC API, JSP pages- Διδάσκων: Χ. Σκουρλάς, cskourlas@teiath.gr Α θ ή ν α 2015-16
Σκοπός Μαθήματος Σκοπός: Παρουσιάζεται η διαχείριση βάσης δεδομένων με γλώσσα SQL, χρήση JDBC API, και τεχνολογίας JSP pages και λογισμικού mySQL. Στόχος μας είναι να βοηθήσουμε το σπουδαστή να μάθει να προγραμματίζει web based εφαρμογές βάσεων δεδομένων. Χ. Σκουρλάς
Προγραμματισμός με χρήση jdbc API Στο σχήμα προσφέρεται μία οπτική υπενθύμιση για μία σειρά από αντικείμενα, μεθόδους (objects, methods) του jdbc API και με τα βέλη περιγράφεται η επικοινωνία / σύνδεσή / διάταξή τους.
M Laiho
Βασικές ιδέες-έννοιες
Χρήση του JDBC API από Java application για σύνδεση σε βάση δεδομένων ORACLE/mySQL
Η διεπαφή JDBC τυποποιεί : Σύνδεση (how to connect to a database) Οι Java applications γίνονται σχεδόν ανεξάρτητες της χρησιμοποιούμενης βάσης δεδομένων Η διεπαφή JDBC τυποποιεί : Σύνδεση (how to connect to a database) Ερωτήσεις (how to execute queries against it) Προσπέλαση αποτελεσμάτων (how to navigate the result of a query) Ενημέρωση βάσης (how to execute updates in the database). Δεν τυποποιεί την SQL που στέλνεται στη βάση (sent to the database). Αυτό αλλάζει ανάλογα με το προϊόν.
Η διεπαφή JDBC API περιλαμβάνει 4 κύρια μέρη (Core JDBC Components) JDBC Drivers Connections Statements Result Sets
JDBC Drivers JDBC driver: Συλλογή (collection) από Java classes που επιτρέπει τη σύνδεση java applications σε συγκεκριμένη βάση. Η MySQL έχει τον δικό της JDBC driver.
Connections Μόλις ο JDBC driver φορτωθεί (loaded) και αρχικοποιηθεί (initialized) πρέπει να συνδεθείτε (connect) στη βάση. Η σύνδεση επιτυγχάνεται μέσω του JDBC API και του driver (Connection to the database via the JDBC API and the loaded driver). Η επικοινωνία με τη βάση (communication with the database) γίνεται μέσω μίας ανοικτής connection. Μία application μπορεί να έχει πολλές ανοικτές connections σε μία βάση δεδομένων.
Statements Μία Statement χρησιμοποιείται για την εκτέλεση ερωτήσεων και την ενημέρωση της βάσης (to execute queries and updates against the database). Κάθε statement αντιστοιχεί σε ένα (single) query ή update.
ResultSets Όταν εκτελείτε query στη βάση λαμβάνετε ένα ResultSet. Μπορείτε να «διασχίσετε» (traverse) αυτό το ResultSet για να διαβάσετε τα αποτελέσματα (result of the query).
Υπάρχουν 4 κύρια JDBC σενάρια (use cases): Query the database. Query the database meta data. Update the database. Perform transactions
Ανάγνωση δεδομένων από τη βάση. Query the database Ανάγνωση δεδομένων από τη βάση.
Query the database meta data Ανάγνωση μετα-δεδομένων από τη βάση (to query the database meta data). Τα database meta data περιλαμβάνουν πληροφορίες για τη βάση δεδομένων . Παραδείγματα: Πληροφορίες για tables, columns, data types κ.λπ.
Update the database Updating είναι η εγγραφή δεδομένων στη βάση: προσθήκη νέων γραμμών τροποποίηση γραμμών
Perform transactions Transaction. Ομαδοποίηση πολλαπλών δηλώσεων σε μία «δράση» (A transaction groups multiple updates and possibly queries into a single action) που εκτελείται με τη λογική όλα ή τίποτα.
Java JDBC: Interaction of the core JDBC components during the execution of a database query (select).
Φόρτωση (Loading) του JDBC Driver Πριν ανοίξετε μία database connection πρέπει να φορτώσετε (load) τον JDBC driver για τη βάση: Class.forName("driverClassName"); Κάθε JDBC driver έχει μία κύρια driver class που αρχικοποιεί τον driver όταν φορτώνεται. Στην περίπτωση φόρτωσης (load) του mysql Database driver πρέπει να γράφετε: Class.forName(“com.mysql.jdbc.Driver”);
Άνοιγμα (Opening the) Connection Για να ανοίξετε μια database connection χρησιμοποιείτε την κλάση java.sql.DriverManager. Καλείτε τη μέθοδό της (method) getConnection(): String testDatabase = “jdbc:mysql://localhost:3306/mydb?user=admin&password=1234"; Connection myConnection = DriverManager.getConnection(testDatabase);
Κλείσιμο (Closing the) Connection Μετά τη χρήση της (database) connection πρέπει να την κλείσετε. Για να το κάνετε χρησιμοποιείτε κλήση της μεθόδου Connection.close() : connection.close();
JDBC: Query the Database Query στη βάση σημαίνει εκτέλεση select στα δεδομένα. Αυτό γίνεται με αποστολή SQL statements στη βάση. Πρώτα χρειαζόμαστε μια open database connection. Μετά δημιουργούμε ένα Statement object: Statement mystatement = connection.createStatement(); Μόλις δημιουργήσετε το Statement μπορείτε να το χρησιμοποιείτε για την εκτέλεση των SQL queries: String mysql = "select * from employee"; ResultSet myresults = mystatement.executeQuery(mysql); Εκτελώντας μια SQL query σας επιστρέφετε ένα ResultSet. Το ResultSet περιλαμβάνει το αποτέλεσμα της SQL query υπό τη μορφή πίνακα.
Μπορείτε να διασχίσετε τις γραμμές του ResultSet: while(myresults.next()) { String name = myresults.getString("name"); Date birthdate = myresults.getDate("age"); } Η μέθοδος ResultSet.next() σας μετακινεί στην επόμενη γραμμή του ResultSet, όσο υπάρχουν γραμμές. Όσο υπάρχουν γραμμές επιστρέφει true. Αν δεν υπάρχουν επιστρέφει false. Πριν το πρώτο next() το ResultSet τοποθετείται πριν την πρώτη γραμμή. Μπορείτε να πάρετε δεδομένα στηλών από την τρέχουσα γραμμή με κλήση μεθόδων πχ. myresults.getString("columnName");
JDBC API: Update the Database Για την ενημέρωση της βάσης αντί της κλήσης της μεθόδου executeQuery() καλείτε τη μέθοδο executeUpdate(). Δύο τύποι updates: Update rows Delete rows Η μέθοδος executeUpdate() χρησιμοποιείται και για τους 2 τύπους.
Update Rows Statement statement = connection.createStatement(); String sql="update people set sal=sal*1.1"; int rowsAffected=statement.executeUpdate(sql); Η rowsAffected που επιστρέφεται από την κλήση της statement.executeUpdate(sql) «λέει» πόσες γραμμές στη βάση άλλαξαν από την SQL statement.
Delete Rows Statement statement = connection.createStatement(); String sql= "delete from employee where sal>2000"; int rowsAffected= statement.executeUpdate(sql); Η rowsAffected που επιστρέφεται από την κλήση της statement.executeUpdate(sql) «λέει» πόσες γραμμές διαγράφηκαν από την SQL statement.
M Laiho
Βασική αρχή Η βασική αρχή χρήσης του API είναι απλή: Statement myStatement = myconnection.createStatement(); Τα αντικείμενα της βάσης δεδομένων ορίζονται σαν συμβολοσειρές (string). Ακολουθούν παραδείγματα: String testDatabase = “jdbc:mysql://localhost:3306/mydb?user= root &password=c125"; Προσοχή! Η παρακάτω εντολή είναι λανθασμένη String sqlString = "INSERT INTO USERS VALUES('user1', 'password1')"; Η σωστή διαμορφώνεται ως εξής: … VALUES('"+user1+"','"+password1+"') String sql="insert into users values ('"+user1+"','"+password1+"')";
Απλά παραδείγματα χρήσης του API: Η DriverManager Class παρέχει τη μέθοδο getConnection. Μπορούμε να ορίσουμε ένα αντικείμενο, για παράδειγμα το αντικείμενο myConnection, τύπου Connection ως εξής: Connection myConnection = DriverManager.getConnection(testDatabase); Αυτό προϋποθέτει ότι έχουμε ορίσει ένα αντικείμενο testDatabase τύπου string που «ορίζει» τον driver που χρησιμοποιούμε, το URL, τη βάση μας, username και password. String testDatabase = “jdbc:mysql://localhost:3306/mydb?user=admin&password=1234"; Αν δεν υπάρχει password “jdbc:mysql://localhost:3306/mydb?user=admin";
Το αντικείμενο myConnection είναι τύπου Connection και μπορούμε να χρησιμοποιήσουμε τη μέθοδο CreateStatement της Connection για να ορίσουμε ένα αντικείμενο, για παράδειγμα το αντικείμενο myStatement τύπου Statement. Μέσω του αντικειμένου myStatement θα γράφουμε δηλώσεις SQL (INSERT, UPDATE, DELETE, SELECT). Statement myStatement = myconnection.createStatement(); Το αντικείμενο myStatement είναι τύπου Statement και μπορούμε να «εκτελέσουμε» τη δήλωση SQL χρησιμοποιώντας μία από τις δύο σχετικές μεθόδους της (μέθοδο executeUpdate ή μέθοδο executeQuery). Ποια είναι κατάλληλη μέθοδος εξαρτάται από τη δήλωση SQL. Στην περίπτωση δήλωσης INSERT έχουμε: myStatement.executeUpdate(sqlString);
Υπενθύμιση Η συγγραφή της SQL δήλωσης γίνεται σε ένα αντικείμενο τύπου string, για παράδειγμα το αντικείμενο με όνομα sqlString. String sqlString = "INSERT INTO USERS VALUES ('"+user1+"','"+password1+"') ('user1', 'password1')"; Έτσι για να εκτελέσουμε την SQL δήλωση που γράψαμε: String sql="insert into users values ('"+user1+"','"+password1+"')"; myStatement.executeUpdate(sqlString);
Στην περίπτωση δήλωσης SELECT μπορούμε να ορίσουμε ένα αντικείμενο, για παράδειγμα το αντικείμενο με όνομα rs, τύπου ResultSet. Στο αντικείμενο «αποθηκεύονται» τα αποτελέσματα της δήλωσης SELECT. Προηγουμένως, θα ορίσουμε το αντικείμενο sqlString (συμβολοσειρά που «περιέχει» τη δήλωση SELECT). String sqlString = "SELECT * FROM MYTABLE WHERE PARAM = 'paramValue'"; ResultSet rs = myStatement.executeQuery(sqlString); Η ResultSet παρέχει μεθόδους για να διαχειριστούμε τις γραμμές που «αποθηκεύονται» στο rs: next(), previous(), first(), last() Επίσης, παρέχει μία σειρά από μεθόδους κάθε μία από τις οποίες μπορεί να χρησιμοποιήθει για να πάρουμε πληροφορία από μια στήλη: getString, getInt, getFloat getDate.
Checklist: Πως θα συνδεθούμε στη βάση δεδομένων και πως θα γράψουμε SQL statements (περίπτωση χρήσης των προϊόντων MySQL, Netbeans): Δήλωση του JDBC driver libraries>δεξί κλικ> Add Jar/Folder και επιλέγουμε το αρχείο mysql-connector-java- 5.1.13 -bin.jar ή mysql.jar Εισαγωγή του package java.sql στο πρόγραμμά μας %@page import="java.sql.*" % «Φόρτωση» του JDBC driver στο πρόγραμμά μας Class.forName(“com.mysql.jdbc.Driver”); Φορτώνουμε την κλάση Driver από το package com.mysql.jdbc.
Σύνδεση στη βάση δεδομένων String testDatabase = “jdbc:mysql://localhost:3306/mydb?user=root&password=c125"; Ορίζουμε για τη βάση δεδομένων μας (mydb) το αντικείμενο testDatabase τύπου συμβολοσειράς (string) της μορφής: “jdbc:mysql://ServerName:ServerPort/DatabaseName?user=myUsername&password=myPassword"; Connection myConnection = DriverManager.getConnection(testDatabase); Δημιουργούμε ένα αντικείμενο τύπου Connection. Tο αντικείμενό μας, myConnection, είναι μια ανοιχτή σύνδεση με τη βάση δεδομένων
Δημιουργία αντικειμένου για να γράψουμε SQL statements Statement myStatement = myconnection.createStatement(); Δημιουργούμε το αντικείμενο myStatement τύπου Statement. Μέσω του αντικειμένου myStatement θα γράφουμε δηλώσεις SQL. Εγγραφή SQL statements String sqlString = "INSERT INTO USERS VALUES ('user1', 'password1')"; String sql="insert into users values ('"+user1+"','"+password1+"')"; Ορίζουμε ένα αντικείμενο sqlString τύπου string για να γράψουμε τη δήλωση SQL (που θέλουμε να εκτελεστεί στη συνέχεια).
Εκτέλεση SQL statements myStatement.executeUpdate(sqlString); Εκτελούμε τη δήλωση SQL που γράψαμε και πιο συγκεκριμένα χρησιμοποιούμε το αντικείμενο myStatement που δημιουργήσαμε. Επειδή έχουμε στην περίπτωση αυτή εντολή INSERT χρησιμοποιήσαμε τη μέθοδο executeUpdate. Το ίδιο θα κάναμε και σε δήλωση UPDATE ή DELETE. Αν η sqlString αφορούσε μια SQL statement τύπου select, η μέθοδός μας θα ήταν η executeQuery: myStatement.executeQuery(sqlString);
Κλείσιμο του αντικειμένου εγγραφής SQL statements myStatement.close(); Αφού εκτελέσουμε την SQL statement πρέπει να κλείσουμε το αντικείμενο εγγραφής SQL statements. Κλείσιμο της σύνδεσης myConnection.close(); Κλείνουμε τη σύνδεση με τη βάση δεδομένων.
Κάποια παραδείγματα διαχείρισης δηλώσεων SQL Για να γράψουμε SQL χρησιμοποιούμε (διορθώστε τα διαγραμμένα) myStatement.methodName(sqlString); insert statement myStatement.executeUpdate(sqlString); όπου sqlString είναι μια συμβολοσειρά της μορφής: String sqlString = "INSERT INTO MYTABLE VALUES ('value1', 'value2')"; delete statement όπου το sqlString είναι της μορφής: String sqlString = "DELETE FROM MYTABLE WHERE PARAM = 'paramValue'"; update statement myStatement.executeUpdate(sqlString); -- όπου το sqlString είναι: String sqlString = "UPDATE MYTABLE SET PARAM1='value1' WHERE PARAM2='value2'";
select statement Για επιλογή δεδομένων χρησιμοποιούμε τη μέθοδο executeQuery μέσω της εντολής: ResultSet rs = myStatement.executeQuery(sqlString); όπου sqlString είναι μια συμβολοσειρά της μορφής: String sqlString = "SELECT * FROM MYTABLE WHERE PARAM = 'paramValue'"; Η μέθοδος executeQuery μας δίνει τη δυνατότητα να ανακτήσουμε από τη βάση δεδομένα. Τα δεδομένα αυτά πρέπει να τα αποθηκεύσουμε προσωρινά σε κάποια δομή ώστε να τα χρησιμοποιήσουμε.
Επισκόπηση Η Java μας δίνει μια εύχρηστη δομή μέσω της κλάσης ResultSet. Πιο συγκεκριμένα, η μέθοδος ExecuteQuery μας επιστρέφει ένα αντικείμενο τύπου ResultSet. Ας ονομάσουμε το συγκεκριμένο αντικείμενο rs. Μέσα στο αντικείμενο αυτό αποθηκεύονται προσωρινά όλες οι γραμμές δεδομένων που επιστρέφει η δήλωση SELECT που εκτελέσαμε. Μέσω του αντικειμένου αυτού μπορούμε να επεξεργαστούμε τις γραμμές στο πρόγραμμά μας Το αντικείμενο rs μας παρέχει και έναν δείκτη ο οποίος αρχικά δείχνει πριν από την πρώτη γραμμή αποτελεσμάτων που είναι αποθηκευμένα στο αντικείμενο rs.
Το rs (ως αντικείμενο της κλάσης ResultSet) μας παρέχει μεθόδους για να επεξεργαζόμαστε τις γραμμές που ανακτήσαμε από τη βάση δεδομένων. Για να χρησιμοποιήσουμε την πληροφορία που είναι καταχωρημένη στο αντικείμενο rs, θα πρέπει: Να μετακινήσουμε το δείκτη στη γραμμή που θέλουμε να επεξεργασθούμε ή να τον μετακινούμε διαδοχικά αν θέλουμε να επεξεργασθούμε όλες τις αποθηκευμένες γραμμές. Αυτό γίνεται με χρήση μεθόδων όπως: next(), previous(), first(), last() Να χρησιμοποιήσουμε την κατάλληλη συνάρτηση για να πάρουμε πληροφορία από μια στήλη. Αυτό γίνεται με τις συναρτήσεις getString, getInt, getFloat getDate κ.τ.λ.
Θυμηθείτε: Πρακτικός κανόνας για τη συγγραφή δήλωσης SQL στα προγράμματά μας: Δοκιμάζουμε τη δήλωση με συγκεκριμένες τιμές στις μεταβλητές. Τοποθετούμε την εντολή σε " " και αντικαθιστούμε κάθε συγκεκριμένη τιμή, για παράδειγμα την τιμή 'ANALYST'με το όνομα της μεταβλητής γραμμένο με "+ +", ως εξής: '"+job+"' Δείτε και το παράδειγμα: String sql="insert into emp(ename,job,sal,deptno) values ('"+name+"','"+job+"','"+sal+"',"+deptno+")";
case study Διαχείριση πωλήσεων αυτοκινήτων
case study Διαχείριση πωλήσεων αυτοκινήτων Δημιουργία πινάκων εφαρμογής
Mythical Car JSP pages
Project name
Web pages – δεξί κλικ
menu.jsp
sales_index.jsp
salesInsert.jsp
selectSales.jsp
Add mySQL driver
User Interface
Εισαγωγή πώλησης και επιστροφή στο μενού
Πωλήσεις
case study Διαχείριση προσωπικού Δημιουργία πινάκων εφαρμογής
DROP DATABASE personnel; CREATE DATABASE personnel; USE proj; CREATE TABLE Dept(DEPTNO INT(2) NOT NULL, DNAME VARCHAR(14), LOC VARCHAR(14), NO_OF_EMPLOYEES INT(3), PRIMARY KEY(DEPTNO)); CREATE TABLE Emp(EMPNO INT(4) NOT NULL AUTO_INCREMENT, ENAME VARCHAR(10), JOB VARCHAR(9), SAL FLOAT(7,2), DEPTNO INT(2), PRIMARY KEY(EMPNO), FOREIGN KEY(DEPTNO) REFERENCES Dept(DEPTNO));
INSERT INTO Dept(DEPTNO, DNAME, LOC) VALUES (10, 'ACCOUNTING', 'NEW YORK'); VALUES (20, 'RESEARCH', 'DALLAS'); VALUES (30, 'SALES', 'CHICAGO'); VALUES (40, 'OPERATIONS', 'BOSTON');
INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'SMITH', 'CLERK', 800, 20); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'ALLEN', 'SALESMAN', 1600, 30); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'WARD', 'SALESMAN', 1250, 30); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'JONES', 'MANAGER', 2975, 20); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'MARTIN', 'SALESMAN', 1250, 30); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'BLAKE', 'MANAGER', 2850, 30); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'CLARK', 'MANAGER', 2450, 10); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'SCOTT', 'ANALYST', 3000, 20); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'KING', 'PRESIDENT', 5000, 10); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'TURNER', 'SALESMAN', 1500, 30); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'ADAMS', 'CLERK', 1100, 20); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'JAMES', 'CLERK', 950, 30); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'FORD', 'ANALYST', 3000, 20); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'MILLER', 'CLERK', 1300, 10); INSERT INTO Emp( ENAME, JOB, SAL, DEPTNO) VALUES ( 'BATES', 'ANALYST', 1300, NULL);
Στη συνέχεια θα γίνει διαχείριση των τιμών της στήλης no_of_employees UPDATE dept SET no_of_employees = (SELECT COUNT(*) FROM emp WHERE emp.deptno = dept.deptno); Select * from dept; Select * from emp; Στη συνέχεια θα γίνει διαχείριση των τιμών της στήλης no_of_employees με triggers
CREATE TABLE user( uname text, upass text, Uid int(11), Uphone varchar(45), Ucity varchar(45)); INSERT INTO `user` VALUES ('admin','1234',1,NULL,NULL);
DROP TRIGGER emp_insert; DROP TRIGGER emp_delete; DROP TRIGGER emp_update; DELIMITER // CREATE TRIGGER emp_insert AFTER INSERT ON emp FOR EACH ROW BEGIN UPDATE dept SET no_of_employees = IFNULL(no_of_employees, 0) + 1 WHERE deptno = NEW.deptno; END // DELIMITER ;
DELIMITER // CREATE TRIGGER emp_delete AFTER DELETE ON emp FOR EACH ROW BEGIN UPDATE dept SET no_of_employees = IFNULL(no_of_employees, 0) - 1 WHERE deptno = OLD.deptno; END // DELIMITER ;
DELIMITER // CREATE TRIGGER emp_update AFTER UPDATE ON emp FOR EACH ROW BEGIN UPDATE dept SET no_of_employees = IFNULL(no_of_employees,0) + 1 WHERE deptno = NEW.deptno; SET no_of_employees = IFNULL(no_of_employees, 0) - 1 WHERE deptno = OLD.deptno; END // DELIMITER ;
Ακολουθούν δοκιμές / έλεγχοι INSERT INTO dept VALUES(11,'Belle Epoque', 'PARIS', 0); INSERT INTO dept VALUES(12,'Rasors edge', 'PARIS', 0); INSERT INTO emp(empno,ename,deptno) VALUES (102,'Luers',11); INSERT INTO emp(empno,ename,deptno) VALUES (103,'Atwood',11); INSERT INTO emp(empno,ename,deptno) VALUES (104,'Gennick',12); SELECT * FROM dept WHERE deptno IN (11,12); DELETE FROM emp WHERE empno = 103; UPDATE emp SET deptno = 11 WHERE empno = 104; SELECT * FROM dept; SELECT * FROM emp;
Παράδειγμα Χρήσης Cursor Να καταχωρήσετε τμήματα με λιγότερους από 5 υπαλλήλους στον πίνακα infologs. Βλέπουμε τον πίνακα dept.
Δημιουργούμε τον πίνακα infologs Id – αύξων αριθμός, Msg – κωδικός τμήματος με λιγότερους από 5 υπαλλήλους CREATE TABLE infologs ( Id int(11) NOT NULL AUTO_INCREMENT, Msg varchar(255) NOT NULL, PRIMARY KEY (Id)); Θα δημιουργήσουμε την procedure cursorproc και όταν την εκτελέσουμε θα δούμε τα παρακάτω:
DELIMITER $$ DROP PROCEDURE IF EXISTS CursorProc$$ CREATE PROCEDURE CursorProc() BEGIN DECLARE no_more_depts, available_employees INT DEFAULT 0; DECLARE dept_code VARCHAR(255); DECLARE cur_dept CURSOR FOR SELECT deptno FROM dept; DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_depts = 1; /* for logging information */ OPEN cur_dept; FETCH cur_dept INTO dept_code; REPEAT SELECT no_of_employees INTO available_employees FROM dept WHERE deptno = dept_code; IF available_employees < 5 THEN INSERT INTO infologs(msg)VALUES (dept_code); END IF; FETCH cur_dept INTO dept_code; UNTIL no_more_depts = 1 END REPEAT; CLOSE cur_dept; SELECT * FROM infologs; END$$ Δημιουργία procedure
DELIMITER ; CALL CURSORPROC();
case study Τα βήματα που θα ακολουθήσουμε προκειμένου να εκτελέσουμε την εφαρμογή είναι: Ανοίγετε το προϊόν Netbeans και δημιουργείτε ένα νέο Web project Στον φάκελο libraries του Web Project προσθέτετε τον driver mysql.jar «Φορτώνετε» το script της βάσης. Αντιγράφετε όλα τα αρχεία (jsp pages) του φακέλου μέσα στον φάκελο Web Pages του Project. Διορθώνετε το String DB = "jdbc:mysql://localhost:3306/personnel?user=root&password=1234"; σύμφωνα με τα δικά σας δεδομένα (για παράδειγμα αν δεν δηλώσατε συνθηματικό θα πρέπει να διαγράψετε το πεδίο password=1234)
Η βάση μας
Σύνδεση Τα στοιχεία της σύνδεσης είναι: IP: localhost Port: 3306 Database: personnel User=root Password=1234
Index.jsp
Κώδικας της index.jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> WELCOME<p></p> LOGIN<p></p> <p></p> <form name="formName" method="post" action="check.jsp" > Name: <input type="text" name="y"><p></p> Password:<input type="text" name="k"><P></P> <input type="submit" value="LOGIN"><p></p> </form> </body> </html>
Index.jsp <form name="formName" method="post" action="check.jsp" > Name: <input type="text" name="y"><p></p> Password:<input type="text" name="k"><P></P> <input type="submit" value="LOGIN"><p></p> </form> check.jsp String x =request.getParameter("y"); String p = request.getParameter("k");
<%@page import="java. sql <%@page import="java.sql.*" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <% Boolean found; int j=0; String s=""; int ps; String x =request.getParameter("y"); String p = request.getParameter("k"); String URL; Class.forName("com.mysql.jdbc.Driver"); String DB = "jdbc:mysql://localhost:3306/personnel?user=root&password=1234"; Connection myConnection = DriverManager.getConnection(DB); Statement SMT = myConnection.createStatement(); String sql="SELECT * FROM user WHERE Uname='"+x+"'AND Upass='"+p+"' "; ResultSet rs=SMT.executeQuery(sql); found= rs.first(); check.jsp
Check.jsp if (found){ URL = "home.jsp?p1="+x+""; response.sendRedirect(URL); } else { out.println("INCORRECT TRY AGAIN");%><P></P> <a href="index.jsp">Try Again</a><% SMT.close(); myConnection.close(); %> </body> </html>
Προβολή όλων των εργαζομένων και των τμημάτων στα οποία ανήκουν Υλοποιείται με χρήση της σελίδας (home.jsp)
Εισαγωγή Νέου εργαζόμενου (insert.jsp, ins_submit.jsp) Ενημέρωση στοιχείων εργαζομένων (update.jsp, up_submit.jsp) Διαγραφή ενός εργαζομένου (delete.jsp) Οι ins_submit.jsp, up_submit.jsp «απομονώνουν» τις ενέργειες –δηλώσεις SQL- ενημέρωσης της βάσης από το «διάλογο» με τον χρήστη της εφαρμογής
ResultSet - απόσπασμα της home.jsp <% String sql="SELECT * FROM dept "; ResultSet rs=SMT.executeQuery(sql); String dname; int count=0; while (rs.next()) { i=rs.getInt("deptno"); String sql1="SELECT * FROM emp WHERE deptno='"+i+"' "; ResultSet rs1=SMT1.executeQuery(sql1); dname=rs.getString("dname"); %>
Ερωτήσεις