Taula de continguts

SQLite a Java

, , , ,

Exemples

sqlite_java-exemple2.zip

Accés a Bases de Dades, JDBC

JDBC (Java Database Connectivity) és l’API bàsica de Java per accedir a Bases de Dades

- És fàcil de fer servir

- Pot connectar amb casi totes les bases de dades del mercat

- No té utilitats per traduïr de SQL a objectes Java (ni al revés)

Accés a Bases de Dades, SQLite

SQLite és un sistema de gestió de base de dades lleuger, que NO segueix el model client-servidor.

- Soporta usuaris simultanis, però no és molt eficient al fer-ho.

- És “zero-configuration”, no cal instal·lar-la i treballa amb un sol arxiu local

- Permet camps de longitud variable

Es pot descarregar el .jar d’aquí

SQLite, Establir la connexió

Cal posar “jdbc:sqlite:” i la ruta de l’arxiu que servirà de base de dades

Si no existeix en crea una nova buida amb aquest nom d’arxiu

Abans d’acabar el programa cal tancar correctament la connexió amb ‘.close()

Connection conn = null;
try {
    String url = "jdbc:sqlite:" + filePath;
    conn = DriverManager.getConnection(url);
    if (conn != null) {
        DatabaseMetaData meta = conn.getMetaData();
        System.out.println("BBDD driver: " + 
meta.getDriverName());
    }
    System.out.println("BBDD SQLite connectada");
} catch (SQLException e) { e.printStackTrace(); }
 
// Executar consultes …
 
try {
    if (conn != null) {
        conn.close();
        System.out.println("DDBB SQLite desconnectada");
    }
} catch (SQLException ex) {         
    System.out.println(ex.getMessage()); 
}

SQLite, executeUpdate

Les consultes que no retornen una taula (DROP, CREATE, INSERT, UPDATE, …) s’han d’executar amb ‘.executeUpdate

int result = 0;
String sql = “DROP TABLE warehouses;;
try {
    Statement stmt = conn.createStatement();
    result = stmt.executeUpdate(sql);
} catch (SQLException e) { e.printStackTrace(); }

SQLite, executeQuery

Les consultes que retornen una taula (SELECT) s’han d’executar amb ‘.executeQuery

El resultat s’obté en un objecte ‘ResultSet’, del que en podem obtenir les dades segons el tipus que correspon a la columna:

- rs.getInt(nomColumna)

- rs.getString(nomClumna)

ResultSet rs = null;
String sql = “DROP TABLE warehouses;;
try {
    Statement stmt = conn.createStatement();
    rs = stmt.executeQuery(sql);
} catch (SQLException e) { e.printStackTrace(); }
 
System.out.println("Contingut de la taula:");
while (rs.next()) {
    System.out.println("    " + rs.getInt("id") + ", " 
   + rs.getString("name"));
}

Exemple, mostrar dades de SQLite

Aquest exemple mostra les dades d'una base de dades SQLite

MainSQLite.java

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
 
/*
 * Aquest exemple mostra les 
 * dades de SQLite
 */
 
public class MainSQLite {
 
    public static void main(String[] args) throws SQLException {
        String basePath = System.getProperty("user.dir") + "/";
        String filePath = basePath + "database.db";
        ResultSet rs = null;
 
        // Connectar (crea la BBDD si no existeix)
        Connection conn = UtilsSQLite.connect(filePath);
 
        // Llistar les taules
        ArrayList<String> taules = UtilsSQLite.listTables(conn);
        System.out.println("Taules: " + taules);
 
        for (int cntTab = 0; cntTab < taules.size(); cntTab = cntTab + 1) { 
            String nomTaula = taules.get(cntTab);
 
            // Mostrar les columnes de la taula
            rs = UtilsSQLite.querySelect(conn, "SELECT * FROM " + nomTaula + ";");
            ResultSetMetaData rsmd = rs.getMetaData();
            System.out.println("Columnes de la taula " + nomTaula + ":");
            for (int cntCol = 1; cntCol <= rsmd.getColumnCount(); cntCol = cntCol + 1) { 
                // Les columnes començen a 1, no hi ha columna 0!
                String label = rsmd.getColumnLabel(cntCol);
                String name = rsmd.getColumnName(cntCol);
                int type = rsmd.getColumnType(cntCol);
                System.out.println("    " + label + ", " + name + ", " + type);
            }
 
            // Mostrar la informació de la taula
            System.out.println("Continguts de la taula " + nomTaula + ":");
            rs = UtilsSQLite.querySelect(conn, "SELECT * FROM " + nomTaula + ";");
            while (rs.next()) {
                String txt = "";
                for (int cntCol = 1; cntCol <= rsmd.getColumnCount(); cntCol = cntCol + 1) {
                    if (cntCol == 1) { txt = txt + "    "; } else { txt = txt + ", "; }
                    int type = rsmd.getColumnType(cntCol);
                    String name = rsmd.getColumnName(cntCol);
                    switch (type) {
                        case java.sql.Types.INTEGER:
                            txt = txt + rs.getInt(name);
                            break;
                        case java.sql.Types.VARCHAR:
                            txt = txt + rs.getString(name);
                            break;
                        case java.sql.Types.REAL:
                            txt = txt + rs.getFloat(name);
                            break;
                        case java.sql.Types.BIGINT:
                            txt = txt + rs.getLong(name);
                            break;
                        case java.sql.Types.BOOLEAN:
                            txt = txt + rs.getBoolean(name);
                            break;
                        default:
                            txt = txt + "???";
                            break;
                    }
                }
                System.out.println(txt);
            }
        }
 
        // Desconnectar
        UtilsSQLite.disconnect(conn);
    }
}

UtilsSQLite.java

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
 
public class UtilsSQLite {
 
    public static Connection connect (String filePath) {
        Connection conn = null;
 
        try {
            String url = "jdbc:sqlite:" + filePath;
            conn = DriverManager.getConnection(url);
            if (conn != null) {
                DatabaseMetaData meta = conn.getMetaData();
                System.out.println("BBDD driver: " + meta.getDriverName());
            }
            System.out.println("BBDD SQLite connectada");
        } catch (SQLException e) { e.printStackTrace(); }
 
        return conn;
    }
 
    public static void disconnect (Connection conn ) {
        try {
            if (conn != null) { 
                conn.close(); 
                System.out.println("DDBB SQLite desconnectada");
            }
        } catch (SQLException ex) { System.out.println(ex.getMessage()); }
    }
 
    public static ArrayList<String> listTables (Connection conn) {
        ArrayList<String> list = new ArrayList<>();
        try {
            ResultSet rs = conn.getMetaData().getTables(null, null, null, null);
            while (rs.next()) {
                list.add(rs.getString("TABLE_NAME"));
            }
        } catch (SQLException ex) { System.out.println(ex.getMessage()); }
        return list;
    }
 
    public static int queryUpdate (Connection conn, String sql) {
        int result = 0;
        try {
            Statement stmt = conn.createStatement();
            result = stmt.executeUpdate(sql);
        } catch (SQLException e) { e.printStackTrace(); }
        return result;
    }
 
    public static ResultSet querySelect (Connection conn, String sql) {
        ResultSet rs = null;
        try {
            Statement stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
        } catch (SQLException e) { e.printStackTrace(); }
        return rs;
    }
}

Exemple, iniciar dades a SQLite

Aquest exemple mostra com iniciar a SQLite (fa ús de UtilsSQLite.java anterior)

Main.java

import java.io.File;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
 
/*
 * Aquest exemple mostra com fer una 
 * connexió a SQLite amb Java
 * 
 * A la primera crida, crea l'arxiu 
 * de base de dades hi posa dades,
 * després les modifica
 * 
 * A les següent crides ja estan
 * originalment modificades
 * (tot i que les sobreescriu cada vegada)
 */
 
public class Main {
 
    public static void main(String[] args) throws SQLException {
        String basePath = System.getProperty("user.dir") + "/";
        String filePath = basePath + "database.db";
        ResultSet rs = null;
 
        // Si no hi ha l'arxiu creat, el crea i li posa dades
        File fDatabase = new File(filePath);
        if (!fDatabase.exists()) { initDatabase(filePath); }
 
        // Connectar (crea la BBDD si no existeix)
        Connection conn = UtilsSQLite.connect(filePath);
 
        // Llistar les taules
        ArrayList<String> taules = UtilsSQLite.listTables(conn);
        System.out.println(taules);
 
        // Demanar informació de la taula
        rs = UtilsSQLite.querySelect(conn, "SELECT * FROM warehouses;");
        ResultSetMetaData rsmd = rs.getMetaData();
        System.out.println("Informació de la taula:");
        for (int cnt = 1; cnt < rsmd.getColumnCount(); cnt = cnt + 1) { 
            // Les columnes començen a 1, no hi ha columna 0!
            String label = rsmd.getColumnLabel(cnt);
            String name = rsmd.getColumnName(cnt);
            int type = rsmd.getColumnType(cnt);
            System.out.println("    " + label + ", " + name + ", " + type);
        }
 
        // SELECT a la base de dades
        rs = UtilsSQLite.querySelect(conn, "SELECT * FROM warehouses;");
        System.out.println("Contingut de la taula:");
        while (rs.next()) {
            System.out.println("    " + rs.getInt("id") + ", " + rs.getString("name"));
        }
 
        // Actualitzar una fila
        UtilsSQLite.queryUpdate(conn, "UPDATE warehouses SET name=\"MediaMarkt\" WHERE id=2;");
 
        // Esborrar una fila
        UtilsSQLite.queryUpdate(conn, "DELETE FROM warehouses WHERE id=3;");
 
        // SELECT a la base de dades
        rs = UtilsSQLite.querySelect(conn, "SELECT * FROM warehouses;");
        System.out.println("Contingut de la taula modificada:");
        while (rs.next()) {
            System.out.println("    " + rs.getInt("id") + ", " + rs.getString("name"));
        }
 
        // Desconnectar
        UtilsSQLite.disconnect(conn);
    }
 
    static void initDatabase (String filePath) {
        // Connectar (crea la BBDD si no existeix)
        Connection conn = UtilsSQLite.connect(filePath);
 
        // Esborrar la taula (per si existeix)
        UtilsSQLite.queryUpdate(conn, "DROP TABLE IF EXISTS warehouses;");
 
        // Crear una nova taula
        UtilsSQLite.queryUpdate(conn, "CREATE TABLE IF NOT EXISTS warehouses ("
                                    + "	id integer PRIMARY KEY AUTOINCREMENT,"
                                    + "	name text NOT NULL);");
 
        // Afegir elements a una taula
        UtilsSQLite.queryUpdate(conn, "INSERT INTO warehouses (name) VALUES (\"Amazon\");");
        UtilsSQLite.queryUpdate(conn, "INSERT INTO warehouses (name) VALUES (\"El Corte Inglés\");");
        UtilsSQLite.queryUpdate(conn, "INSERT INTO warehouses (name) VALUES (\"Mecalux\");");
 
        // Desconnectar
        UtilsSQLite.disconnect(conn);
    }
}