Objeto de acceso a datos (DAO) en Java

347

Estaba revisando un documento y me encontré con un término llamado DAO. Descubrí que es un objeto de acceso a datos. ¿Puede alguien explicarme qué es esto realmente?

Sé que es una especie de interfaz para acceder a datos de diferentes tipos de fuentes, en medio de esta pequeña investigación mía me topé con un concepto llamado fuente de datos u objeto de fuente de datos, y las cosas se me estropearon.

Realmente quiero saber qué DAOes un programáticamente en términos de dónde se usa. ¿Cómo se usa? También se agradece cualquier enlace a páginas que expliquen este concepto desde las cosas más básicas.

Vasanth Nag KV
fuente

Respuestas:

447

El objeto de acceso a datos es básicamente un objeto o una interfaz que proporciona acceso a una base de datos subyacente o cualquier otro almacenamiento de persistencia.

Esa definición de: http://en.wikipedia.org/wiki/Data_access_object

Consulte también el diagrama de secuencia aquí: http://www.oracle.com/technetwork/java/dataaccessobject-138824.html

Quizás un simple ejemplo pueda ayudarlo a comprender el concepto:

Digamos que tenemos una entidad para representar a un empleado:

public class Employee {

    private int id;
    private String name;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

Las entidades de los empleados permanecerán en una Employeetabla correspondiente en una base de datos. Una interfaz DAO simple para manejar la operación de la base de datos requerida para manipular una entidad de empleado será como:

interface EmployeeDAO {

    List<Employee> findAll();
    List<Employee> findById();
    List<Employee> findByName();
    boolean insertEmployee(Employee employee);
    boolean updateEmployee(Employee employee);
    boolean deleteEmployee(Employee employee);

}

A continuación, tenemos que proporcionar una implementación concreta para esa interfaz para tratar con el servidor SQL, y otra para tratar con archivos planos, etc.

Rami
fuente
44
hola rami, me alegra mucho que hayas intentado explicarme con un ejemplo muy simple, que es lo que necesitaba. ¿puede explicar qué quería decir con 'implementación concreta'? ¿Quiso decir que tenemos que escribir la definición de los métodos a continuación implementando la interfaz en una clase ...?
Vasanth Nag KV
Si eso es correcto. Como una clase llamada EmployeeSQLServerDAO que implementa la interfaz EmployeeDAO al proporcionar una implementación completa de sus métodos de una manera relevante para SQL Server
Rami
44
Entonces, ¿eso es todo un DAO? es solo una clase que NOSOTROS estamos escribiendo para acceder a la base de datos. cada vez que necesitamos un servicio de la base de datos, creamos un objeto de un DAO, lo usamos para las operaciones de la base de datos y luego eliminamos el DAO una vez que obtenemos lo que queremos de la base de datos. ¿Estoy en lo cierto? y puedo saber el alcance de este concepto DAO rami?
Vasanth Nag KV
55
Sí, el DAO, como su nombre lo indica, es para acceder / actualizar el almacenamiento subyacente con respecto a una determinada entidad / clase. Entonces, en el ejemplo anterior, tenemos una clase / entidad de empleados que usamos para mantener una tabla DB del servidor SQL. El DAO del empleado contendrá métodos para insertar / eliminar / actualizar / seleccionar empleado (s)
Rami
2
@PhilipRego ciertamente podemos tener múltiples implementaciones, por ejemplo, una implementación de servidor MSSQL, y otra que usa un archivo CSV para usar con pruebas unitarias.
Rami
86

¿Qué es el OBJETO DE ACCESO A DATOS (DAO) ?

Es un objeto / interfaz , que se utiliza para acceder a los datos de la base de datos de almacenamiento de datos.

POR QUÉ USAMOS DAO:

abstrae la recuperación de datos de un recurso de datos como una base de datos. El concepto es "separar la interfaz del cliente de un recurso de datos de su mecanismo de acceso a datos".

El problema con el acceso directo a los datos es que la fuente de los datos puede cambiar. Considere, por ejemplo, que su aplicación se implementa en un entorno que accede a una base de datos Oracle. Luego se implementa en un entorno que utiliza Microsoft SQL Server. Si su aplicación utiliza procedimientos almacenados y código específico de la base de datos (como generar una secuencia numérica), ¿cómo maneja eso en su aplicación? Tienes dos opciones:

  • Vuelva a escribir su aplicación para usar SQL Server en lugar de Oracle (o agregue código condicional para manejar las diferencias), o
  • Cree una capa entre la lógica de su aplicación y el acceso a los datos.


Es en todo referido como Patrón DAO , Consiste en lo siguiente:

  • Interfaz de objeto de acceso a datos : esta interfaz define las operaciones estándar que se realizarán en un objeto (s) modelo.
  • Clase concreta del objeto de acceso a datos: esta clase implementa la interfaz anterior. Esta clase es responsable de obtener datos de una fuente de datos que puede ser base de datos / xml o cualquier otro mecanismo de almacenamiento.
  • Objeto modelo u objeto de valor : este objeto es un POJO simple que contiene métodos get / set para almacenar datos recuperados utilizando la clase DAO.

Verifique este ejemplo, esto aclarará las cosas más claramente.

Ejemplo
Supongo que esto debe haber aclarado su comprensión de DAO hasta cierto punto.

VdeX
fuente
13

DAO (Data Access Object) es un patrón de diseño muy utilizado en aplicaciones empresariales. Básicamente es el módulo que se utiliza para acceder a los datos de todas las fuentes (DBMS, XML, etc.). Le sugiero que lea algunos ejemplos, como este:

Ejemplo de DAO

Tenga en cuenta que hay diferentes formas de implementar el patrón DAO original , y hay muchos marcos que pueden simplificar su trabajo. Por ejemplo, los marcos ORM (Object Relational Mapping) como iBatis o Hibernate, se utilizan para asignar el resultado de las consultas SQL a objetos java.

Espero que ayude, ¡Adiós!

umanganiello
fuente
8

El patrón de objetos de acceso a datos o el patrón DAO se utilizan para separar las operaciones u API de acceso a datos de bajo nivel de los servicios empresariales de alto nivel. Los siguientes son los participantes en el patrón de objetos de acceso a datos.

Interfaz de objeto de acceso a datos: esta interfaz define las operaciones estándar que se realizarán en un objeto (s) modelo.

Clase concreta del objeto de acceso a datos: esta clase implementa la interfaz anterior. Esta clase es responsable de obtener datos de una fuente de datos que puede ser base de datos / xml o cualquier otro mecanismo de almacenamiento.

Objeto modelo u objeto de valor: este objeto es un POJO simple que contiene métodos get / set para almacenar datos recuperados utilizando la clase DAO.

Código de muestra aquí ...

babu
fuente
7

Voy a ser general y no específico de Java, ya que DAO y ORM se usan en todos los idiomas.

Para comprender DAO, primero debe comprender ORM (asignación racional de objetos). Esto significa que si tiene una tabla llamada "persona" con las columnas "nombre" y "edad", crearía una plantilla de objeto para esa tabla:

type Person {
name
age
}

Ahora con la ayuda de DAO en lugar de escribir algunas consultas específicas, para buscar a todas las personas, para cualquier tipo de db que esté utilizando (que puede ser propenso a errores), haga lo siguiente:

list persons = DAO.getPersons();
...
person = DAO.getPersonWithName("John");
age = person.age;

Usted no escribe la abstracción DAO, sino que generalmente forma parte de algún proyecto de código abierto, según el lenguaje y el marco que esté utilizando.

Ahora a la pregunta principal aquí. " ... donde se usa ... ". Por lo general, si está escribiendo un código complejo de negocios y dominio específico, su vida será muy difícil sin DAO. Por supuesto, no necesita usar ORM y DAO, sino que puede escribir su propia abstracción y consultas nativas. Lo he hecho en el pasado y casi siempre me arrepiento después.

Orhan
fuente
6

Creo que el mejor ejemplo (junto con explicaciones) puede encontrar en el sitio web de Oracle: aquí . Otro buen tutorial se puede encontrar aquí .

Ioan
fuente
2
¿Soy solo yo o la mayoría de los tutoriales y sitios informativos de Java son muy antiguos? ¡Ese tutorial es de 2008! Muchos de los principales resultados de búsqueda en varios temas de Java son aún más antiguos.
bergie3000
2
@ bergie3000: este patrón no es nuevo.
Bằng Rikimaru
5

No te confundas con demasiadas explicaciones. DAO: Desde el nombre en sí mismo, significa acceder a los datos usando Object. DAO está separado de otra lógica de negocios.

ArunValaven
fuente
4

El objeto de acceso a datos gestiona la conexión con la fuente de datos para obtener y almacenar datos. Resume la implementación de acceso a datos subyacente para el objeto de negocio para permitir un acceso transparente a la fuente de datos. Una fuente de datos podría ser cualquier base de datos, como un RDBMS, un repositorio XML o un sistema de archivos planos, etc.

Rohit Goyal
fuente
4

Spring JPA DAO

Por ejemplo tenemos alguna entidad Grupo.

Para esta entidad creamos el repositorio GroupRepository.

public interface GroupRepository extends JpaRepository<Group, Long> {   
}

Luego, necesitamos crear una capa de servicio con la cual usaremos este repositorio.

public interface Service<T, ID> {

    T save(T entity);

    void deleteById(ID id);

    List<T> findAll();

    T getOne(ID id);

    T editEntity(T entity);

    Optional<T> findById(ID id);
}

public abstract class AbstractService<T, ID, R extends JpaRepository<T, ID>> implements Service<T, ID> {

    private final R repository;

    protected AbstractService(R repository) {
        this.repository = repository;
    }

    @Override
    public T save(T entity) {
        return repository.save(entity);
    }

    @Override
    public void deleteById(ID id) {
        repository.deleteById(id);
    }

    @Override
    public List<T> findAll() {
        return repository.findAll();
    }

    @Override
    public T getOne(ID id) {
        return repository.getOne(id);
    }

    @Override
    public Optional<T> findById(ID id) {
        return repository.findById(id);
    }

    @Override
    public T editEntity(T entity) {
        return repository.saveAndFlush(entity);
    }
}

@org.springframework.stereotype.Service
public class GroupServiceImpl extends AbstractService<Group, Long, GroupRepository> {

    private final GroupRepository groupRepository;

    @Autowired
    protected GroupServiceImpl(GroupRepository repository) {
        super(repository);
        this.groupRepository = repository;
    }
}

Y en el controlador usamos este servicio.

@RestController
@RequestMapping("/api")
class GroupController {

    private final Logger log = LoggerFactory.getLogger(GroupController.class);

    private final GroupServiceImpl groupService;

    @Autowired
    public GroupController(GroupServiceImpl groupService) {
        this.groupService = groupService;
    }

    @GetMapping("/groups")
    Collection<Group> groups() {
        return groupService.findAll();
    }

    @GetMapping("/group/{id}")
    ResponseEntity<?> getGroup(@PathVariable Long id) {
        Optional<Group> group = groupService.findById(id);
        return group.map(response -> ResponseEntity.ok().body(response))
                .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

    @PostMapping("/group")
    ResponseEntity<Group> createGroup(@Valid @RequestBody Group group) throws URISyntaxException {
        log.info("Request to create group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.created(new URI("/api/group/" + result.getId()))
                .body(result);
    }

    @PutMapping("/group")
    ResponseEntity<Group> updateGroup(@Valid @RequestBody Group group) {
        log.info("Request to update group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.ok().body(result);
    }

    @DeleteMapping("/group/{id}")
    public ResponseEntity<?> deleteGroup(@PathVariable Long id) {
        log.info("Request to delete group: {}", id);
        groupService.deleteById(id);
        return ResponseEntity.ok().build();
    }    
}
Andriy
fuente
Esto parece estar explicando el patrón del Repositorio y no el patrón DAO según la solicitud de los autores originales. Además, creo que su ejemplo puede ser engañoso ya que su interfaz debe seguir un enfoque similar a la Colección, por lo que algunas de sus operaciones no son adecuadas.
Jan Haesen
2

DAO es un acto como "Administrador de persistencia" en la arquitectura de 3 niveles, así como DAO también diseña patrones, ya que puede consultar el libro "Gang of Four". La capa de servicio de su aplicación solo necesita llamar al método de la clase DAO sin conocer los detalles ocultos e internos del método DAO.

Yasir Shabbir Choudhary
fuente
2

Las clases de Dao se utilizan para reutilizar la lógica jdbc y el Dao (objeto de acceso a datos) es un patrón de diseño. dao es una clase simple de Java que contiene lógica JDBC.

La capa de acceso a datos ha demostrado ser buena en una capa lógica empresarial separada y una capa persistente. El patrón de diseño DAO oculta completamente la implementación de acceso a datos de sus clientes

El Java Data Access Object (Java DAO) es un componente importante en las aplicaciones empresariales. Las aplicaciones comerciales casi siempre necesitan acceso a datos de bases de datos relacionales u objetos y la plataforma Java ofrece muchas técnicas para acceder a estos datos. La técnica más antigua y madura es utilizar la API de Java Database Connectivity (JDBC), que proporciona la capacidad de ejecutar consultas SQL en una base de datos y luego obtener los resultados, una columna a la vez.

Amrit Baghel
fuente
1

Pojo también lo considera como clase de modelo en Java donde podemos crear getter y setter para una variable particular definida en privado. Recuerde que todas las variables se declaran aquí con un modificador privado

Amrit Baghel
fuente