É correto criar uma classe objeto para retornos de um select do banco de dados quando se precisa utilizar as informações para cálculos. Ou isso seria uma gambiarra?
Obs:
quando não se sabe a quantidade de linhas que será retornada
É correto criar uma classe objeto para retornos de um select do banco de dados quando se precisa utilizar as informações para cálculos. Ou isso seria uma gambiarra?
Obs:
quando não se sabe a quantidade de linhas que será retornada
Não é gambiarra. É isso que vc faria se estivesse trabalhando com um ORM como o Hibernate, por exemplo.
E na verdade, na minha opinião, fica até bem elegante.
Imagina que vc tem uma tabela chamada “users” com 2 colunas, id e name, vc representaria com uma classe tipo esta:
class User {
private Long id;
private String name;
User(Long id, String name) {
this.id = id;
this.name = name;
}
Long getId() {
return this.id;
}
String getName() {
return this.name;
}
}
Usando JDBC, seu DAO poderia ser implementado assim:
class UserDao {
private final DataSource dataSource;
UserDao(DataSource dataSource) {
this.dataSource = dataSource;
}
List<User> findAll() {
try (
Connection conn = this.dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet result = stmt.executeQuery("SELECT * FROM users")
) {
List<User> users = new ArrayList<>();
while (result.next()) {
users.add(new User(result.getLong(1), result.getString(2)));
}
return users;
} catch (SQLException e) {
e.printStackTrace();
}
return Collections.emptyList();
}
Optional<User> findById(Long id) {
try (
Connection conn = this.dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
) {
stmt.setLong(1, id);
try (ResultSet result = stmt.executeQuery()) {
if (result.next()) {
return Optional.of(new User(result.getLong(1), result.getString(2)));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return Optional.empty();
}
}
E se vc estiver usando Lombok, vc poderia deixar a classe User
assim:
@Value
class User {
private Long id;
private String name;
}
E se vc estiver usando Java 17 ou superior, seu User
poderia ser um record:
record User(Long id, String name) {}
Por que vc cogitou que seria gambiarra?
Achei que só se criava classes objetos quando se tivesse algo que tem suas características bem definidas, que pertence a uma única tabela no bd … …um select ele pode conter informações de diferentes tabelas no bd o que seria uma mistura de informações…
Sem contar que no modelo MVC, criamos a classe model a classe controladora e o view. Por exemplo faz sentido eu ter uma classe chamada Usuario (model) e seu controlador…
Agora na minha “ignorância” tudo aquilo que não faz sentido ter um controlador não faria sentido ter uma classe model (como seria o caso de uma consulta sql).
Obs: tudo isso é uma grande duvida na verdade…
Hum, acho que vc pode ter razão, mas não me ocorreu nenhum exemplo, vc consegue me dar uma situação de exemplo?
Com isto eu não concordo. Imagina que vc tem um sisteminha de blog onde o usuário pode criar posts e atribuir tags para cada post. Digamos que vc está usando JPA.
Neste exemplo vc teria um PostController
, mas poderia não ter um TagController
, pois as tags são predefinidas pelo sistema e o usuário não ter como criar ou editar tags, apenas adicionar ou remover a um post.
Então vc teria as classes PostController
, Post
e Tag
. Vc relacionaria Tag
com Post
de uma forma que ao salvar um post, o JPA já salva as tags automaticamente.
Por exemplo uma tabela carro que tem ligação com abastecimento e com manutenção. Se eu quiser saber o gasto total do veiculo preciso de dados de duas tabelas…
Faz total sentido! Obrigado pelo esclarecimento.
No caso vc só precisa do gasto total e nada mais? Se for assim, acredito vc poderia só retornar um BigDecimal
simples e realmente não precisaria criar uma classe só para isso.
não é meu caso… so lhe dei um exemplo de resultados oriundos de duas tabelas…
Ah sim, entendo, mas eu acho que é isso, se é só o total e nada mais, não precisaria criar uma nova classe.