Salta el contingut

Introducció a les bases de dades

1. Per què necessitem bases de dades?

Fins ara, quan creàveu un programa Java, les dades que treballàveu vivien a la memòria RAM:

Java
1
2
3
4
List<String> noms = new ArrayList<>();
noms.add("Joan");
noms.add("Maria");
// Quan el programa acaba... tot desapareix!

Una base de dades ens permet guardar les dades en disc de forma persistent: si tanquem el programa i el tornem a obrir, les dades segueixen allà.

2. Què és un Driver?

Per parlar amb una base de dades des de Java necessitem un driver (o connector).

Penseu-ho com un traductor: el vostre programa Java no sap com parlar amb MySQL o MongoDB directament, però el driver sí. El driver sap el protocol intern de cada base de dades i tradueix les vostres peticions Java al llenguatge que entén la BD.

Text Only
1
2
3
4
5
6
7
8
9
  [Programa Java]
        |
        |  (crida a mètodes Java estàndard)
        v
    [Driver]
        |
        |  (protocol propi de la BD: MySQL Protocol, MongoDB Wire Protocol...)
        v
  [Base de Dades]

Cada base de dades té el seu driver propi:

Base de Dades Driver Dependència Maven
MySQL MySQL Connector/J mysql:mysql-connector-java
MongoDB MongoDB Java Driver org.mongodb:mongodb-driver-sync

2.1. Afegir el driver al projecte (Maven)

Si useu Maven, afegiu al vostre pom.xml:

XML
<dependencies>
    <!-- Driver MySQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>

    <!-- Driver MongoDB -->
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver-sync</artifactId>
        <version>4.11.1</version>
    </dependency>
</dependencies>

Si no useu Maven, heu de descarregar el fitxer .jar del driver i afegir-lo al classpath del projecte.

3. L'Algoritme General

Independentment de la base de dades que useu, l'algoritme de treball sempre segueix el mateix patró:

Text Only
1
2
3
4
5
1. CONNECTAR    → Establir la connexió amb la base de dades
2. PREPARAR     → Crear la consulta o l'operació a fer
3. EXECUTAR     → Llançar l'operació contra la BD
4. PROCESSAR    → Llegir i tractar els resultats obtinguts
5. TANCAR       → Alliberar els recursos (connexió, cursors...)

Alliberar recursos

És molt important tancar sempre els recursos que obrim (connexions, cursors, sentències...). Si no ho fem, el programa pot quedar-se sense connexions disponibles. Usarem el bloc try-with-resources de Java per assegurar-ho.

4. Les Operacions CRUD

CRUD és l'acrònim de les quatre operacions bàsiques sobre qualsevol base de dades:

Lletra Operació SQL MongoDB
C Create (crear) INSERT insertOne() / insertMany()
R Read (llegir) SELECT find() / findOne()
U Update (actualitzar) UPDATE updateOne() / updateMany()
D Delete (esborrar) DELETE deleteOne() / deleteMany()

Totes les aplicacions que accedeixen a una base de dades fan combinacions d'aquestes quatre operacions. Un sistema de gestió d'una biblioteca, per exemple: - C: Afegir un nou llibre al catàleg - R: Buscar els llibres d'un autor - U: Marcar un llibre com a prestat - D: Eliminar un llibre donat de baixa

Equivalències

Aquestes 4 operacions CRUD coincideixen amb les operacions bàsiques del SQL: INSERT, SELECT, UPDATE i DELETE. En MongoDB, aquestes operacions es realitzen amb mètodes específics del driver.

5. Connexió: El Recurs Més Important

La connexió és el canal de comunicació entre el vostre programa i la base de dades. Obrir una connexió és una operació costosa (temps de xarxa, autenticació...), per tant:

  • Cal reutilitzar les connexions sempre que sigui possible.
  • Cal tancar-les quan ja no les necessitem.
  • Cada connexió consumeix recursos tant al programa com al servidor de BD.

5.1. Try-with-resources

Java ofereix el bloc try-with-resources que tanca automàticament els recursos quan s'acaba el bloc, fins i tot si hi ha una excepció:

Java
// El try-with-resources tanca 'conn' automàticament en acabar
try (Connection conn = DriverManager.getConnection(url, user, password)) {

    // Aquí treballem amb la connexió...

} catch (SQLException e) {
    // Tractem l'error
    System.err.println("Error de connexió: " + e.getMessage());
}
// Aquí conn ja està tancada, tant si hi ha hagut error com si no

6. Gestió d'Excepcions

Les operacions amb bases de dades poden fallar per molts motius: - La BD no està en execució - Credencials incorrectes - La taula no existeix - Error de xarxa - Dada duplicada (clau primària repetida)

Cada driver té les seves excepcions:

  • JDBC (MySQL): llança SQLException
  • MongoDB Driver: llança MongoException

Sempre cal gestionar aquestes excepcions per fer el programa robust:

Java
1
2
3
4
5
6
try {
    // operació amb la BD
} catch (SQLException e) {
    System.err.println("Codi d'error SQL: " + e.getErrorCode());
    System.err.println("Missatge: " + e.getMessage());
}

7. Resum Visual

Text Only
┌─────────────────────────────────────────────────────────┐
│                    PROGRAMA JAVA                        │
│                                                         │
│  1. Carregar driver  →  Class.forName("com.mysql...")   │
│  2. Connectar        →  DriverManager.getConnection()   │
│  3. Preparar query   →  conn.prepareStatement(sql)      │
│  4. Executar         →  stmt.executeQuery()             │
│  5. Processar        →  while (rs.next()) { ... }       │
│  6. Tancar           →  (automàtic amb try-with-res.)   │
└─────────────────────────────────────────────────────────┘

Als següents apartats veurem com aplicar tot això amb MySQL i MongoDB amb exemples concrets.

Sols una introducció

Aquesta secció és només una introducció prou completa als conceptes bàsics.

El proper curs, tens una assignatura específica anomenada "Accès a Dades" on aprofundirem molt més en aquests temes, amb pràctiques i projectes reals. Aquí només volem donar-te una visió general per començar a treballar amb bases de dades en Java.