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)
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í
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()); }
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(); }
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")); }
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; } }
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); } }