O que esta sendo usando hoje em dia?

11 respostas
programaçãojavamvc
R

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.

11 Respostas

C

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.

R

Obrigado pelo retorno.

Me surgiu algumas duvidas:

  • Classes DAO ficam junto com o pacote model?
  • Umas duvidas no Método de DAO que deixei comentadas
//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);
		}
F

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.

R

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
}
F

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.

R
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.

F

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.

E

Está enganado… O rapaz estava usando o try-with-resources.

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

F

Já li sobre, porém nunca tinha implementado. Não atentei para a interface AutoCloseable.

Porém, particularmente prefiro usar try/catch/finnaly.

R

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;
E

O lado bom é que se você não precisa se lembrar de fechar a conexão, ela nunca vai ser esquecida aberta…

Criado 7 de maio de 2017
Ultima resposta 13 de mai. de 2017
Respostas 11
Participantes 4