Τεχνολογία JDBC (Java Database Connectivity)

needlebookkeeperΛογισμικό & κατασκευή λογ/κού

17 Νοε 2012 (πριν από 4 χρόνια και 4 μήνες)

245 εμφανίσεις

Τεχνολογία JDBC (Java Database Connectivity)
Eίναι interface (API) για την
Java
που ορίζει πώς ένας χρήστης πορεί να έχει πρόσβαση σε
ια
βάση δεδοένων
. Παρέχει συναρτήσεις για εξαγωγή, πρόσθεση, ανανέωση ή διαγραφή
δεδοένων σε ια βάση. (Theory4.pdf σ.21,37)

1. ΣΥΝ ΕΣΗ ε τη βάση (postgreSQL) που περιλαβάνει δύο βήατα:
￿ Φόρτωση του οδηγού επικοινωνίας (driver) που θα επικοινωνεί ε τη βάση
Class.forName("jdbc.DriverXYZ");
org.postgresql.Driver
￿ ηιουργία της σύνδεσης
Connection dbConnection = DriverManager.getConnection(url,“myLogin", "myPassword");

Το url, είναι διεύθυνση στην οποία βρίσκεται η βάση, π.χ. αν χρησιοποιείται ο οδηγός
JDBC-ODBC, τότε το url θα αρχίζει ε “jdbc:odbc:”. Το υπόλοιπο τήα της διεύθυνσης
συνήθως είναι η πηγή δεδοένων (DSN) ή το όνοα της βάσης.
Η όνη έθοδος της κλάσης DriverManager που θα χρειαστεί να χρησιοποιήσετε, είναι η
getConnection(). Με αυτή τη έθοδο δηιουργείται η σύνδεση ε τη βάση η οποία ένει
ανοιχτή
για χρήση σε όλη τη διάρκεια του προγράατος ή έχρι να γίνει η αποσύνδεση.
Η πρόσβαση στη βάση γίνεται έσω του αντικειένου dbConnection.

Σηείωση: Ο driver για την postgres βρίσκεται στο Blackboard (Έγγραφα Μαθήατος – Εργαλεία Μαθήατος – jdbc
drivers-
postgresql-8.3-603.jdbc4.jar
για λεπτοέρειες στο
jdbc.postgresql.org/download_html
) και να δηλωθεί στο NetBeans
Libraries /Run
import
java.sql.*;

public

class
Main {

static
String driverClassName

= "org.postgresql.Driver" ;

static
String url = "jdbc:postgresql://aetos.it.teithe.gr:5432/db2lab2";

static
Connection dbConnection = null;

static
Statement statement = null;


public static void
main (String[] args) {

try
{
Class.forName(driverClassName);
dbConnection = DriverManager.getConnection (url, "db303
", "29J25
");

statement = dbConnection.createStatement();
//……………
statement.close();
dbConnection.close();
}

catch
(ClassNotFoundException e) {
System.out.println("No such class:"+e.getMessage()); }

catch
(SQLException s) {
System.out.println("Connection error"+s.getMessage()); }
}
}
2. ηιουργία εντολών ε JDBC
Για την εκτέλεση των εντολών SQL έσω του JDBC χρησιοποιούε τα αντικείενα
Statement. Το αντικείενο Statement στέλνει την εντολή SQL στη βάση δεδοένων και την
εκτελεί, επιστρέφοντας τα αποτελέσατα ε ορφή που διευκολύνει την επεξεργασία τους.
Υπάρχουν δύο έθοδοι εκτέλεσης της εντολής ε το Statement, η

executeUpdate() που χρησιοποιείται για εντολές που δηιουργούν ή εταβάλλουν τα
περιεχόενα των πινάκων και η

executeQuery() που χρησιοποιείται για εντολές SELECT
Ο τρόπος χρήσης του Statement είναι ο εξής:
Αρχικά δηιουργούε το αντικείενο statement και του περνάε την εντολή προς εκτέλεση ε
τη έθοδο executeUpdate().

statement = dbConnection.createStatement();

statement.executeUpdate(
"DROP TABLE Boats"
);
statement.executeUpdate(
"CREATE TABLE Boats(bid integer not null primary key, bname char(20
)
,"
+

"color char(20))"
);

Με τον ίδιο τρόπο χωρίς να δηιουργούε άλλο αντικείενο Statement αλλά χρησιοποιώντας
το ίδιο εισάγουε τις εγγραφές και δηιουργούε ή διαγράφουε άλλους πίνακες.

￿ Εισαγωγή δεδοένων σε πίνακα

statement.executeUpdate(
"INSERT INTO Boats(bid, bname, color) values (101, 'Interlake', 'blue')"
);

￿ Ανάκτηση δεδοένων από πίνακα
Για να έχουε αυτά τα αποτελέσατα στη Java θα πρέπει να χρησιοποιήσουε την κλάση
ResultSet του JDBC.

static
ResultSet rs=
null
;

rs=statement.executeQuery( “
SELECT bname,color From Boats
” );

3. Ανάκτηση τιών από τα ResultSet

Η εταβλητή rs περιέχει το αποτέλεσα της εντολής SELECT, το οποίο πορούε να
επεξεργαστούε. Η επεξεργασία όως γίνεται γραή προς γραή και θα πρέπει να
πορούε να εταφερόαστε ε κάποιο τρόπο.
Το πρότυπο JDBC 1.0 επιτρέπει όνο την ετακίνηση προς τα κάτω (δηλαδή από την πρώτη
γραή στις επόενες), ενώ ε το JDBC 2.0 και 3.0 είναι πλέον δυνατή η ετακίνηση σε όλο το
πλήθος των γραών των αποτελεσάτων..

Χρήση των εθόδων next και get
Η ετακίνηση σε επόενες γραές γίνεται ε τη έθοδο next() του ResultSet, ε την οποία
ετακινούε τον δροέα/cursor στα αποτελέσατα του πίνακα και κάθε φορά επεξεργαζόαστε
την γραή στην οποία βρίσκεται ο δροέας.
Η αρχική τρέχουσα γραή είναι πάνω από την πρώτη γραή των αποτελεσάτων που
επιστρέφονται ε το ResultSet (που ε τη σειρά τους εξαρτώνται από την εντολή SQL που
εκτελούε ε την executeQuery()).
Έτσι ακόη και αν το αποτέλεσα ResultSet περιέχει όνο ια γραή, πάλι θα πρέπει να
εκτελέσουε ια φορά τη έθοδο next() για αυτό το ResultSet.

while
(rs.next()) {
String bname = rs.getString(
"bname"
);
// getString( 1 );
String bcolor = rs.getString(
"color"
);
// getString( 2 );

System.out.println( bname +
" "
+ bcolor );
}
Από την τρέχουσα γραή, πορούε να πάρουε τις τιές της γραής που αντιστοιχούν
στα πεδία του πίνακα. Επειδή οι τιές αυτές είναι διαφόρων τύπων η κάθε ία, αναλόγως πώς
δηιουργήσαε τον πίνακα ε την CREATE TABLE, θα πρέπει να τις αντιστοιχίσουε σε
εταβλητές αντίστοιχου τύπου στη Java
getString()
getFloat()
getDate() …

4. Αποσύνδεση
Η σύνδεση ε τη βάση ένει ανοιχτή
για χρήση σε όλη τη διάρκεια του προγράατος ή χρήση
ενός ερωτήατος και ένει έχρι να γίνει η αποσύνδεση.

statement.close();
//κλείσιο του αντικειένου που στέλνει στη βάση εντολές
SQL

dbConnection.close();
//αποσύνδεση

1. *ηιουργία (CREATE TABLE…) των τριών πινάκων SAILORS,BOATS,RESERVES

2. Εισαγωγή των δεδοένων (INSERT INTO …)

3. *ηιουργία και εκτέλεση των 8 ερωτήσεων (SELECT …)

ΟΛΕΣ ΟΙ AΣΚΗΣΕΙΣ ΝΑ Σ0ΘΟΥΝ …

 Προσοχή όταν χωρίζονται ε + , τα SQL string, να αφήνονται τα απαραίτητα κενά π.χ.
ss = "SELECT S.sname,S.Sid FROM Sailors S"+
" WHERE NOT EXISTS ( "+
" SELECT * from Boats B "+
" … ;";
1. 10 rec (όλες)
SELECT sname,age From Sailors;
2. 3 rec (Dustin, Lubber,Horatio)
SELECT S.sname From SAILORS S, RESERVES R
WHERE S.Sid=R.Sid AND R.bid=103;
3. Οι Horatio έχουν κλιάκιο 7,9 άρα εγαλύτερα από 9 έχουν
2 rec (Rusty,Zorba).
SELECT S.sname FROM SAILORS S
WHERE S.rating > ANY --- ALL
(SELECT S.rating FROM sailors S WHERE S.sname = 'Horatio');

4. 1 rec (Dustin) πορείτε να χρησιοποιήσετε το ΕΧΙST
SELECT S.sname,S.Sid FROM Sailors S
WHERE NOT EXISTS (
SELECT * from Boats B
WHERE NOT EXISTS (
SELECT * from Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid)) ;
5. 6 rec (6 διαφορετικά κλιάκια) AVG και GROUP BY
SELECT AVG(Age),rating FROM SAILORS GROUP BY rating;

6. Μ.Ο 6.857
SELECT AVG(Rating) FROM SAILORS where Age<45;
7. 9 rec (2 ίδιες dates)
SELECT COUNT(sid), day1 FROM RESERVES GROUP BY day1;

8. 2 rec (10/10/1998, 08/09/1998)
SELECT R.day1, COUNT(*) AS plithos FROM Reserves R
GROUP BY R.day1 HAVING COUNT(*) > 1;