Olá galera,
Escrevi um programinha no modelo MVC para testar meus conhecimentos, gostaria da opinião de vocês para atualizar os métodos/classes que não estão de acordo com o padrão usado hoje em dia.
Qualquer ajuda é bem vindo.
Obrigado a todos.
Olá galera,
Escrevi um programinha no modelo MVC para testar meus conhecimentos, gostaria da opinião de vocês para atualizar os métodos/classes que não estão de acordo com o padrão usado hoje em dia.
Qualquer ajuda é bem vindo.
Obrigado a todos.
Melhor coisa:
Migra pra JavaFX
Vai facilitar bastante o modelo MVC e o desenvolvimento.
Infelizmente não pude olhar todo o projeto, mas me pareceu bem organizado.
Obrigado pelo retorno.
Me surgiu algumas duvidas:
//tem como fazer um try para fechar automaticamente a conexão? PreparedStatement stmt = (PreparedStatement) conn.prepareStatement("insert into disciplina (cursoQueElaPertence,nome,cargaHoraria,numeroDeVagas,periodo) values (?,?,?,?,?)"); stmt.setString(1, disciplina.getCursoQueElaPertence()); stmt.setString(2, disciplina.getNomeDaDiciplina()); stmt.setFloat(3, disciplina.getCargaHoraria()); stmt.setInt(4, disciplina.getNumeroDeVagas()); stmt.setString(5, disciplina.getPeriodo()); int linhaInseridas = stmt.executeUpdate(); //usar o executeUpdate ou executeQuery if (linhaInseridas > 0) JOptionPane.showMessageDialog(null, "A disciplina foi inserida com sucesso!", "Mensagem", JOptionPane.INFORMATION_MESSAGE); } catch (ClassNotFoundException|SQLException e) { JOptionPane.showMessageDialog(null, "Erro:\n" + e.toString(), "Mensagem" , JOptionPane.ERROR_MESSAGE); }
Faça um pacote separado para classes de banco (DAO).
Para fechar, utilize a clausula try/catch/finnaly, fechando a conexão no bloco finnaly.
executeUpdate é para fazer atualizações/deleções no banco.
executeQuery é para fazer consultas no banco.
Para iniciante a parte que acima do código está muito boa.
Quando estiver realmente entendendo todo o conceito do java(onde usar as classes e coleções mais utilizadas), começa a pesquisar alguns frameworks como Hibernate para persistência, Maven, etc.
Obrigado Fabio, com o tempo vou adicionar os frameworks.
Uma coisa que ainda não entendi é porque foi obrigado a fazer cast no stmt e rs
public List<Disciplina> listar() {
List<Disciplina> disciplinas = new ArrayList<>();
try (Connection conn = BD.getConnection()) {
String sql = "select * from disciplina order by id asc";
try (PreparedStatement stmt = (PreparedStatement) conn.prepareStatement(sql)) {
try (ResultSet rs = (ResultSet) stmt.executeQuery()) {
while (rs.next()) {
disciplinas.add(new Disciplina(rs.getInt("id"), rs.getString("nome"),
rs.getFloat("cargaHoraria"), rs.getString("cursoQueElaPertence"),
rs.getInt("NumeroDevagas"), Periodo.converte(rs.getString("periodo"))));
}
}
}
} catch (ClassNotFoundException | SQLException e) {
JOptionPane.showMessageDialog(null, "Erro:\n" + e.toString(), "Mensagem", JOptionPane.ERROR_MESSAGE);
}
return disciplinas;
}
–
Na classe Disciplina.java tenho 2 construtores, a diferença entre eles é que um recebe o id e outro não.
O que nao recebe uso para inserir ele no banco, o que recebe uso para extrair ele do banco.
Essa pratica de usar 2 construtores para essa finalidade é usada ou escrevi muito código atoa, tem alguma forma de usar somente um construtor?
public class Disciplina {
private int Id;
private String nome;
private float cargaHoraria;
private String cursoQueElaPertence;
private int vagas;
private Periodo periodo;
public Disciplina(String nomeDaDiciplina, float cargaHoraria, String cursoQueElaPertence, int numeroDeVagas, Periodo periodo) {
this.nome = nomeDaDiciplina;
this.cargaHoraria = cargaHoraria;
this.cursoQueElaPertence = cursoQueElaPertence;
this.vagas = numeroDeVagas;
this.periodo = periodo;
}
public Disciplina(int Id, String nomeDaDiciplina, float cargaHoraria, String cursoQueElaPertence, int numeroDeVagas, Periodo periodo) {
this.Id = Id;
this.nome = nomeDaDiciplina;
this.cargaHoraria = cargaHoraria;
this.cursoQueElaPertence = cursoQueElaPertence;
this.vagas = numeroDeVagas;
this.periodo = periodo;
}
//metodos getters
}
retire os parâmetros de dentro do try:
try (Connection conn = BD.getConnection())
try (PreparedStatement stmt = (PreparedStatement) conn.prepareStatement(sql))
try (ResultSet rs = (ResultSet) stmt.executeQuery())
Faça apenas um try sem parâmetros:
try {
Connection conn = BD.getConnection();
String sql = "select * from disciplina order by id asc";
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery())
Apenas um try é suficiente. Em qualquer erro ele vai parar a execução.
Eu particularmente não uso muito construtores.
Geralmente uso o construtor padrão e utilizo apenas as variáveis que necessito.
try {
Connection conn = BD.getConnection();
String sql = "select * from disciplina order by id asc";
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery())
Essa eu não sabia, dessa forma ele tambem fecha a conn e o stmt?
Eu particularmente não uso muito construtores.
Geralmente uso o construtor padrão e utilizo apenas as variáveis que necessito.
Entendi, vou pesquisar referente ao construtor, obrigado por tudo!
Se mais alguém quiser deixar alguma opinião, gostaria de saber.
Da forma que vc faz, em momento algum ele está fechando a conexão.
Do modo que disse, depois do bloco catch, insira o bloco finnaly e feche a conexão nele.
Está enganado… O rapaz estava usando o try-with-resources.
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
Já li sobre, porém nunca tinha implementado. Não atentei para a interface AutoCloseable.
Porém, particularmente prefiro usar try/catch/finnaly.
Já li sobre, porém nunca tinha implementado. Não atentei para a interface AutoCloseable.
Porém, particularmente prefiro usar try/catch/finnaly.
Me causou um pouco de confusão, mas entendi.
Percebi que usando o try/catch/finnaly o código fica mais limpo.
–edit
Sobre os cast, eu estava usando os imports errados:
package com.rafinhaa.model;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.ResultSet;
Só foi alterar para o certo e voilà
package com.rafinhaa.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import com.rafinhaa.model.Disciplina;
import com.rafinhaa.model.Periodo;
O lado bom é que se você não precisa se lembrar de fechar a conexão, ela nunca vai ser esquecida aberta…