150 likes | 284 Views
JAVA και SQL. Δαμιανός Χατζηαντωνίου Τμήμα Διδακτικής της Τεχνολογίας και Ψηφιακών Συστημάτων Πανεπιστήμιο Πειραιώς. E πικοινωνία με διεπαφή JDBC/ODBC - Γενικά.
E N D
JAVA και SQL Δαμιανός Χατζηαντωνίου Τμήμα Διδακτικής της Τεχνολογίας και Ψηφιακών Συστημάτων Πανεπιστήμιο Πειραιώς
Eπικοινωνία με διεπαφή JDBC/ODBC - Γενικά • Σε αυτή την περίπτωση εισάγουμε ένα επίπεδο μεταξύ γλώσσας προγραμματισμού και Β.Δ., μέσω του οποίου γίνεται η επικοινωνία τους. Υπάρχει το ODBC (γενικής εφαρμογής) και το JDBC (για γλώσσα Java). • Ποια είναι η διαφορά με την ενσωματωμένη SQL ??? • Η επικοινωνία με τη ΒΔ γίνεται με system calls της host γλώσσας προγραμματισμού. Συνεπώς, για κάθε διαφορετικό ΣΔΒΔ πρέπει να δημιουργείται και διαφορετικό σύνολο system calls. Αυτό συνεπάγεται ότι για ν ΣΔΒΔ θα υπάρχουν ν implementations. Αντίθετα, με ένα ενδιάμεσο επίπεδο, αρκεί η γλώσσα να «μιλάει» με αυτό (DB-independent.) • Νο free lunch: κόστος -> αποδοτικότητα
Eπικοινωνία με διεπαφή JDBC/ODBC - ODBC • Open Database Connectivity- Αναπτύχθηκε από τη Microsoft Corp. • Το ODBC είναι ένα ευρέως διαδεδομένο API (application programming interface) γιαπρόσβαση και χειρισμό βάσεων δεδομένων. • Ο στόχος είναι κάθε εφαρμογή να έχει πρόσβαση σε οποιαδήποτε δεδομένα, ανεξαρτήτου συστήματος. • Το ODBC δημιουργείένα middle layer (database driver) - μεταξύτης εφαρμογής (στην περίπτωση μας Java) και της Β.Δ. H Java στέλνει SQL στο ODBC και περιμένει την απάντηση.
Eπικοινωνία με διεπαφή JDBC/ODBC - ODBC • Αυτό το layer μεταφράζει τα ερωτήματα της εφαρμογής σε εντολές που καταλαβαίνει η Β.Δ • Η SQL χρησιμοποιείται σαν η γλώσσα πρόσβασης στη Β.Δ. Oracle Application A ODBC Driver for Oracle Application B ODBC Driver for IBM DB2 DB2 ODBC Driver for SQL Server Application C SQL Server Application D
Eπικοινωνία με διεπαφή JDBC/ODBC - ODBC • To open Data Sources (ODBC), click Start, point to Settings, and then click Control Panel. Double-click Administrative Tools, and then double-click Data Sources (ODBC). • For information about using Data Sources (ODBC), click Help in the ODBC Data Source Administrator dialog box.
Eπικοινωνία με διεπαφή JDBC/ODBC - JDBC • Type 1: JDBC-ODBC bridge; Μεταφράζει standard JDBC calls σε ένα αντίστοιχο ODBC call και το στέλνει στο ΣΔΒΔ. • Type 2:απευθείας μετάφραση σε API άμεσης συγγένειας με το ΣΔΒΔ. Τα JDBC calls μεταφράζονται σε κάτο που το ΑΡΙ καταλαβαίνει. • Type 3:middle-tiers • Type 4: all-Java driver που στέλνει αιτήματα απευθείας στο ΣΔΒΔ. Όλα τα μεγάλα συστήματα ΔΒΔ έχουν τύπου-4 JDBC drivers.
Eπικοινωνία με διεπαφή JDBC/ODBC– Java • Σύνδεση με τη ΒΔ • Εκτέλεση ενός SQL αιτήματος. Μπορεί να είναι δύο ειδών: • select...from...where • insert/update/delete • Αποσύνδεση με τη ΒΔ
Eπικοινωνία με διεπαφή JDBC/ODBC – Σύνδεση με ΒΔ Πρέπει να εισάγουμε τα κατάλληλα packages στο πρόγραμμα μας: import java.sql.*; Connecting to database: Connection dbcon; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); dbcon = DriverManager.getConnection(“jdbc:odbc:employeedb”); • Χρειάζεται να δηλώσουμε μία μεταβλητή τύπου Connection • Πρέπει να δηλώσουμε τι είδους JDBC driver θα χρησιμοποιήσουμε • Εάν είναι JDBC-ODBC bridge, πρέπει να δηλώσουμε το όνομα του ODBC
Eπικοινωνία με διεπαφή JDBC/ODBC– Εκτέλεση SQL Πρέπει να δηλώσουμε ένα SQL statement (όχι insert/delete/update), να το εκτελέσουμεκαι να πάρουμε το αποτέλεσμα. Statement stmt = dbcon.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM Employee ORDER BY Salary"); while (rs.next()) { out.println(rs.getString(“SSN")); out.println(rs.getString(“Name")); out.println(rs.getString(“Salary")); } rs.close(); stmt.close(); λογικός δρομέας όνομα γνωρίσματος
Eπικοινωνία με διεπαφή JDBC/ODBC– Εκτέλεση SQL Πρέπει να δηλώσουμε ένα SQL statement (insert/delete/update) και να το εκτελέσουμε. Statement stmt = dbcon.createStatement(); stmt.executeUpdate("UPDATE Employee SET Salary = Salary * 1.05”); stmt.close(); Τέλος πρέπει να κλείσουμε τη σύνδεση με τη ΒΔ: dbcon.close();
Eπικοινωνία με διεπαφή JDBC/ODBC– Java Παράδειγμα Το επόμενο παράδειγμα εισάγει έναν υπάλληλο, αφού πρώτα ελέγξει αν υπάρχει άλλος με το ίδιο SSN. import java.io.*; import java.text.*; import java.util.*; import java.sql.*; public class example { public static void main(String args[]) { Connection dbcon; String url = "jdbc:odbc:employeedb"; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); dbcon = DriverManager.getConnection(url,“sa", ""); Statement stmt; ResultSet rs; int rec_counter; String SSN = “230102211”; String Name = “John Johnson”; int Salary = 4301; int DeptCode = 312;
Eπικοινωνία με διεπαφή JDBC/ODBC– Java Παράδειγμα • Το επόμενο παράδειγμα εισάγει έναν υπάλληλο, αφού πρώτα ελέγξει αν υπάρχει άλλος με το ίδιο SSN (συνέχεια). stmt = dbcon.createStatement(); rs = stmt.executeQuery("SELECT * FROM Employee WHERE SSN=‘"+SSN+”’”); rec_counter=0; while (rs.next()) { rec_counter++; if (rec_counter==1) break; } rs.close(); if (rec_counter!=0) // SSN already exists System.out.println("Code already exists. Try again."); else // create new item stmt.executeUpdate("INSERT INTO Employee VALUES (‘“+ SSN +“’,’” + Name + ”’,” + Salary+”,” + DeptCode + ”)”); stmt.close(); dbcon.close(); } }
Άσκηση • Έστω ότι έχετε την ακόλουθη περιγραφή ενός πίνακα: Sales(cust_idint, prod_id int , day int, month int, year int, amount real) • Γράψτε ένα Java πρόγραμμα που να παίρνει σαν παράμετρο τον αριθμό πελάτηκαι να υπολογίζει το σύνολο των αγορών του το μήνα Ιούνιο του 2001.
Λύση import java.io.*; import java.text.*; import java.util.*; import java.sql.*; public class DBexample1 { public static void main(String args[]) { float total=0, amount; int month, year, cust; String url = "jdbc:odbc:salesdb"; Connection dbcon ; Statement stmt; ResultSet rs;
/* declare ODBC conectivity */ try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(java.lang.ClassNotFoundException e) { System.out.print("ClassNotFoundException: "); System.out.println(e.getMessage()); } /* execute SQL statements */ try { dbcon = DriverManager.getConnection(url,"",""); stmt = dbcon.createStatement(); rs = stmt.executeQuery("SELECT * FROM Sales"); while (rs.next()) { cust=rs.getInt("cust_id"); month=rs.getInt("month"); year=rs.getInt("year"); amount=rs.getFloat("amount"); if (cust==2 && month==6 && year==2001) total+=amount; } rs.close(); System.out.println(total); stmt.close(); dbcon.close(); } catch(SQLException e) { System.out.print("SQLException: "); System.out.println(e.getMessage()); } } }