Patrón DTO en Java: qué es y cómo usarlo
Aprende qué es el patrón DTO en Java, cómo se usa en APIs REST y Spring Boot, con ejemplos de código y diferencias con POJO y entidades.

Patrón DTO en Java: qué es y cómo usarlo
Un DTO (Data Transfer Object) es un patrón de diseño en Java que transfiere datos entre capas de una aplicación sin lógica de negocio. Es una clase plana con atributos privados, getters y setters, usada en APIs REST y Spring Boot para no exponer entidades de base de datos directamente.
Última actualización: agosto 2026
Pon en práctica lo aprendido y experimenta con DTOs en el Java Playground de CodeJa, con ejecución de código en el navegador.
Contenido Rápido
- DTO (Data Transfer Object) transfiere datos entre capas sin lógica de negocio
- Un DTO es un tipo específico de POJO
- Se usa en APIs REST para no exponer entidades de base de datos directamente
- Un DTO tiene atributos privados, getters y setters
- Spring Boot usa DTOs para separar capas de la arquitectura
El patrón de diseño DTO (Data Transfer Object) nos ayuda a separar las capas de nuestra aplicación de Java y, además, a simplificar los datos que vamos a utilizar o enviar en nuestros métodos. Por ejemplo, nos evita tener que hacer múltiples llamadas a diferentes métodos para obtener varios datos.
¿Qué es un DTO?
Un DTO (Data Transfer Object) u objeto de transferencia de datos es simplemente un POJO, es decir, una clase plana sin ningún tipo de lógica de negocio en su interior. Solo se usa para guardar datos dentro de él. Ejemplo:
public class UsuarioDTO implements Serializable {
private final String nombre;
private final String apellidos;
// constructor y otros métodos
}
Por norma general, los DTO son clases con atributos declarados con la palabra clave final, es decir, clases inmutables. Aunque esto suele discutirse en foros, un DTO no debería poder cambiar los datos que almacena, ya que sirve para transmitir datos específicos de nuestro proyecto; si los cambiamos de forma errónea, podríamos alterar el comportamiento de nuestra aplicación.
Además, suelen implementar la interfaz Serializable, ya que pueden convertirse en bytes para enviar u obtener la información de alguna fuente externa.
DTO vs POJO: principales diferencias
Todo DTO es un POJO, pero no todo POJO es un DTO. La diferencia está en el propósito: un DTO se crea específicamente para transferir datos entre capas, mientras que un POJO es una clase Java simple sin una función concreta.
| Característica | DTO | POJO |
|---|---|---|
| Propósito | Transferir datos entre capas | Clase simple genérica |
| Lógica de negocio | No contiene | No contiene |
| Dependencia de frameworks | Ninguna | Ninguna |
| Serialización | Suele ser Serializable | No es obligatoria |
¿Cómo usar un DTO?
A diferencia de las clases de modelo de dominio o las entidades, los DTO no tienen por qué enfocarse solo y exclusivamente a un tipo de dato, sino que podemos componer nuestro DTO con diferentes fuentes de datos y agruparlas desde diferentes llamadas para usarlo como mejor veamos en nuestro proyecto. En el siguiente ejemplo tendremos un DTO que obtiene datos de dos entidades, usuario y dirección, y las agrupa ambas.
public class UsuarioDTO implements Serializable {
private final String nombre;
private final String apellidos;
private final String calle;
// constructor y otros métodos
}
Para crear un UsuarioDTO tendremos que almacenar datos tanto del usuario como de su dirección de residencia. Para ello vamos a utilizar dos llamadas a nuestra base de datos, a las tablas USUARIOS y DIRECCIONES, gracias a JpaRepository de Spring Data:
public UsuarioDTO encontrarUsuario(final long idUsuario, final long idDireccion) {
final UsuarioEntidad usuarioEncontrado = usuarioRepositorio.findById(idUsuario)
.orElseThrow(() -> new EntityNotFoundException("Usuario con id " + idUsuario + " no encontrado"));
final DireccionEntidad direccionEncontrada = direccionRepositorio.findById(idDireccion)
.orElseThrow(() -> new EntityNotFoundException("Dirección con id " + idDireccion + " no encontrada"));
return new UsuarioDTO(usuarioEncontrado.getNombre(), usuarioEncontrado.getApellidos(), direccionEncontrada.getCalle());
}
Como vemos, hemos hecho dos consultas a la base de datos, pero al final tenemos un DTO con los datos del usuario que necesitamos llamando a un único método.
Preguntas Frecuentes
¿Qué es un DTO en Java?
DTO (Data Transfer Object) es un patrón de diseño que se utiliza para transferir datos entre capas de una aplicación. Es un objeto simple que contiene propiedades, getters y setters, sin lógica de negocio. Se usa para encapsular datos y enviarlos de un servicio a otro.
¿Qué es un POJO en Java?
POJO (Plain Old Java Object) es una clase Java simple que no depende de ningún framework ni interfaz especial. Es un objeto básico con atributos, constructores, getters y setters. Los DTO suelen ser un tipo específico de POJO.
¿Cuál es la diferencia entre DTO y POJO?
Un POJO es un término general para cualquier clase Java simple, mientras que un DTO es un POJO con un propósito específico: transferir datos entre capas. Todo DTO es un POJO, pero no todo POJO es necesariamente un DTO.
¿Cuándo usar DTOs en Java?
Usa DTOs cuando necesites transferir datos entre capas, por ejemplo, del repositorio al servicio o del servicio al controlador. Son especialmente útiles en APIs REST para evitar exponer entidades de base de datos directamente al cliente.
¿Cómo crear un DTO en Spring Boot?
Un DTO en Spring Boot es una clase Java simple con atributos privados, constructor vacío, constructor con parámetros, getters y setters. Se puede usar Lombok para reducir código boilerplate con @Data o @Getter y @Setter.
Artículos Relacionados
Newsletter Semanal de Java
Cada viernes recibe lo más nuevo del ecosistema Java: frameworks, herramientas y mejores prácticas.
🔒 Sin spam. Cancela cuando quieras.