⚙️ Ejemplo CRUD en SQLite¶

SQLite es un motor de base de datos relacional de código abierto que se especializa en ser ligero, eficiente y fácil de usar. A diferencia de los sistemas de gestión de bases de datos tradicionales que funcionan como servidores independientes y manejan múltiples conexiones de cliente, SQLite es una biblioteca de base de datos sin servidor que se incorpora directamente en la aplicación que la utiliza.

Vamos a ver como crear un aplicación simple con las operaciones básicas CRUD sobre una tabla Alumnos. Tenemos el ejemplo en:
Agregar jdbc de SQLite al proyecto¶
Agregamos al proyecto las librerías que manejan SQLite.En el repositorio de Maven. Necesitamos las librerías.
-
sqlite-jdbc-x.x.x.jar
-
slf4j-api-x.x.x.jar
-
ch.qos.logback.classic

Conexión JDBC¶
SQLite no se conecta a ningún servidor, lo único que necesita el JDBC de SQLite es el nombre del fichero que contiene la base de datos.
static final String URL = "jdbc:sqlite:alumnos.db";
Crear una tabla si no existe en la Base de datos¶
Crearemos la tabla de Alumnos si no existe. Esto puede ocurrir la primera vez que se ejecuta el programa
private static void crearTabla(Connection conexion) throws SQLException {
try (Statement statement = conexion.createStatement()) {
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS Alumno (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
"nombre TEXT NOT NULL," +
"email TEXT," +
"telefono TEXT)"
);
System.out.println("Tabla Alumno creada correctamente.");
}
}
Insert: Insertar en la tabla¶
Podemos crear sentencias SQL parametrizada que nos permiten generalizarlas y reutilizarlas. En aquellos lugares donde incluiremos un parámetro, colocamos un ?
private static void insertarAlumno(
Connection conexion, String nombre, String email, String telefono
) throws SQLException {
//Sentencia parametrizada mediante ?
String sqlInsert = "INSERT INTO Alumno (nombre, email, telefono) VALUES (?, ?, ?)";
try (PreparedStatement statement = conexion.prepareStatement(sqlInsert)) {
//Indicamos los valores a insertar
statement.setString(1, nombre);
statement.setString(2, email);
statement.setString(3, telefono);
//Lanzamos la sentencia SQL
statement.executeUpdate();
System.out.println("Alumno '" + nombre + "' insertado correctamente.");
}
}
Update: Actualizar en la tabla¶
Al igual que el anterior, parametrizamos la sentencia SQL
private static void actualizarAlumno(
Connection conexion, int id, String nombre, String email, String telefono
) throws SQLException {
String query = "UPDATE Alumno SET nombre = ?, email = ?, telefono = ? WHERE id = ?";
try (PreparedStatement statement = conexion.prepareStatement(query)) {
//incluimos los parámetros
statement.setString(1, nombre);
statement.setString(2, email);
statement.setString(3, telefono);
statement.setInt(4, id);
//lanzamos la sentencia
int rowsAffected = statement.executeUpdate();
//podemos saber las tuplas afectadas
if (rowsAffected > 0) {
System.out.println("Registro de alumno actualizado correctamente.");
} else {
System.out.println("No se encontró ningún registro de alumno con el ID proporcionado.");
}
}
}
Delete: Borrar en la tabla¶
Seguimos creando sentencias SQL parametrizada
private static void borrarAlumno(Connection conexion, int id) throws SQLException {
String query = "DELETE FROM Alumno WHERE id = ?";
try (PreparedStatement statement = conexion.prepareStatement(query)) {
statement.setInt(1, id);
statement.executeUpdate();
System.out.println("Alumno con ID " + id + " eliminado correctamente.");
}
}
Select: Consultas SQL mediante ResultSet¶
Podemos crear las sentencias que deseemos y parametrizadas. Estas nos devuelven un objeto de tipo ResultSet.
El ResultSet nos permite recorrer las tuplas devueltas por el resultado de la sentencia SQL mediante el método next()

ResultSet nos permite extraer los campos de la tupla actual ya sea por nombre o por posición
//nombre de la columna
int id=resultSet.getInt("id")
String nombre = resultSet.getString("nombre");
//posición de la columna
String email = resultSet.getString(3);
La estructura suele tener el siguiente esquema
try (Connection conexion = getConnection();
Statement sentencia = conexion.createStatement();
ResultSet resultSet = sentencia.executeQuery(sql)) {
//mientras tengamos tublas
while (resultSet.next()) {
//gestionar resultset
}
} catch (SQLException e) {
}
Ejemplos de su uso sobre la tabla Alumno¶
Mostrar todos los alumnos
private static void consultarAlumnos(Connection conexion) throws SQLException {
try (Statement statement = conexion.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM Alumno")) {
while (resultSet.next()) {
System.out.println("ID: " + resultSet.getInt("id") +
", Nombre: " + resultSet.getString("nombre") +
", Email: " + resultSet.getString("email") +
", Teléfono: " + resultSet.getString("telefono"));
}
}
}
private static void consultarAlumnosPorNombre(Connection conexion, String parteNombre) throws SQLException {
//sentencia parametrizada
String query = "SELECT * FROM Alumno WHERE nombre LIKE ?";
try (PreparedStatement statement = conexion.prepareStatement(query)) {
//añadimos el parámetro
statement.setString(1, "%" + parteNombre + "%");
try (ResultSet resultSet = statement.executeQuery()) {
while (resultSet.next()) {
System.out.println("ID: " + resultSet.getInt("id") +
", Nombre: " + resultSet.getString("nombre") +
", Email: " + resultSet.getString("email") +
", Teléfono: " + resultSet.getString("telefono"));
}
}
}
}
Devolver un ArrayList de Alumnos
Suponiendo que tenemos la clase Alumno
public class Alumno {
private int id;
private String nombre;
private String email;
private String telefono;
// Constructor
public Alumno(int id, String nombre, String email, String telefono) {
this.id = id;
this.nombre = nombre;
this.email = email;
this.telefono = telefono;
}
@Override
public String toString() {
return "id->" + id +
", nombre->'" + nombre + '\'' +
", email->'" + email + '\'' +
", telefono->'" + telefono ;
}
}
Una de las acciones más habituales es devolver una lista de Alumnos a partir de la consulta realizada
private static List<Alumno> listaAlumnos(Connection conexion) throws SQLException {
List<Alumno> listaAlumnos = new ArrayList<>();
try (Statement statement = conexion.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM Alumno")) {
while (resultSet.next()) {
int id = resultSet.getInt("id");
String nombre = resultSet.getString("nombre");
String email = resultSet.getString("email");
String telefono = resultSet.getString("telefono");
// Creamos un objeto Alumno y lo agregamos a la lista
Alumno alumno = new Alumno(id, nombre, email, telefono);
listaAlumnos.add(alumno);
}
}
return listaAlumnos;
}
private static ArrayList<Alumno> obtenerAlumnosPorInicial(Connection conexion, String letra) throws SQLException {
ArrayList<Alumno> listaAlumnos = new ArrayList<>();
String query = "SELECT * FROM Alumno WHERE nombre LIKE ?";
try (PreparedStatement statement = conexion.prepareStatement(query)) {
//la letra indicada al inicio
statement.setString(1, letra + "%");
try (ResultSet resultSet = statement.executeQuery()) {
while (resultSet.next()) {
int id = resultSet.getInt("id");
String nombre = resultSet.getString("nombre");
String email = resultSet.getString("email");
String telefono = resultSet.getString("telefono");
Alumno alumno = new Alumno(id, nombre, email, telefono);
listaAlumnos.add(alumno);
}
}
}
return listaAlumnos;
}
Un ejemplo de uso de los métodos anteriores
public static void main(String[] args) {
Connection conexion = null;
try {
conexion = DriverManager.getConnection(URL);
//creamos la tabla si no existe
crearTabla(conexion);
// Insertamos algunos alumnos
insertarAlumno(conexion, "Juan Pérez", "juan@example.com", "123456789");
insertarAlumno(conexion, "María López", "maria@example.com", "987654321");
insertarAlumno(conexion, "Carlos García", "carlos@example.com", "555555555");
insertarAlumno(conexion, "Laura Martínez", "laura@example.com", "777777777");
insertarAlumno(conexion, "Andrea Pérez", "andrea@example.com", "999999999");
//Buscamos los alumnos actuales
System.out.println("Alumnos:");
consultarAlumnos(conexion);
//Buscamos los alumnos con nombre que contiene 'Alumno'
System.out.println("Alumnos con nombre que contiene Pérez:");
consultarAlumnosPorNombre(conexion, "Pérez");
//Actualizamos el alumno con id 1
System.out.println("Actualizar 1");
int idAlumno = 1;
String nuevoNombre = "Juanito Pérez";
String nuevoEmail = "juan@example.com";
String nuevoTelefono = "555-1234";
// Llamamos al método para actualizar el alumno
actualizarAlumno(conexion, idAlumno, nuevoNombre, nuevoEmail, nuevoTelefono);
consultarAlumnosPorNombre(conexion,"Juan");
//Recuperamos los alumnos en una Lista
System.out.println("Lista de alumnos:");
List<Alumno> alumnos = listaAlumnos(conexion);
alumnos.forEach(System.out::println);
//Alumnos que el nombre empieza por J
alumnos=obtenerAlumnosPorInicial(conxion,"J");
alumnos.forEach(System.out::println);
} catch (SQLException e) {
e.printStackTrace();
} finally {//Esta sentencia simpre se ejecuta. Hay que cerrar la conexión
try {
if (conexion != null) {
conexion.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}