DEV Community

Pranav Bakare
Pranav Bakare

Posted on

DTO & DAO in Software Development

DTO (Data Transfer Object) and DAO (Data Access Object) are key design patterns often used in software development, particularly in Java-based applications. Here's an explanation of each and how they relate:


DTO (Data Transfer Object):

Purpose: DTO is a simple object designed to transfer data between layers or processes in an application.

Use Case: It is often used to encapsulate data in a way that minimizes the number of method calls (by bundling related data) and ensures no unnecessary business logic resides within it.

Characteristics:

Contains fields to store data.

No business logic or methods except getters and setters.

Can be serialized for network communication or API responses.

Example of DTO:

public class UserDTO {
private String username;
private String email;

// Constructor
public UserDTO(String username, String email) {
    this.username = username;
    this.email = email;
}

// Getters and setters
public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}
Enter fullscreen mode Exit fullscreen mode

}


DAO (Data Access Object):

Purpose: DAO is responsible for interacting with the database. It provides methods to perform CRUD (Create, Read, Update, Delete) operations on a data source, abstracting the persistence logic.

Use Case: It separates the database operations from the business logic, adhering to the Single Responsibility Principle.

Characteristics:

Encapsulates SQL queries or ORM (like Hibernate, JPA) logic.

Interfaces with the database layer.

Provides reusable methods like save(), findById(), delete(), etc.

Example of DAO:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class UserDAO {
private Connection connection;

public UserDAO(Connection connection) {
    this.connection = connection;
}

public UserDTO getUserById(int id) throws Exception {
    String query = "SELECT username, email FROM users WHERE id = ?";
    PreparedStatement statement = connection.prepareStatement(query);
    statement.setInt(1, id);
    ResultSet resultSet = statement.executeQuery();

    if (resultSet.next()) {
        String username = resultSet.getString("username");
        String email = resultSet.getString("email");
        return new UserDTO(username, email);
    }
    return null;
}

public void saveUser(UserDTO user) throws Exception {
    String query = "INSERT INTO users (username, email) VALUES (?, ?)";
    PreparedStatement statement = connection.prepareStatement(query);
    statement.setString(1, user.getUsername());
    statement.setString(2, user.getEmail());
    statement.executeUpdate();
}
Enter fullscreen mode Exit fullscreen mode

}


Integration:

In an application, a DAO retrieves data from the database, converts it into DTO objects, and sends these to other layers (like services or controllers).

Example Flow:

  1. Controller Layer: Calls the Service Layer.

  2. Service Layer: Interacts with the DAO to fetch or save data.

  3. DAO Layer: Fetches data, converts it into DTO, and returns it.

Code Example:

// Controller
public UserDTO getUserDetails(int id) {
return userService.getUserById(id);
}

// Service
public UserDTO getUserById(int id) {
return userDAO.getUserById(id);
}


Benefits:

DTO: Optimizes data transfer and decouples UI or external API responses from internal entities.

DAO: Centralizes database access logic, making it reusable and testable.

Let me know if you'd like a deeper explanation or examples!

Top comments (0)