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

needlebookkeeperSoftware and s/w Development

Nov 17, 2012 (4 years and 11 months ago)

267 views

Τεχνολογία 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;