Προγραμματισμός

Τι είναι το JDBC; Εισαγωγή στη συνδεσιμότητα βάσεων δεδομένων Java

Το JDBC (Java Database Connectivity) είναι το Java API που διαχειρίζεται τη σύνδεση σε μια βάση δεδομένων, την έκδοση ερωτημάτων και εντολών και το χειρισμό συνόλων αποτελεσμάτων που λαμβάνονται από τη βάση δεδομένων. Κυκλοφόρησε ως μέρος του JDK 1.1 το 1997, το JDBC ήταν ένα από τα πρώτα συστατικά που αναπτύχθηκαν για το επίπεδο επιμονής Java.

Το JDBC σχεδιάστηκε αρχικά ως API από την πλευρά του πελάτη, επιτρέποντας σε έναν πελάτη Java να αλληλεπιδρά με μια πηγή δεδομένων. Αυτό άλλαξε με το JDCB 2.0, το οποίο περιελάμβανε ένα προαιρετικό πακέτο που υποστηρίζει συνδέσεις JDBC από διακομιστή. Κάθε νέα έκδοση JDBC έκτοτε διαθέτει ενημερωμένες εκδόσεις τόσο στο πακέτο πελάτη (java.sql) και το πακέτο από τον διακομιστή (javax.sql). Το JDBC 4.3, η πιο πρόσφατη έκδοση αυτού του κειμένου, κυκλοφόρησε ως μέρος του Java SE 9 τον Σεπτέμβριο του 2017.

Αυτό το άρθρο παρουσιάζει μια επισκόπηση του JDBC, ακολουθούμενη από μια πρακτική εισαγωγή στη χρήση του JDBC API για τη σύνδεση ενός προγράμματος-πελάτη Java με το SQLite, μια ελαφριά σχεσιακή βάση δεδομένων.

Πώς λειτουργεί το JDBC

Αναπτύχθηκε ως εναλλακτική λύση για το ODBC που βασίζεται σε C (Open Database Connectivity) API, το JDBC προσφέρει μια διεπαφή επιπέδου προγραμματισμού που χειρίζεται τους μηχανισμούς εφαρμογών Java που επικοινωνούν με μια βάση δεδομένων ή RDBMS. Η διεπαφή JDBC αποτελείται από δύο επίπεδα:

  1. Το JDBC API υποστηρίζει επικοινωνία μεταξύ της εφαρμογής Java και του διαχειριστή JDBC.
  2. Το πρόγραμμα οδήγησης JDBC υποστηρίζει επικοινωνία μεταξύ του διαχειριστή JDBC και του προγράμματος οδήγησης βάσης δεδομένων.

Το JDBC είναι το κοινό API με το οποίο αλληλεπιδρά ο κώδικας της εφαρμογής σας. Κάτω από αυτό είναι το πρόγραμμα οδήγησης συμβατό με το JDBC για τη βάση δεδομένων που χρησιμοποιείτε.

Το Σχήμα 1 είναι μια αρχιτεκτονική επισκόπηση του JDBC στο επίπεδο επιμονής Java.

JavaWorld /

Χρήση του JDBC για σύνδεση σε μια βάση δεδομένων

Ένα από τα τυχερά γεγονότα του προγραμματισμού στο οικοσύστημα Java είναι ότι πιθανότατα θα βρείτε έναν σταθερό σύνδεσμο βάσης δεδομένων JDBC για οποιαδήποτε βάση δεδομένων θα επιλέξετε. Σε αυτό το σεμινάριο θα χρησιμοποιήσουμε το SQLite για να γνωρίσουμε το JDBC, κυρίως επειδή είναι τόσο εύκολο στη χρήση.

Τα βήματα για τη σύνδεση σε μια βάση δεδομένων με JDBC είναι τα εξής:

  1. Εγκαταστήστε ή εντοπίστε τη βάση δεδομένων στην οποία θέλετε να αποκτήσετε πρόσβαση.
  2. Συμπεριλάβετε τη βιβλιοθήκη JDBC.
  3. Βεβαιωθείτε ότι το πρόγραμμα οδήγησης JDBC που χρειάζεστε είναι στο classpath σας.
  4. Χρησιμοποιήστε τη βιβλιοθήκη JDBC για να αποκτήσετε σύνδεση με τη βάση δεδομένων.
  5. Χρησιμοποιήστε τη σύνδεση για να εκδώσετε εντολές SQL.
  6. Κλείστε τη σύνδεση όταν τελειώσετε.

Θα ακολουθήσουμε αυτά τα βήματα μαζί.

Εύρεση προγράμματος οδήγησης JDBC

Για να βρείτε ένα πρόγραμμα οδήγησης για τη βάση δεδομένων που θέλετε να χρησιμοποιήσετε, κάντε απλώς μια αναζήτηση ιστού για τη βάση δεδομένων σας και το JDBC. Για παράδειγμα, πληκτρολογώντας "πρόγραμμα οδήγησης mysql jdbc"θα εμφανίσει ένα πρόγραμμα οδήγησης για MySQL. Σας προκαλώ να βρείτε μια συμβατή με Java βάση δεδομένων χωρίς πρόγραμμα οδήγησης JDBC!

Βήμα 1. Λήψη και εγκατάσταση του SQLite

Το SQLite είναι μια πολύ συμπαγής βάση δεδομένων. Δεν προορίζεται για χρήση στην παραγωγή, αλλά είναι μια εξαιρετική επιλογή για γρήγορη δοκιμή των πραγμάτων. Το SQLite χρησιμοποιεί ένα αρχείο ως λειτουργική βάση δεδομένων του, χωρίς να χρειάζεται εγκατάσταση υπηρεσίας ή δαίμονα.

Για να ξεκινήσετε με αυτήν την επίδειξη, προχωρήστε και κατεβάστε το δείγμα βάσης δεδομένων SQLite. Αποσυμπιέστε το .db αρχείο και να το αποθηκεύσετε κάπου που δεν θα ξεχάσετε.

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

SQL και JDBC

Η NoSQL έχει γίνει δημοφιλής την τελευταία δεκαετία, αλλά οι σχεσιακές βάσεις δεδομένων παραμένουν ο πιο κοινός τύπος δεδομένων που χρησιμοποιείται. ΕΝΑ σχεσιακή βάση δεδομένων είναι ένα δομημένο αποθετήριο που αποτελείται από πίνακες με στήλες και σειρές. Το SQL (Structured Query Language) είναι η γλώσσα δεδομένων που χρησιμοποιούν οι αρχιτέκτονες για να κάνουν πράγματα όπως δημιουργία, ανάγνωση, ενημέρωση και διαγραφή νέων εγγραφών σε σχεσιακή βάση δεδομένων. Το JDBC είναι ένα στρώμα προσαρμογέα από Java σε SQL: δίνει στους προγραμματιστές Java μια κοινή διεπαφή για τη σύνδεση σε μια βάση δεδομένων, την έκδοση ερωτημάτων και εντολών και τη διαχείριση απαντήσεων.

Βήμα 2. Εισαγωγή JDBC στην εφαρμογή Java

Θα μπορούσαμε να κάνουμε την κωδικοποίησή μας σε ένα IDE, αλλά η κωδικοποίηση απευθείας σε ένα πρόγραμμα επεξεργασίας κειμένου θα δείξει καλύτερα την απλότητα του JDBC. Για να ξεκινήσετε, θα πρέπει να έχετε μια συμβατή εγκατάσταση JDK για το λειτουργικό σας σύστημα.

Υποθέτοντας ότι έχετε εγκαταστήσει τα εργαλεία προγραμματιστή πλατφόρμας Java, μπορούμε να ξεκινήσουμε δημιουργώντας ένα απλό πρόγραμμα Java. Στον επεξεργαστή κειμένου, επικολλήστε τον κωδικό που εμφανίζεται στην καταχώριση 1. Καλέστε αυτό το αρχείο WhatIsJdbc.java.

Λίστα 1. Ένα απλό πρόγραμμα Java

 τάξη WhatIsJdbc {public static void main (String args []) {System.out.println ("Hello JavaWorld"); }} 

Τώρα συντάξτε τον κωδικό εισάγοντας την εντολή: javac WhatIsJdbc.java. Η σύνταξη θα εμφανίσει το WhatIsJdbc.class αρχείο. Εκτελέστε αυτό το αρχείο από τη γραμμή εντολών με την κλήση: java WhatIsJdbc.

[Δείτε "Τι είναι το JDK; Εισαγωγή στο Java Developer Kit" για περισσότερα σχετικά με την αλληλεπίδραση με το JDK στη γραμμή εντολών.]

Μόλις έχετε ένα βασικό πρόγραμμα Java, μπορείτε να συμπεριλάβετε τις βιβλιοθήκες JDBC. Επικολλήστε τον κωδικό από την Καταχώριση 2 στην κορυφή του απλού προγράμματος Java.

Λίστα 2. Εισαγωγές JDBC

 εισαγωγή java.sql.Connection; εισαγωγή java.sql.DriverManager; εισαγωγή java.sql.SQLException; εισαγωγή java.sql.ResultSet; εισαγωγή java.sql. Δήλωση; 

Κάθε μία από αυτές τις εισαγωγές παρέχει πρόσβαση σε μια κλάση που διευκολύνει την τυπική σύνδεση βάσης δεδομένων Java:

  • Σύνδεση αντιπροσωπεύει τη σύνδεση με τη βάση δεδομένων.
  • Πρόγραμμα οδήγησης αποκτά τη σύνδεση με τη βάση δεδομένων. (Μια άλλη επιλογή είναι Πηγή δεδομένων, χρησιμοποιείται για ομαδοποίηση σύνδεσης. )
  • SQLException χειρίζεται σφάλματα SQL μεταξύ της εφαρμογής Java και της βάσης δεδομένων.
  • Αποτέλεσμα και Δήλωση μοντελοποιήστε τα σύνολα αποτελεσμάτων δεδομένων και τις δηλώσεις SQL.

Θα δούμε όλα αυτά σε δράση σύντομα.

Βήμα 3. Προσθέστε το πρόγραμμα οδήγησης JDBC στο classpath σας

Στη συνέχεια, θα προσθέσετε το πρόγραμμα οδήγησης SQLite στο classpath σας. ΕΝΑ Πρόγραμμα οδήγησης JDBC είναι μια κλάση που εφαρμόζει το JDBC API για μια συγκεκριμένη βάση δεδομένων.

Κατεβάστε το πρόγραμμα οδήγησης SQLite από το GitHub. Φροντίστε να λάβετε το πιο πρόσφατο .δοχείο αρχειοθετήστε και αποθηκεύστε το κάπου που θα θυμάστε.

Την επόμενη φορά που θα εκτελέσετε το πρόγραμμα Java, θα το τραβήξετε .δοχείο αρχείο μέσα από το classpath. Υπάρχουν διάφοροι τρόποι για να ρυθμίσετε το classpath. Η λίστα 3 δείχνει πώς να το κάνετε χρησιμοποιώντας έναν διακόπτη γραμμής εντολών.

Λίστα 3. Εκτέλεση προγράμματος οδήγησης SQLite στο Java classpath

 java.exe -classpath /path-to-driver/sqlite-jdbc-3.23.1.jar :. WhatIsJdbc 

Παρατηρήστε ότι έχουμε ρυθμίσει το classpath να δείχνει στο πρόγραμμα οδήγησης και τον τοπικό κατάλογο · με αυτόν τον τρόπο η Java θα βρει ακόμα το αρχείο τάξης μας.

Βήμα 4. Αποκτήστε μια σύνδεση βάσης δεδομένων

Το classpath έχει πλέον πρόσβαση στο πρόγραμμα οδήγησης. Τώρα, αλλάξτε το απλό αρχείο της εφαρμογής Java για να μοιάζει με το πρόγραμμα στην Λίστα 4.

Λίστα 4. Χρησιμοποιώντας την κλάση JDBC Connection για σύνδεση στο SQLite

 εισαγωγή java.sql.Connection; εισαγωγή java.sql.DriverManager; εισαγωγή java.sql.SQLException; εισαγωγή java.sql.ResultSet; εισαγωγή java.sql. Δήλωση; τάξη WhatIsJdbc {public static void main (String [] args) {Connection conn = null; δοκιμάστε το {String url = "jdbc: sqlite: path-to-db / chinook / chinook.db"; conn = DriverManager.getConnection (url); System.out.println ("Το κατάλαβα!"); } catch (SQLException e) {ρίξτε νέο σφάλμα ("Πρόβλημα", e); } τέλος {δοκιμάστε {if (conn! = null) {conn.close (); }} catch (SQLException ex) {System.out.println (ex.getMessage ()); }}}} 

Μεταγλώττιση και εκτέλεση αυτού του κώδικα. Υποθέτοντας ότι όλα πάνε καλά, θα λάβετε ένα επιβεβαιωτικό μήνυμα.

Δεν βρέθηκε κατάλληλο πρόγραμμα οδήγησης;

Εάν έχετε λάβει ένα σφάλμα που μοιάζει με "Δεν βρέθηκε κατάλληλο πρόγραμμα οδήγησης για jdbc: sqlite, "τότε πρέπει να επανεξετάσετε το classpath και να βεβαιωθείτε ότι οδηγεί στο πρόγραμμα οδήγησης που κατεβάσατε. Η αποτυχημένη σύνδεση προγράμματος οδήγησης είναι το πιο κοινό εμπόδιο για αρχάριους που χρησιμοποιούν το JDBC. Μην το ιδρώνετε.

Τώρα είμαστε έτοιμοι για ορισμένες εντολές SQL.

Βήμα 5. Ερώτηση της βάσης δεδομένων

Με το αντικείμενο ζωντανής σύνδεσης στο χέρι, μπορούμε να κάνουμε κάτι χρήσιμο, όπως το ερώτημα της βάσης δεδομένων. Η λίστα 5 δείχνει πώς να κάνετε ερώτημα για το SQLite χρησιμοποιώντας το JDBC Σύνδεση και Δήλωση αντικείμενα.

Λίστα 5. Ερώτηση της βάσης δεδομένων με JDBC

 εισαγωγή java.sql.Connection; εισαγωγή java.sql.DriverManager; εισαγωγή java.sql.SQLException; εισαγωγή java.sql.ResultSet; εισαγωγή java.sql. Δήλωση; τάξη WhatIsJdbc {public static void main (String [] args) {Connection conn = null; δοκιμάστε το {String url = "jdbc: sqlite: path-to-db-file / chinook / chinook.db"; conn = DriverManager.getConnection (url); Δήλωση stmt = null; String query = "επιλέξτε * από άλμπουμ"; δοκιμάστε το {stmt = conn.createStatement (); ResultSet rs = stmt.executeQuery (ερώτημα); ενώ (rs.next ()) {String name = rs.getString ("title"); System.out.println (όνομα); }} catch (SQLException e) {ρίξτε νέο σφάλμα ("Πρόβλημα", e); } τελικά {if (stmt! = null) {stmt.close (); }}} catch (SQLException e) {ρίξτε νέο σφάλμα ("Πρόβλημα", e); } τέλος {δοκιμάστε {if (conn! = null) {conn.close (); }} catch (SQLException ex) {System.out.println (ex.getMessage ()); }}}} 

Στη λίστα 5 χρησιμοποιούμε το δικό μας Σύνδεση αντικείμενο για απόκτηση α Δήλωση αντικείμενο: conn.createStatement (). Στη συνέχεια, χρησιμοποιούμε αυτό το αντικείμενο για να εκτελέσουμε ένα ερώτημα SQL: stmt.executeQuery (ερώτημα).

ο executeQuery η εντολή επιστρέφει a Αποτέλεσμα αντικείμενο, το οποίο στη συνέχεια χρησιμοποιούμε για να επαναλάβουμε τα δεδομένα με ενώ (rs.next ()). Σε αυτό το παράδειγμα, θα πρέπει να δείτε τους τίτλους του άλμπουμ για τους οποίους ερωτήσαμε ως έξοδο.

Σημειώστε ότι κλείσαμε επίσης τη σύνδεση, μέσω κλήσης προς conn.close ().

Συνδέσεις δικτύου με JDBC

Η συμβολοσειρά σύνδεσης βάσης δεδομένων στην λίστα 5 προορίζεται για τοπική σύνδεση: jdbc: sqlite: path-to-db-file / chinook / chinook.db. Για να αποκτήσετε πρόσβαση στη βάση δεδομένων μέσω δικτύου, η συμβολοσειρά σύνδεσης θα πρέπει να περιλαμβάνει τη διεύθυνση URL του δικτύου και (συνήθως) διαπιστευτήρια για την πρόσβαση σε αυτήν.

Κάνοντας περισσότερα με το JDBC

Μέχρι στιγμής έχουμε καλύψει τα βασικά της χρήσης του JDBC για σύνδεση σε μια βάση δεδομένων και έκδοση εντολών SQL. Ενώ Δηλώσειςs και ΑποτέλεσμαΛειτουργεί καλά για κοινά σενάρια, πιθανότατα θα χρειαστείτε πρόσθετες επιλογές για μεγαλύτερες ή πιο περίπλοκες εφαρμογές. Ευτυχώς, η βιβλιοθήκη JDBC συνεχίζει να εξελίσσεται για να καλύψει τις περισσότερες ανάγκες πρόσβασης στη βάση δεδομένων.

Προετοιμασμένες δηλώσεις

Ένας εύκολος τρόπος για να αυξήσετε την ευελιξία του κωδικού σας είναι να αντικαταστήσετε το Δήλωση τάξη με Προετοιμασμένη δήλωση, όπως φαίνεται στην καταχώριση 6.

Λίστα 6. Χρησιμοποιώντας JDBC PreparedStatements

 String prepState = "εισαγωγή σε τιμές άλμπουμ (?,?);"; PreparedStatement prepState = connection.prepareStatement (sql); prepState.setString (1, "Εξέγερση"); prepState.setString (2, "Bob Marley and the Wailers"); int rowsAffected = readyStatement.executeUpdate (); 

Προετοιμασμένη δήλωση αντικαθιστά ΔήλωσηΟι κωδικοποιημένες τιμές με ερωτηματικά (?). Χρησιμοποιώντας Προετοιμασμένη δήλωσηβελτιστοποιεί τον κωδικό σας για επαναχρησιμοποίηση: α Προετοιμασμένη δήλωση συλλέγεται μόνο μία φορά και μπορεί στη συνέχεια να επαναχρησιμοποιηθεί με μια ποικιλία παραμέτρων. Καθώς μεγαλώνει η βάση κώδικα, εισάγετε απλώς νέες τιμές στη δήλωση, αντί να κάνετε hacking το ίδιο το αντικείμενο συμβολοσειράς.

Μαζικές ενημερώσεις

Κάθε φορά που μια εφαρμογή έχει αρκετές ενημερώσεις για έκδοση, η πραγματοποίησή τους σε παρτίδες μπορεί να ωφελήσει σημαντικά την απόδοση. Η ουσία του παρτίδα είναι να λάβετε τις πολλαπλές ενημερώσεις και να τις συλλέξετε, στη συνέχεια να τις εκδώσετε ταυτόχρονα. Η λίστα 7 χρησιμοποιεί μεθόδους παρτίδας του JDBC για την πραγματοποίηση ενημέρωσης παρτίδων πολλών Προετοιμασμένη δήλωσημικρό.

Λίστα 7. Συγκέντρωση με PreparedStatement

 prepState.setString (1, "Εξέγερση"); prepState.setString (2, "Bob Marley and the Wailers"); readyStatement.addBatch (); prepState.setString (1, "Wildflowers"); prepState.setString (2, "Tom Petty and the Heartbreakers"); readyStatement.addBatch (); int [] rowsAffected = readyStatement.executeBatch (); 

Συναλλαγές JDBC

Οι συναλλαγές σε σχεσιακές βάσεις δεδομένων επιτρέπουν την ολοκλήρωση ενός συνόλου ενημερώσεων σε μια αλληλεπίδραση που είτε επιτυγχάνει είτε αποτυγχάνει εντελώς. Τα βασικά της χρήσης μιας συναλλαγής μέσω JDBC είναι να πείτε στο σύστημα να γυρίσει μακριά από αυτόματη δέσμευση και, στη συνέχεια, πείτε με μη αυτόματο τρόπο στο σύστημα να δεσμευτεί όταν τελειώσετε. Από προεπιλογή, η αυτόματη δέσμευση είναι επί, που σημαίνει όποτε executeUpdate ή executeInsert εκτελείται, η εντολή έχει δεσμευτεί.

Η λίστα 8 δείχνει ένα μικρό κομμάτι μιας συναλλαγής JDBC.

Λίστα 8. Συναλλαγές JDBC

 connection.setAutoCommit (false); // Χρησιμοποιήστε το executeUpdate πολλές φορές connection.commit (); 

Πότε connection.commit () Αντιμετωπίζεται, όλες οι ενημερώσεις που είναι τυλιγμένες στο εσωτερικό θα επιχειρήσουν, και αν αποτύχουν, όλες θα επιστραφούν.

Υπάρχουν πολλά περισσότερα χαρακτηριστικά στο JDBC 4.3 που αξίζει να εξερευνήσετε, συμπεριλαμβανομένης της χρήσης CallableStatement για αποθηκευμένες διαδικασίες, χρησιμοποιώντας Πηγή δεδομένων αντικείμενα για βελτιωμένη απόδοση εφαρμογής (ειδικά μέσω ομαδοποίησης σύνδεσης) και μετατροπή ενός JDBC ResultSet σε Java Stream.

Λειτουργίες για συγκεκριμένες βάσεις δεδομένων

Αν και κάθε βάση δεδομένων συμβατή με JDBC προσφέρει τις ίδιες βασικές δυνατότητες για σύνδεση και αλληλεπίδραση με μια βάση δεδομένων μέσω SQL, ορισμένες βάσεις δεδομένων κάνουν περισσότερα από άλλα. Για παράδειγμα, το Oracle DB προσφέρει προσωρινή αποθήκευση αποτελεσμάτων, η οποία δεν απαιτείται από τις προδιαγραφές JDBC. Ακολουθεί ένα παράδειγμα:

 conn.prepareStatement ("select / * + result_cache * / * από υπαλλήλους όπου υπάλληλος_id <: 1"); 

Αυτό το παράδειγμα προέρχεται από την τεκμηρίωση για το Oracle's JDBC OCI Driver.

συμπέρασμα

Το JDBC είναι ένα από τα παλαιότερα API της Java, παρέχοντας μια εύχρηστη λύση για μία από τις πολυετείς ανάγκες ανάπτυξης εφαρμογών Java. Γνωρίζοντας μόνο τις λίγες κλήσεις JDBC που εμφανίζονται σε αυτό το άρθρο θα ξεκινήσετε να χρησιμοποιείτε το JDBC για να συνδεθείτε σε σχεδόν οποιαδήποτε βάση δεδομένων. Μόλις κατεβάσετε αυτές τις εντολές, μπορείτε να αρχίσετε να εξερευνάτε μερικές από τις πιο εξελιγμένες επιλογές που έχουν ενσωματωθεί στο JDBC.

Ενώ το JDBC είναι αρκετό για απλούστερες εφαρμογές, οι περισσότεροι προγραμματιστές θα κοιτάξουν τελικά το Java Persistence API (JPA) για να αναπτύξουν ένα πιο επίσημο επίπεδο πρόσβασης δεδομένων. Το JPA απαιτεί περισσότερη εκ των προτέρων εργασία και μια πιο εξελιγμένη κατανόηση της αρχιτεκτονικής της εφαρμογής, αλλά σας προσφέρει ένα πιο συνεπές, απομονωμένο και καλά καθορισμένο επίπεδο πρόσβασης δεδομένων. Ανατρέξτε στον σύντροφο αυτού του άρθρου, "Τι είναι το JPA; Εισαγωγή στο Java Persistence API" για περισσότερα σχετικά με την ανάπτυξη του επιπέδου επιμονής δεδομένων για τις εφαρμογές σας Java.

Αυτή η ιστορία, "Τι είναι το JDBC; Εισαγωγή στο Java Database Connectivity" δημοσιεύθηκε αρχικά από το JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found