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_id int, 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 */ 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: ");