> 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/boas-practicas-empregado-daos.md).

# Boas prácticas empregado DAOs

## Emprego de consultas preparadas

O emprego de consultas preparadas reducie o risco de ataques contra a base de datos, como é o caso xa comentado do SQL Injection. Adoita ser boa práctica validar que a información recibida desde a interface de usuario é a correcta e non é maliciosa.

## Desacoplamento de capas mediante Interfaces

Na arquitectura baseada en capas, os DAOs e o ServiceLayer deben de implementar unha interface que definan as operacións ofrecidas polo servicio e acceso a datos. Cada interface pode ter diferentes implementacións dependendo da tecnoloxía ou SXDB o de estratexias dependentes da lóxica de negocio. Esta regla de diseño favorece o cumprimento do **Principio de inversión de dependencia,** que di que unha clase debe depender de abtraccións, non de implementación concretas

```java
public interface GenericDAO <T,ID>{
    public List<T> findAll();
    public Optional<T> findById(ID id);
    public int insert(T t);
    public T update(T t);
    public boolean remove(T t);
}
```

Esta interface podese extender para especializar os accesos a datos con consultas adicionais se é necesario:

```java
public interface PersonaDAO extends GenericDAO<Alumno,Integer> {
    public List<Alumno> findByName(String nome);
    public List<Alumno> findByDate(LocalDate ini, LocalDate fin);
}

public interface ProfesorDAO extends GenericDAO<Profesor,Integer> {
    public List<Alumno> findByName(String nome);
    public List<Alumno> findByDate(LocalDate ini, LocalDate fin);
}
```

Na definición do servicio, declaramos os DAOs empregando as interfaces, e realizamos a instanciación na App coa implementación concreta. De esta maneira, **se cambiamos a implementación, unicamente hai que pasarlle ao constructor do Service o novo tipo de datos**

```java
public class PersonaServiceImpl {
    
    private AlumnoDAO alumnoDAO;
    private ProfesorDAO profesorDAO;

    public PersonaServiceImpl(AlumnoDAO alumnoDAO, ProfesorDAO profesorDAO) {
        this.alumnoDAO = alumnoDAO;
        this.profesorDAO = profesorDAO;
    }
}
```

## Deseño granular: Un DAO por cada entidade de negocio

Como regla xeral no patrón DAO, cada entidade debe de ter o seu patrón DAO. Esta regla de diseño favorece o cumprimento do **Principio de Responsabilidade Única**

<figure><img src="/files/dyrfsk8QYygmtp9gWWDH" alt=""><figcaption></figcaption></figure>

## Xestion de transaccións na capa de servizo

A capa de servizo é a que xestiona a lóxica de negocio, o que inclúe determinar se varias operacións de base de datos forman ou non parte da mesma transacción. Un exemplo sería se ti queres matricular a un alumno nunha base de datos dun centro, o método de matriculación do servicio vai a ser responable de insertar o alumno na tabla de alumnos, posteriormente insertar unha matricula para este alumno nos módulos indicados, e por último, rexistrar os datos do pagamento recibido. Non tería sentido que almacenase un dato si e outro non, polo que é necesario que sexa o servicio que almacene a transacción.

<figure><img src="/files/SSbfvkNCgbZ3V5CwUn8L" alt=""><figcaption></figcaption></figure>

## Emprego de DTOs

A capa de Data Transfer Object é unha capa que permite a transferencia de datos entre capas dunha aplicación, sen conter lóxica de negocio. Unha das funcións da capa de servicio vai a ser recuperar as Entities de transformalas nun DTO co que poden traballar o servicio e a vista. As súas principais vantaxes serían:

* **Redución de acoplamento:** Permite desacoplar os datos da base de datos, dos datos cos que traballan o servicio e a vista. De esta forma, evitamos que modificacións en base de datos afecten a elementos da vista e viceversa.&#x20;

{% hint style="warning" %}
Con **frameworks mais avanzados con Spring Boot**, un get a un método dunha entidade, pode implicar a execución de unha consulta. Que isto se lance desde a vista é un erro grave de deseño.&#x20;
{% endhint %}

* **Mellora da seguridade:** Limitan a exposición dos datos sensibles das entidades da base de datos.
* **Flexibilidade e encapsulación:** Permiten que vista e servicio traballen con seu propio modelo de datos, permitindo adaptacións a demanda da información en función dos requerimentos do negocio.


---

# 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/boas-practicas-empregado-daos.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.
