Я не могу получить шаблон DAO/DTO с SQLite в Java

Я пытался понять шаблон DAO, но сейчас я не добился успеха. Возможно, потому что я не смог применить то, что нашел в Интернете, к проблеме, которую я пытаюсь решить. Я хочу инкапсулировать базу данных, делать все правильно.

Я сделал это до сих пор, но я чувствую, что это довольно бесполезно.

Мой класс DTO:

   public class PersonDTO{
        final public static String TABLE = "PEOPLE";
        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;
        }
    }

Мой "ДАО"

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

public class PersonDAO {
    private Connection connection;
    private DTO dto;
    private Statement stmt = null;
    private String tableName;
    private Integer id;

    public PersonDAO() {

    }

    public PersonDTO getPerson(int id) {
        connection = ConnectionFactory.getInstance();
        PersonDTO person = new PersonDTO();
        try {
            stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM " + PersonDTO.TABLE +" WHERE ID = '"+id+"'");
            person.setId(rs.getInt("id"));
            person.setName(rs.getString("age"));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        closeConnection();
        return person;
    }

    public void save() {
        throw new UnsupportedOperationException(); //not implemented yet
    }

    public void update() {
        throw new UnsupportedOperationException(); //not implemented yet
    }

    public void delete() {
        throw new UnsupportedOperationException(); //not implemented yet
    }

    public List<DTO> getDTO(String filter) {
        return null;
    }

    protected void closeConnection() {
        try {
            connection.close();
            connection = null;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Я не могу получить:

  1. Как предполагается, это отношения между классом DTO и классом DAO.
  2. Класс DAO должен иметь методы для получения информации из базы данных?
  3. Для чего нужен класс DTO, почему бы просто не использовать класс Person?

Это довольно сложно. Буду благодарен за любую помощь.

2 ответа

Вот в вашем примере с DTO может быть бесполезным, но это не бесполезно в целом.

DTO объект должен быть выходом remote service (RMI/Web service request),

Объект, который переносит данные между процессами, чтобы уменьшить количество вызовов метода.

Ссылка: http://martinfowler.com/eaaCatalog/dataTransferObject.html

Этот объект должен нести данные, чтобы уменьшить количество вызовов метода.

Как вы использовали PersonDTO нести Person данные таблицы. Однако создавать бесполезно PersonDTO только для одного объекта вместо пользователя Person,

Если у вас был список людей, или могут быть какие-то другие данные, которые содержат больше информации о состоянии запроса, как показано ниже

public class PersonDTO {
    public List<Person> personList;
    public Fault fault;

    public class Fault {
        String faultCode;
        String faultMessage
    }

    public Date requestDate;
    public UUID requestId;
    public String requestSignature;

    ...
}

В этом случае имеет смысл использовать DTO возражать, так как есть больше ответа, чем просто человек.

DTO также может нести агрегированные данные. Это должен быть внешний вид вашего удаленного метода. Нормальный объект - это закрытый вид изнутри, с которым вы можете взаимодействовать.

DAO обозначает Data Access Object, Как видно из названия, его ответственность - доступ к данным. Это означает, что он знает, как использовать подключение к данным для извлечения объектов из хранилища данных.

DTO обозначает Data Transfer Object, Его обязанность заключается в том, чтобы инкапсулировать формат данных в конструкцию языка программирования, которая облегчает его использование в коде.

По моему мнению DAO следует иметь дело с вашей объектной моделью, а не в DTO"S. Другими словами, интерфейс должен вернуться Person не PersonDTO, Внутренне вашему DAO Реализация может быть удобно использовать посредника DTO объект, чтобы помочь вам в получении и хранении ваших объектов. Если вы используете Hibernate и / или JPA, вы должны создать DTO с вашими аннотациями JPA на нем, например.

Вот как я бы реализовал:

// Define an interface for your DAO so you can mock in unit tests, or swap out an implementation if you decide not to use SQLite
public interface PersonDao {
    Person getPerson(int id) throws PersonDaoException;
}

// Write your implementation for SQLite. I fixed some design/implementation issues
class PersonDaoSqlite implements PersonDao {
    private final DataSource ds;

    public PersonDaoSqlite(DataSource ds) {
        this.ds = ds;
    }

    public Person getPerson(int id) {
        Connection connection = null;
        try {
            connection = ds.getConnection();
            PreparedStatement stmt = connection.prepareStatement("SELECT * FROM PEOPLE WHERE ID = ?");
            stmt.setInt(1, id);
            ResultSet rs = stmt.executeQuery();
            Person person = new Person();
            person.setId(rs.getInt("id"));
            person.setName(rs.getString("age"));
        } catch (SQLException e) {
            throw new PersonDaoException(e);
        } finally {
            if (connection != null) {
                connection.close();
            }
        }
    }
}

public class PersonDaoException extends Exception {
     public PersonDaoException(Throwable cause) {
          super(cause);
     }
}

public class Person {
    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;
    }
}
Другие вопросы по тегам