JDBC σε 10 λεπτά


Μια σύντομη παρουσίαση του JDBC, σε μόλις 10 λεπτά.

Θα αποθηκεύσουμε άτομα στη βάση δεδομένων. Για κάθε άτομο μας ενδιαφέρει το όνομα, η ηλικία και ένας μοναδικός αριθμός (κλειδί).

Για τον σκοπό αυτό θα φτιάξουμε ακριβώς τρεις κλάσεις: Την Connector η οποία διαχειρίζεται τις συνδέσεις με την βάση, την Person που απεικονίζει ένα άτομο και την PersonHandler η οποία διαχειρίζεται τα άτομα ως προς την βάση (εισάγει, διαγράφει κλπ).

Το μοντέλο

Πρόκειται για ένα απλό javabean που περιέχει τις πληροφορίες που μας ενδιαφέρουν.

public class Person {
    private String name;
    private int age;
    private int id;
	
    // getters and setters
}

Η βάση δεδομένων

Για να φτιάξεις τη βάση στην MySQL γράψε διαδοχικά.

create database hello;
use hello;
CREATE TABLE persons (name VARCHAR(255), 
age SMALLINT, id BIGINT AUTO_INCREMENT, primary key (id));

Για περισσότερες πληροφορίες μπορείς να δεις εδώ.

Κατέβασε τον JDBC driver της MySQL από το mysql.com > downloads > Connectors > Connector/J > Source and Binaries (zip) > Pick a mirror > No thanks, just take me to the downloads > Greece [National Technical University of Athens] HTTP > mysql-connector-java-5.1.7.zip. Μέσα στο zip υπάρχει το mysql-connector-java-5.1.7-bin.jar, το οποίο θα μπει στο classpath του project.

Xρειαζόμαστε μια βολική κλάση η οποία θα μπορεί να συνδέεται και αποσυνδέεται. Να λοιπόν πώς συνδεόμαστε,

/**
 * Επιστρέφει μια σύνδεση με την βάση.
 * Φορτώνουμε τον JDBC driver, του δίνουμε 
 * το username και password, καθώς και το url 
 * της βάσης δεδομένων.
 */
public static Connection getConnection() throws Exception {
    Connection result = null;
    Class.forName("com.mysql.jdbc.Driver");
    String user = "nikos";
    String pass = "12345";
    String url = "jdbc:mysql://127.0.0.1/hello";
    result = DriverManager.getConnection(url, user, pass);
    result.setAutoCommit(false);
    return result;
}

και να πώς αποσυνδεόμαστε.

/**
 * Αποσυνδέεται από τη βάση.
 */
public static void disconnect(PreparedStatement statement,
    ResultSet set, Connection connection) throws Exception {
    if (statement != null) {
        statement.close();
    }
    if (set != null) {
        set.close();
    }
    if (connection != null) {
        connection.close();
    }
}

Αυτές λοιπόν οι δύο μέθοδοι ανήκουν στην κλάση Connector.

Εισαγωγή (insert)

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

public boolean insert(Person person) throws Exception {
    boolean result = false;
    Connection connection = null;
    PreparedStatement statement = null;
    String sql = "INSERT INTO persons(name, age) VALUES(?, ?)";
    try {
        // Σύνδεση
        connection = Connector.getConnection();
        // Προετοιμασία
        statement = connection.prepareStatement(sql);
        statement.setString(1, person.getName());
        statement.setInt(2, person.getAge());
        // Εκτέλεση
        if (statement.executeUpdate() == 1) {
            result = true;
            connection.commit();
        }
    } catch (Exception e) {
        connection.rollback();
        throw e;
    } finally {
        // Αποσύνδεση
        Connector.disconnect(statement, null, connection);
    }
    return result;
}

Προσέξτε την πρόταση SQL, η οποία περιέχει ερωτηματικά: “INSERT INTO persons(name, age) VALUES(?, ?)”. Πρόκειται για ένα PreparedStatement.

Επιλογή (select)

public Person select(int id) throws Exception {
    Person person = null;
    ResultSet set = null;
    Connection connection = null;
    PreparedStatement statement = null;
    String sql = "SELECT * FROM persons WHERE id = ?";
    try {
        // Σύνδεση
        connection = Connector.getConnection();
        // Προετοιμασία
        statement = connection.prepareStatement(sql);
        statement.setInt(1, id);
        // Εκτέλεση
        set = statement.executeQuery();
        if (set.next()) {
            person = new Person();
            person.setName(set.getString("name"));
            person.setAge(set.getInt("age"));
            person.setId(set.getInt("id"));
        }
    } finally {
        // Αποσύνδεση
        Connector.disconnect(statement, set, connection);
    }
    return person;
}

Αλλαγή (update)

public boolean update(Person person) throws Exception {
    boolean result = false;
    Connection connection = null;
    PreparedStatement statement = null;
    String sql = "UPDATE persons SET name = ?, age = ? WHERE id = ?";
    try {
        // Σύνδεση
        connection = Connector.getConnection();
        // Προετοιμασία
        statement = connection.prepareStatement(sql);
        statement.setString(1, person.getName());
        statement.setInt(2, person.getAge());
        statement.setInt(3, person.getId());
        // Εκτέλεση
        if (statement.executeUpdate() == 1) {
            result = true;
            connection.commit();
        }
    } catch (Exception e) {
        connection.rollback();
        throw e;
    } finally {
        // Αποσύνδεση
        Connector.disconnect(statement, null, connection);
    }
    return result;
}

Διαγραφή (delete)

public boolean delete(int id) throws Exception {
    boolean result = false;
    Connection connection = null;
    PreparedStatement statement = null;
    String sql = "DELETE FROM persons WHERE id = ?";
    try {
        // Σύνδεση
        connection = Connector.getConnection();
        // Προετοιμασία
        statement = connection.prepareStatement(sql);
        statement.setInt(1, id);
        // Εκτέλεση
        if (statement.executeUpdate() == 1) {
            result = true;
            connection.commit();
        }
    } catch (Exception e) {
        connection.rollback();
        throw e;
    } finally {
        // Αποσύνδεση
        Connector.disconnect(statement, null, connection);
    }
    return result;
}

Επανάληψη

Το JDBC είναι στρωτό:

  1. Σύνδεση.
  2. Προετοιμασία πρότασης SQL.
  3. Εκτέλεση και επιστροφή του αποτελέσματος.
  4. Αποσύνδεση.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: