Απλή εφαρμογή JDBC (SQLite και MySQL)

Για το παράδειγμα που ακολουθεί πρέπει να μεταφορτώσετε το αρχείο SQLiteTest.zip. O κώδικας που ακολουθεί είναι ένα πολύ απλό πρόγραμμα Java που διαχειρίζεται μια απλή βάση δεδομένων του RDBMS SQLite με όνομα test.db.

import java.sql.*;

public class Test {

public static void main(String[] args) {

System.out.println("Testing SQLite Base.");
try {
Class.forName("org.sqlite.JDBC");

String url = "jdbc:sqlite:test.db";
Connection con = DriverManager.getConnection(url);

DatabaseMetaData dbMetaData = con.getMetaData();
String productName = dbMetaData.getDatabaseProductName();
System.out.println("Database: " + productName);
String productVersion = dbMetaData.getDatabaseProductVersion();
System.out.println("Version: " + productVersion);

Statement st = con.createStatement();

st.execute("create table student(id integer, name varchar(255))");

st.execute("insert into student values (5, 'A')");
st.execute("insert into student values (6, 'B')");

String query = "select * from student";
ResultSet rs = st.executeQuery(query);
while (rs.next()) {
System.out.println(rs.getString(2));
}

rs.close();
st.close();
con.close();

} catch(Exception e) {
System.out.println(e);
}

System.out.println("End of testing.");
}
}
Τα σημαντικά μέρη του κώδικα είναι τα παρακάτω:

1. Φόρτωμα JDBC Driver. Η εντολή
Class.forName("org.sqlite.JDBC")
φορτώνει το JDBC driver του DBMS SQLite κατά την εκτέλεση, όχι κατά τη μεταγλώττιση. Το όνομα διαδρομής της κλάσης του JDBC driver μπορεί να είναι σχετικό ή απόλυτο. Σε περίπτωση που ο JDBC driver διατίθεται σε jar τότε το όνομα διαδρομής πρέπει να περιληφθεί στο CLASSPATH της JVM κατά την εκτέλεση:
$java -cp .:<jdbc.classpath.jar> Test
2. Καθορισμός του URL της βάσης με την οποία θα συνδεθούμε. Οι εντολές
String url = "jdbc:sqlite:test.db";
Connection con = DriverManager.getConnection(url);
ορίζουν οτι η βάση test.db είναι αυτή με την οποία θα συνδεθούμε. Τα δύο πρώτα τμήματα του URL string είναι προφανή. Το τρίτο μέρος μπορεί να είναι ένα πλήρες URL, της μορφής http://hostname:port:pathname. Στη περίπτωσή μας ή βάση test.db βρίσκεται στον ίδιο κατάλογο με το πρόγραμμα που εκτελείται (σχετικό όνομα διαδρομής). Κατόπιν δημιουργούμε ένα αντικείμενο Connection

Σε περίπτωση άλλου DBMS η σύνταξη της μεθόδου getConnection() μπορεί να είναι διαφορετική, αν για παράδειγμα το DBMS απαιτεί όνομα χρήστη, συνθηματικό κλπ. Ακολουθεί παράδειγμα σύνδεσης με DBMS Oracle
String host = "dbhost.yourcompany.com";
String dbName = "someName";
int port = 1234;
String oracleURL = "jdbc:oracle:thin:@" + host + ":" + port + ":" + dbName;
String username = "jay_debesee";
String password = "secret";
Connection con = DriverManager.getConnection(oracleURL, username, password);
και ένα παράδειγμα MySQL
String url = "jdbc:mysql://dbhost.yourcompany.com/someName";
String username = "jay_debesee";
String password = "secret";
Connection con = DriverManager.getConnection(url, username, password);
Tο αρχείο MySQLTest.java. περιέχει τον ίδιο απλό κώδικα για MySQL βάση, αλλά δεν περιέχε JDBC driver και προυποθέτει σύνδεση με απομακρυσμένη βάση.

3. Το επόμενο βήμα είναι προαιρετικό και επιτρέπει την ανάκτηση μετα-δεδομένων του DBMS. Οι εντολές
DatabaseMetaData dbMetaData = con.getMetaData();
String productName = dbMetaData.getDatabaseProductName();
System.out.println("Database: " + productName);
String productVersion = dbMetaData.getDatabaseProductVersion();
System.out.println("Version: " + productVersion);
εμφανίζουν στοιχεία όπως το τύπο και την έκδοση του DBMS.

4. Δημιουργία αντικειμένου Statemenent. Η εντολή
Statement st = con.createStatement();
δημιουργεί ένα αντικείμενο Statement μέσω του οποίου αποστέλονται ερωτήματα στη βάση δεδομένων.

5. Εκτέλεση ερωτημάτων που δεν επιστρέφουν αποτέλεσμα. Οι εντολές
st.execute("create table student(id integer, name varchar(255))");

st.execute("insert into student values (5, 'A')");
st.execute("insert into student values (6, 'B')");
εκτελούν ερωτήματα SQL μέσω του αντικείμενου Statement στη βάση. Το πρώτο ερώτημα δημιουργεί ένα πίνακα με δύο στήλες. Τα άλλα δύο ερωτήματα εισάγουν από μία γραμμή το καθένα στο πίνακα.

6. Εκτέλεση ερωτημάτων που επιστρέφουν αποτέλεσμα. Οι εντολές
String query = "select * from student";
ResultSet rs = st.executeQuery(query);
while (rs.next()) {
System.out.println(rs.getString(2));
}
δημιουργούν ένα ερώτημα SQL στο string query. Το αποτέλεσμα εκτέλεσης του ερωτήματος επιστρέφει στο αντικείμενο ResultSet rs. Ο βρόχος while εμφανίζει τα αποτελέσματα του ερωτήματος όσο το rs περιέχει αποτελέσματα.

7. Κλείσιμο σύνδεσης. Οι εντολές
rs.close();
st.close();
con.close();
κλείνουν τα αντικείμενα ResultSet, Satement και Connection.

Εξαιρέσεις (Exceptions): το μεγαλύτερο τμήμα του κώδικα περικλείεται σε ένα try - catch που συλλαβάνει σφάλματα σχετικά με το JDBC. Εναλλακτικά θα μπορούσαμε να έχουμε ξεχωριστά try - catch blocks σε κάθε ενότητα του κώδικα, πράγμα που θα μας επέτρεπε λεπτομερέστερο χειρισμό των εξαιρέσεων (βλ. το πιο σύνθετο παράδειγμα JDBC).