Omet navegació

5.4 - Exemple

A continuació posarem un exemple molt senzill, el dels empleats, en el qual primer crearem la taula per a guardar les dades, després introduirem les dades, les modificarem, i per últim les consultarem. D'aquesta manera podrem veure tots els exemples de sentències SQL.

Les dades són les mateixes que en altres ocasions:

Num Nom Depart
Edat
Sou
1 Andreu 10 32 1000.00
2 Bernat 20 28 1200.00
3 Claudia 10 26 1100.00
4 Damià 10 40 1500.00

La clau principal serà el camp num de tipus enter. El nom serà de text, el departament i l'edat també enters, mentre que el sou serà real.

Per a no interferir entre tots, utilitzarem la Base de Dades SQLite, on cadascú guardarà en un fitxer seu les dades. Haureu de cuidar la ruta, que siga on voleu guardar la vostra Base de Dades. Si no poseu res en la ruta, es guardarà en el directori actiu, que és l'arrel del projecte.

Creació de la taula

La sentència SQL que crea la taula en una Base de Dades SQLite serà així:

CREATE TABLE EMPLEATS (
num INTEGER CONSTRAINT cp_emp PRIMARY KEY,
nom TEXT,
depart INTEGER,
edat INTEGER,
sou REAL );

Hem d'observar que el mètode del Statement a utilitzar és executeUpdate(), ja que la sentència de creació no torna res (no és un SELECT)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class exempleEmpleatsCrearTaula {

    public static void main(String[] args) {
        Connection con = null;
        Statement st = null;
        String sentSQL = null;

        try {
            Class.forName("org.sqlite.JDBC");

            String url = "jdbc:sqlite:Empleats.sqlite";
            con = DriverManager.getConnection(url);

            st = con.createStatement();

            sentSQL = "CREATE TABLE EMPLEAT(" +
                    "num INTEGER CONSTRAINT cp_emp PRIMARY KEY, " +
                    "nom TEXT, " +
                    "depart INTEGER, " +
                    "edat INTEGER, " +
                    "sou REAL " +
                ")";

            st.executeUpdate(sentSQL);
            st.close();

        } catch (SQLException ex) {
            System.out.println("Error " + ex.getMessage());
        } catch (ClassNotFoundException ex) {
            System.out.println("No s'ha trobat el controlador JDBC (" + ex.getMessage() + ")");
        } finally {
            try {
                if (st != null && !st.isClosed()) {
                    st.close();
                }
            } catch (SQLException ex) {
                System.out.println("No s'ha pogut tancar el Statement per alguna raó");
            }
            try {
                if (con != null && !con.isClosed()) {
                    con.close();
                }
            } catch (SQLException ex) {
                System.out.println("No s'ha pogut tancar el Connection per alguna raó");
            }
        }
    }

}

Si voleu veure el resultat, podeu anar a la perspectiva Database Development, però recordeu que heu de desconnectar després, per no interferir.
 

Inserció de dades

També volem introduir les dades que es poden veure a la taula anterior. Crearem un Statetement que reutilitzarem per anar escrivint totes les sentències INSERT. Recordeu que no és problema la reutilització si gastem el executeUpdate().
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class exempleEmpleatsInserirTaula {

    public static void main(String[] args) {
        Connection con = null;
        Statement st = null;
        String sentSQL = null;

        try {
            Class.forName("org.sqlite.JDBC");

            String url = "jdbc:sqlite:Empleats.sqlite";
            con = DriverManager.getConnection(url);

            st = con.createStatement();

            sentSQL = "INSERT INTO EMPLEAT VALUES (1,'Andreu',10,32,1000.0)";
            st.executeUpdate(sentSQL);

            sentSQL = "INSERT INTO EMPLEAT VALUES (2,'Bernat',20,28,1200.0)";
            st.executeUpdate(sentSQL);

            sentSQL = "INSERT INTO EMPLEAT VALUES (3,'Clàudia',10,26,1100.0)";
            st.executeUpdate(sentSQL);

            sentSQL = "INSERT INTO EMPLEAT VALUES (4,'Damià',10,40,1500.0)";
            st.executeUpdate(sentSQL);

        } catch (SQLException ex) {
            System.out.println("Error " + ex.getMessage());
        } catch (ClassNotFoundException ex) {
            System.out.println("No s'ha trobat el controlador JDBC (" + ex.getMessage() + ")");

        } finally {
            try {
                if (st != null && !st.isClosed()) {
                    st.close();
                }
            } catch (SQLException ex) {
                System.out.println("No s'ha pogut tancar el Statement per alguna raó");
            }
            try {
                if (con != null && !con.isClosed()) {
                    con.close();
                }
            } catch (SQLException ex) {
                System.out.println("No s'ha pogut tancar el Connection per alguna raó");
            }
        }
    }
}

Ara sí que és un bon moment per a consultar la taula des de la perspectiva Database Development. Recordeu que heu de desconnectar després de consultar la taula.

 

Modificació de dades

Ara modificarem les dades. Senzillament augmentem el sou de tots els empleats en un 5%. I també modifiquem el departament de l'empleat 3, posant-li el departament 20.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class exempleEmpleatsModificarTaula {

    public static void main(String[] args) {
        Connection con = null;
        Statement st = null;
        String sentSQL = null;

        try {
            Class.forName("org.sqlite.JDBC");

            String url = "jdbc:sqlite:Empleats.sqlite";
            con = DriverManager.getConnection(url);

            st = con.createStatement();

            sentSQL = "UPDATE EMPLEAT SET sou = sou * 1.05";
            st.executeUpdate(sentSQL);

            sentSQL = "UPDATE EMPLEAT SET depart=20 WHERE num = 3";
            st.executeUpdate(sentSQL);

        } catch (SQLException ex) {
            System.out.println("Error " + ex.getMessage());
        } catch (ClassNotFoundException ex) {
            System.out.println("No s'ha trobat el controlador JDBC (" + ex.getMessage() + ")");

        } finally {
            try {
                if (st != null && !st.isClosed()) {
                    st.close();
                }
            } catch (SQLException ex) {
                System.out.println("No s'ha pogut tancar el Statement per alguna raó");
            }
            try {
                if (con != null && !con.isClosed()) {
                    con.close();
                }
            } catch (SQLException ex) {
                System.out.println("No s'ha pogut tancar el Connection per alguna raó");
            }
        }
    }
}

 

Consultar les dades

Vegem de quina manera podem mostrar per pantalla tots els empleats del que cobren més de 1.100€. Ara el mètode que utilitzarem és executeQuery(), ja que aquesta consulta sí que torna dades.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class exempleEmpleatsConsultarTaula {

    public static void main(String[] args) {
        Connection con = null;
        Statement st = null;
        String sentenciaSQL = null;
        ResultSet rs = null;

        try {
            Class.forName("org.sqlite.JDBC");

            String url = "jdbc:sqlite:Empleats.sqlite";
            con = DriverManager.getConnection(url);

            st = con.createStatement();

            sentenciaSQL = "SELECT * FROM EMPLEAT WHERE sou > 1100";
            rs = st.executeQuery(sentenciaSQL);

            System.out.println("Núm. \tNom \tDep \tEdat \tSou");
            System.out.println("-----------------------------------------");

            while (rs.next()) {
                System.out.print(rs.getInt(1) + "\t");
                System.out.print(rs.getString(2) + "\t");
                System.out.print(rs.getInt(3) + "\t");
                System.out.print(rs.getInt(4) + "\t");
                System.out.println(rs.getDouble(5));
            }

        } catch (SQLException ex) {
            System.out.println("Error " + ex.getMessage());
        } catch (ClassNotFoundException ex) {
            System.out.println("No s'ha trobat el controlador JDBC (" + ex.getMessage() + ")");

        } finally {
            try {
                if(rs!=null && !rs.isClosed()){
                    rs.close();
                }
            } catch (SQLException ex) {
                System.out.println("No s'ha pogut tancar el ResultSet per alguna raó");
            }
            try {
                if (st != null && !st.isClosed()) {
                    st.close();
                }
            } catch (SQLException ex) {
                System.out.println("No s'ha pogut tancar el Statement per alguna raó");
            }
            try {
                if (con != null && !con.isClosed()) {
                    con.close();
                }
            } catch (SQLException ex) {
                System.out.println("No s'ha pogut tancar el Connection per alguna raó");
            }
        }
    }
}

 

Podeu observar com es pot utilitzar un bucle while per obtenir el valor de totes les files retornades. També podeu veure els diferents mètodes que retornen les dades de cada columna en funció del tipus: getInt()getString(), getDouble(), ...

Finalment, cal indicar que els objectes ResultSet també s’han de tancar de la mateixa manera que els Statements o les connexions. Els ResultSet són els primers que caldrà tancar.