> For the complete documentation index, see [llms.txt](https://educacion.gitbook.io/programacion/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://educacion.gitbook.io/programacion/ud8-persistencia-en-bases-de-datos/jdbc/componentes-jdbc.md).

# Compoñentes JDBC

## DriverManager <a href="#drivermanager" id="drivermanager"></a>

Xestiona os controladores JDBC e fornece métodos para establecer conexións con bases de datos. Actúa como fábrica de conexións, para o que recibe una URL, un usuario e un contrasinal

{% hint style="warning" %}
**Documentación Oficial:** [**https://docs.oracle.com/javase/8/docs/api/java/sql/DriverManager.html**](https://docs.oracle.com/javase/8/docs/api/java/sql/DriverManager.html)
{% endhint %}

```java
Connection con = DriverManager.getConnection(servidor,usuario,contrasinal);
```

## Connection <a href="#connection" id="connection"></a>

Representa unha conexión física cunha base de datos. Permite crear sentenzas, xestionar transaccións e obter metadatos.

{% hint style="warning" %}
**Documentación Oficial:** [https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.htm](https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html)
{% endhint %}

<pre class="language-java"><code class="lang-java">//Sentencias 
String sqlStatement = "SELECT * FROM alumnos WHERE apellido = " + variable;
Statement s = con.createStatement();

//Sentencias preparadas: con setean los parametros
String sql = "SELECT * FROM alumnos WHERE apellido = ?";
PreparedStatement prep = con.prepareStatement(sql);
prep.setString(1, "Garcia"); //prep.setString("apellido","Garcia");

//Gestion de transacciones
//Desactivamos autocommit para gestionar varias sentencias en una transacion
//Esta gestion va en bloque try catch
<strong>con.setAutocommit(false); 
</strong><strong>//OK -> Hacemos commit
</strong>con.commit();
//KO -> Hacemos rollback
con.rollback();
//finally -> Activamos el autocommit
con.setAutocommit(true);
</code></pre>

## SQLException <a href="#sqlexception" id="sqlexception"></a>

Xestiona erros que ocorren nas operacións con bases de datos. Proporciona información sobre o erro ocorrido.

{% hint style="warning" %}
**Documentación oficial:** <https://docs.oracle.com/javase/8/docs/api/java/sql/SQLException.html>
{% endhint %}

O seguinte bloque de código representa un exemplo de como utilizar estas clases para realizar unha conexión a base de datos:

```java
public class TestConexion {
    public static void main(String[] args) {
        String url = "jdbc:mariadb://localhost:3306/alumnos";
        String user = "testuser";
        String pass = "testpass";
        
        try (Connection conn = DriverManager.getConnection(url, user, pass)) {
            System.out.println("Conexión exitosa a MariaDB!");
            
            // Verificar metadatos
            DatabaseMetaData meta = conn.getMetaData();
            System.out.println("Base de datos: " + meta.getDatabaseProductName());
            System.out.println("Versión: " + meta.getDatabaseProductVersion());
            
        } catch (SQLException e) {
            System.err.println("❌ Erro na conexión: " + e.getMessage());
        }
    }
}
```

## Statement <a href="#statement" id="statement"></a>

Permite executar sentenzas SQL estáticas sen parámetros. Útil para consultas simples.

{% hint style="warning" %}
**Documentación oficial:** <https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html>
{% endhint %}

| **Método**                  | **Explicación**                                                                                                                                   |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `executeQuery(String sql)`  | Executa unha consulta `SELECT` e devolve un `ResultSet`. Úsase exclusivamente para consultas que retornan datos da base de datos.                 |
| `executeUpdate(String sql)` | Executa sentenzas `INSERT`, `UPDATE` ou `DELETE`. Devolve un `int` co número de filas afectadas.                                                  |
| `execute(String sql)`       | Executa calquera sentenza SQL. Devolve `true` se o primeiro resultado é un `ResultSet` (consulta) ou `false` se é un reconto de actualizacións.   |
| `getGeneratedKeys()`        | Devolve as claves autoxeradas (`auto_increment`) despois dun `INSERT`. Esencial para obter o ID dun rexistro recén creado sen facer outro SELECT. |
| `setMaxRows(int max)`       | Establece o número máximo de filas que pode retornar un `ResultSet`. Moi útil para controlar o rendemento ante táboas moi grandes.                |
| `setQueryTimeout(int seg)`  | Establece o tempo máximo que o driver agardará a que se execute a sentenza. Se pasa o tempo, lanza unha `SQLException`.                           |
| `close()`                   | Pecha o `Statement` e libera os recursos de forma inmediata. É fundamental para evitar fugas de memoria e saturación de conexións.                |

## ResultSet

Representa o conxunto de resultados dunha consulta SQL. Permite navegar polas filas e acceder aos datos.

{% hint style="warning" %}
**Documentación oficial:** <https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html>
{% endhint %}

### ResultSet: Métodos de Navegación

Estos métodos permiten mover o "cursor" (un punteiro invisible) a través das filas recuperadas.

| **Método**          | **Explicación**                                                                 |
| ------------------- | ------------------------------------------------------------------------------- |
| `next()`            | Move o cursor á seguinte fila. Devolve `false` cando non hai máis filas.        |
| `previous()`        | Move o cursor á fila anterior (require que o ResultSet sexa *Scrollable*).      |
| `first()`           | Sitúa o cursor na primeira fila do conxunto.                                    |
| `last()`            | Sitúa o cursor na última fila do conxunto.                                      |
| `absolute(int row)` | Move o cursor a unha posición específica (ex: `absolute(5)` vai á quinta fila). |
| `beforeFirst()`     | Coloca o cursor antes da primeira fila (estado inicial por defecto).            |

### ResultSet: Métodos de Recuperación (Getters)

Os métodos `get` teñen sobrecarga: todos poden recibir o índice (número) ou a etiqueta (nome) da columna.

| **Método (por Índice)** | **Método (por Nome)**     | **Explicación**                        |
| ----------------------- | ------------------------- | -------------------------------------- |
| `getString(int i)`      | `getString(String label)` | Obtén o valor como un `String`.        |
| `getInt(int i)`         | `getInt(String label)`    | Obtén o valor como un `int`.           |
| `getDouble(int i)`      | `getDouble(String label)` | Obtén o valor como un `double`.        |
| `getDate(int i)`        | `getDate(String label)`   | Obtén o valor como un `java.sql.Date`. |
| `getObject(int i)`      | `getObject(String label)` | Obtén o valor como `Object` xenérico.  |

### ResultSet: Métodos de Metadatos e Información

Permiten obter información sobre o propio conxunto de resultados máis alá dos datos das filas.

<table data-header-hidden><thead><tr><th width="374"></th><th></th></tr></thead><tbody><tr><td><strong>Método</strong></td><td><strong>Explicación</strong></td></tr><tr><td><code>getMetaData()</code></td><td>Devolve un obxecto <code>ResultSetMetaData</code> para saber cantas columnas hai, os seus nomes ou tipos.</td></tr><tr><td><code>findColumn(String label)</code></td><td>Devolve o número de índice asociado ao nome dunha columna.</td></tr><tr><td><code>getRow()</code></td><td>Indica o número de fila na que se atopa o cursor actualmente (a primeira fila é a 1).</td></tr></tbody></table>

O seguinte código realiza una execución sinxela para recuperar o contido da tabla de alumnos:

```java
public class App {
    public static void main(String[] args) {

        String url =  "jdbc:mariadb://localhost:3306/alumnos";
        String user = "testuser";
        String pass = "testpass";

        try (Connection conn = DriverManager.getConnection(url, user, pass);
             Statement stmt = conn.createStatement()) {

            ResultSet rs = stmt.executeQuery("SELECT * FROM alumnos");

            while (rs.next()){
                System.out.println("ID: " + rs.getInt("id"));
                System.out.println("Nome: " + rs.getString("nombre"));
                System.out.println("Apellido: " + rs.getString("apellido"));
                System.out.println("Fecha Nac.: " + rs.getString("fechaNac"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}
```

## PreparedStatement <a href="#preparedstatement" id="preparedstatement"></a>

Representa un obxecto Statement que esta precompilado e que pode executarse varias veces.

{% hint style="warning" %}
**Documentación oficial:** <https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html>
{% endhint %}

| **Método**                   | **Explicación**                                                                                          |
| ---------------------------- | -------------------------------------------------------------------------------------------------------- |
| `executeQuery()`             | Executa a consulta `SELECT` pre-compilada e devolve un `ResultSet`.                                      |
| `executeUpdate()`            | Executa as sentenzas `INSERT`, `UPDATE` ou `DELETE` pre-compiladas. Devolve o número de filas afectadas. |
| `execute()`                  | Executa calquera sentenza SQL pre-compilada. Devolve `true` se hai un `ResultSet`.                       |
| `setString(int i, String x)` | Establece o valor dun parámetro (`?`) como `String`. O índice comeza en 1.                               |
| `setInt(int i, int x)`       | Establece o valor dun parámetro (`?`) como `int`.                                                        |
| `setDouble(int i, double x)` | Establece o valor dun parámetro (`?`) como `double`.                                                     |
| `setDate(int i, Date x)`     | Establece o valor dun parámetro (`?`) como `java.sql.Date`.                                              |
| `setNull(int i, int type)`   | Establece un parámetro como `NULL` na base de datos. Requiere especificar o tipo (ex: `Types.VARCHAR`).  |
| `clearParameters()`          | Borra todos os valores asignados aos parámetros para poder reutilizar o obxecto con novos datos.         |
| `getParameterMetaData()`     | Devolve un obxecto coa información sobre o número e o tipo de parámetros da sentenza.                    |

```java
public class App {
    public static void main(String[] args) {

        Configurador conf = new Configurador();
        conf.cargarConfiguracion();
        String url = conf.leerPropiedad("servidor_url") +  conf.leerPropiedad("base_datos") + "?allowMultiQueries=true";
        String user = conf.leerPropiedad("usuario");
        String pass = conf.leerPropiedad("clave");
        System.out.println(url);

        try (Connection conn = DriverManager.getConnection(url, user, pass)) {

            String sql = "INSERT INTO alumnos (nombre, apellido, fechaNac) VALUES (?, ?, ?)";
            //SIN TRY-WITH-RESOURCES
            PreparedStatement pstm = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            pstm.setString(1,"Elena");
            pstm.setString(2, "Rodríguez");
            pstm.setObject(3,LocalDate.of(2004,11,15));

            int filasActualizadas = pstm.executeUpdate();

            ResultSet gKeys = pstm.getGeneratedKeys();

            while (gKeys.next()){
                System.out.println("Insertado el alumno con ID: " + gKeys.getInt(1));
            }
            //HAY QUE CERRAR EL STATEMENT
            pstm.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://educacion.gitbook.io/programacion/ud8-persistencia-en-bases-de-datos/jdbc/componentes-jdbc.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
