====== SQLite a Java ====== {{tag> #FpInfor #Dam #DamMp06 #DamMp06Uf2 #DamMp06Uf02}} ---- ==== 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 [[https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc|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 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 listTables (Connection conn) { ArrayList 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 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); } }