> 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/tipos-de-datos-java-sql.md).

# Tipos de datos Java - SQL

Existen algunhas particularidades en determinados tipos de datos e no seu emprego no mundo dos obxectos e no mundo relacional. A continuación comentanse varios aspectos:

## Cadeas de texto: Búsquedas

As cadeas de texto **String,** poden mapearse en SQL con diferentes operadores:

* **CHAR** - Lonxitude fixa
* **VARCHAR** - Lonxitude variable
* **TEXT** - Texto de lonxitude grande

Cando imos a realiza búsquedas por texto, o habitual non é buscar a condicidencia do texto exacta senon comprobar que a palabra esta contida nun determinado campo. Podemos pensar por exemplo na búsqueda de un producto en Amazon.

Para soluciónar isto, e posible empregar operadores especiais:

| Operador  | Significado                                |
| --------- | ------------------------------------------ |
| `%texto%` | O texto pode aparecer en calquera posición |
| `texto%`  | O texto debe comezar así                   |
| `%texto`  | O texto debe rematar así                   |
| `_`       | Representa un único carácter               |

Estes operadores auxiliares para búsqueda deben de colocarse no momento de facer o set no parámetro:

```java
String sql = "SELECT * FROM usuarios WHERE nome LIKE ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, "%ana%");
//Outra alternativa
ps.setString(1, "_na%"); //Ten unha letra, as letras na e calquera cousa
```

## Enumerados

Os tipos enumerado permiten en Java representar un conxunto de valores de un dominio (P.e: O estado de un pedido: PREPARACION, PENDENTE, ENTREGADO, REPARTO). A sua representación pode realizarse de duas formas a nivel de base de datos:

* **ENUM**: Se o SXBD conta con esa opción, será a mais adecuada para respectar as resticcións de dominio
* **Texto**: De acordo ao explicado no apartado anterior. Esta opción é adecuada se o xestor **non soporta o tipo ENUM.**

Dado o seguinte caso de enumerado en Java, as operacións de consulta e inserción requeririan dunha transformación a clase String.

```java
public enum EstadoPedido {
    PREPARACION, PENDENTE, ENTREGADO, REPARTO
}
```

<pre class="language-java"><code class="lang-java"><strong>String sql = "INSERT INTO pedidos (cliente, estado) VALUES (?, ?)";
</strong>PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, "Carlos");
ps.setString(2, EstadoPedido.REPARTO.name()); //podese empregar o método toString()
ps.executeUpdate();
</code></pre>

```java
while (rs.next()) {
// No result set, recuperamos o contido como String, e podemos convertelo a Enum
// previamente a construcción do obxecto.
    String estadoBD = rs.getString("estado");
    EstadoPedido estado = EstadoPedido.valueOf(estadoBD); 
// ...
}
```

## Datas e Horas: Filtrado e Rangos

Os tipos `LocalDate` e `LocalDateTime` mapeanse en SQL de forma precisa, pero as buscas raramente son por unha data exacta (xa que os segundos ou milisegundos poden facer que a coincidencia falle).

* **DATE** **(`LocalDate`):** Almacena só o día, mes e ano.
* **TIMESTAMP (`LocalDateTime`):** Almacena a data e a hora con precisión.

Cando buscamos eventos, como "pedidos realizados nun mes" ou "citas para hoxe", empregamos operadores de comparación de rango:

| **Operador** | **Significado**      | **Exemplo de uso**                                        |
| ------------ | -------------------- | --------------------------------------------------------- |
| `>` / `<`    | Maior ou menor que   | Buscar datas posteriores ou anteriores a unha referencia. |
| `>=` / `<=`  | Maior/Menor ou igual | Incluír o día exacto na procura.                          |
| `BETWEEN`    | Entre dous valores   | Buscar dentro dun rango (ex. un intervalo de meses).      |
| `IS NULL`    | Valor nulo           | Buscar rexistros onde a data non foi asignada.            |

Cando fagamos a conversion de estes obxectos, **o habitual e empregar o getter e setter de objects:**&#x20;

```java
String sql = "SELECT * FROM consultas WHERE data_cita BETWEEN ? AND ?";
PreparedStatement ps = con.prepareStatement(sql);
LocalDate inicio = LocalDate.of(2024, 5, 1);
LocalDate fin = LocalDate.of(2024, 5, 31);
ps.setObject(1, inicio);
ps.setObject(2, fin);

LocalDate hoxe = LocalDate.now();
String sql = "INSERT INTO tarefas (nome, data_limite) VALUES (?, ?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, "Estudar JDBC");
ps.setObject(2, hoxe); // O driver fai a conversión automática a SQL DATE
ps.executeUpdate();
```


---

# 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/tipos-de-datos-java-sql.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.
