Bom galera, essa a segunda e última parte do post Criar CRUD em Java com JDBC.
Para acessar a parte 1 basta clicar aqui.
Nesse post nós vamos aprender a realizar algumas operações de CRUD com JDBC.
Nós criamos a base no post anterior que tem uma tabela chamada contatos, agora nós vamos criar nossa classe Java para representar um contato.
Para isso crie uma classe chamada Contato no pacote br.com.agenda.model, e digite o código abaixo:
package br.com.agenda.model; import java.util.Date; public class Contato { private int id; private String nome; private int idade; private Date dataCadastro; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public int getIdade() { return idade; } public void setIdade(int idade) { this.idade = idade; } public Date getDataCadastro() { return dataCadastro; } public void setDataCadastro(Date dataCadastro) { this.dataCadastro = dataCadastro; } }
Pronto o nosso modelo para contatos está criado, agora nós vamos criar a nossa classe que vai encapsular todas operações referente ao banco de dados.
Para isso crie uma classe chamada ContatoDAO no pacote br.com.agenda.dao e digite o código abaixo:
package br.com.agenda.dao; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import br.com.agenda.factory.ConnectionFactory; import br.com.agenda.model.Contato; public class ContatoDAO { public void save(Contato contato){ /* * Isso é uma sql comum, os ? são os parâmetros que nós vamos adicionar * na base de dados */ String sql = "INSERT INTO contatos(nome,idade,dataCadastro)" + " VALUES(?,?,?)"; Connection conn = null; PreparedStatement pstm = null; try { //Cria uma conexão com o banco conn = ConnectionFactory.createConnectionToMySQL(); //Cria um PreparedStatment, classe usada para executar a query pstm = conn.prepareStatement(sql); //Adiciona o valor do primeiro parâmetro da sql pstm.setString(1, contato.getNome()); //Adicionar o valor do segundo parâmetro da sql pstm.setInt(2, contato.getIdade()); //Adiciona o valor do terceiro parâmetro da sql pstm.setDate(3, new Date(contato.getDataCadastro().getTime())); //Executa a sql para inserção dos dados pstm.execute(); } catch (Exception e) { e.printStackTrace(); }finally{ //Fecha as conexões try{ if(pstm != null){ pstm.close(); } if(conn != null){ conn.close(); } }catch(Exception e){ e.printStackTrace(); } } } public void removeById(int id){ String sql = "DELETE FROM contatos WHERE id = ?"; Connection conn = null; PreparedStatement pstm = null; try { conn = ConnectionFactory.createConnectionToMySQL(); pstm = conn.prepareStatement(sql); pstm.setInt(1, id); pstm.execute(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try{ if(pstm != null){ pstm.close(); } if(conn != null){ conn.close(); } }catch(Exception e){ e.printStackTrace(); } } } public void update(Contato contato){ String sql = "UPDATE contatos SET nome = ?, idade = ?, dataCadastro = ?" + " WHERE id = ?"; Connection conn = null; PreparedStatement pstm = null; try { //Cria uma conexão com o banco conn = ConnectionFactory.createConnectionToMySQL(); //Cria um PreparedStatment, classe usada para executar a query pstm = conn.prepareStatement(sql); //Adiciona o valor do primeiro parâmetro da sql pstm.setString(1, contato.getNome()); //Adicionar o valor do segundo parâmetro da sql pstm.setInt(2, contato.getIdade()); //Adiciona o valor do terceiro parâmetro da sql pstm.setDate(3, new Date(contato.getDataCadastro().getTime())); pstm.setInt(4, contato.getId()); //Executa a sql para inserção dos dados pstm.execute(); } catch (Exception e) { e.printStackTrace(); }finally{ //Fecha as conexões try{ if(pstm != null){ pstm.close(); } if(conn != null){ conn.close(); } }catch(Exception e){ e.printStackTrace(); } } } public List<Contato> getContatos(){ String sql = "SELECT * FROM contatos"; List<Contato> contatos = new ArrayList<Contato>(); Connection conn = null; PreparedStatement pstm = null; //Classe que vai recuperar os dados do banco de dados ResultSet rset = null; try { conn = ConnectionFactory.createConnectionToMySQL(); pstm = conn.prepareStatement(sql); rset = pstm.executeQuery(); //Enquanto existir dados no banco de dados, faça while(rset.next()){ Contato contato = new Contato(); //Recupera o id do banco e atribui ele ao objeto contato.setId(rset.getInt("id")); //Recupera o nome do banco e atribui ele ao objeto contato.setNome(rset.getString("nome")); //Recupera a idade do banco e atribui ele ao objeto contato.setIdade(rset.getInt("idade")); //Recupera a data do banco e atribui ela ao objeto contato.setDataCadastro(rset.getDate("dataCadastro")); //Adiciono o contato recuperado, a lista de contatos contatos.add(contato); } } catch (Exception e) { e.printStackTrace(); }finally{ try{ if(rset != null){ rset.close(); } if(pstm != null){ pstm.close(); } if(conn != null){ conn.close(); } }catch(Exception e){ e.printStackTrace(); } } return contatos; } }
Pronto criamos todos os métodos para realizar as operações de CRUD, agora basta usar eles, para isso crie uma classe chamada TesteAgenda na raiz do seu projeto e digite o código abaixo:
import java.util.Date; import br.com.agenda.dao.ContatoDAO; import br.com.agenda.model.Contato; public class TesteAgenda { public static void main(String args[]){ ContatoDAO contatoDAO = new ContatoDAO(); //Cria um contato e salva no banco Contato contato = new Contato(); contato.setNome("ETELVINO"); contato.setIdade(503); contato.setDataCadastro(new Date()); contatoDAO.save(contato); //Atualiza o contato com id = 1 com os dados do objeto contato1 Contato contato1 = new Contato(); contato1.setId(1); contato1.setNome("NOME NOVO"); contato1.setIdade(32); contato1.setDataCadastro(new Date()); contatoDAO.update(contato1); //Remove o contato com id = 1 contatoDAO.removeById(1); //Lista todos os contatos do banco de dados for(Contato c : contatoDAO.getContatos()){ System.out.println("NOME: " + c.getNome()); } } }
Pronto criamos o nosso CRUD em Java com JDBC, agora você pode usar essas operações em aplicações desktop ou até mesmo aplicações web.
Espero que tenham gostado.
Até o próximo post.
Legal, vou indicar p/ o pessoal que me aparece todo dia pedindo ajuda p/ fazer um CRUD;
Só umas dicas p/ ficar melhor:
* fazer o DAO implementar um interface p/ os métodos ficarem ficarem padrão para todos DAOs;
* usar a classe Logger p/ emitir logs ao invés de system.out (como você na primeira parte), assim consegue controlar o nível de logs, formatação e saída p/ arquivo;
* na primeira parte também, usar um datasource p/ gerenciar as conexões, senão vai entupir o banco de conexão aberta sem usar;
São detalhes que fazem muita diferença mas a parte que você fez esta ótimo para quem esta começando;
Opa que bom que gostou Georjuan.
Obrigado pelas dicas =)
Mas a intenção do post é realmente para os iniciantes =)
Até +
Muito bom meu caro!
Quando a gente escreve para quem sabe menos demostra N coisa, uma delas é de que estamos devolvendo o conhecimento obtido, pq também tivemos ajuda no passado…
Obrigado por compartilhar!
Obrigado Lucas
Também penso assim, já aprendi muita coisa com a comunidade e agora estou compartilhando um pouco do conhecimento obtido com o tempo.
Até +
Parabéns pelo tutorial Bruno.
Sou programador Delphi e to tendo que aprender Java agora na pós, e esse teu CRUD vai me ajudar bastante..
Aguardamos novos tutos, valeu!
Obrigado Renato
Que bom que o blog está te ajudando nesse início de jornada.
Pode deixar que sempre que sobrar um tempinho eu posto coisas novas.
Até +
Bom post! Ótimo para iniciantes, pois ensina de uma forma facil e utilizando os padroes de desenvolvimento. Uma dica.: você publicar um outro post desse CRUD envolvendo agora tbm o singleton.
Opa Márcio
Obrigado, que bom que gostou.
Pode deixar, assim que eu tiver um tempinho posto uma versão Singleton do ConnectionFactory.
Até +
Olá Bruno primeiramente gostaria de agradecer pelo trabalho.
Eu criei a seguinte estrutura:
Agenda
src
br.com.agenda.dao
br.com.agenda.model
br.com.rastreador.factory
E coloquei a classe “TesteAgenda” em pacote default.
Não entendi o que é a “raiz do meu projeto”, poderia
me dizer onde exatamente devo colocar a classe “TesteAgenda”
Seria também uma opção correta coloca-la em pacote chamado:
br.com.agenda.test ?
Lembrando que eu consegui executar normalmente a aplicação,
só quero mesmo saber o local adequado para colocar essa Classe.
Novamente agradeço, gostei muito desse post.
Olá Douglas.
A raiz do seu projeto é a pasta src que fica ali da árvore de diretórios do eclipse.
Como é pra teste, tanto faz colocar na raiz do projeto ou em um pacote de testes, em um projeto real, as classes para testes normalmente sao colocadas em um pacote teste mesmo.
Obrigado.
Até +.
Amigo, como incluir JPA nesses códigos.
Seu tutorial me ajudou em um trabalho de faculdade, mas agora o professor que que se inclua JPA
Poderia me ajudar?
Opa Conrado.
Segue o post abaixo e vê se ajuda
http://www.brunorota.com.br/blog/exemplo-jpajbosseclipse/
Valew
Nossa muito legal…!
Curti, na vdd é a primeira vez que consegui segui um tutorial que dá certo!!!
Opa que bom que gostou.
valeww
Cara me ajudou muito esse tutorial, muito obrigado!
Gostaria apenas de tirar uma dúvida quanto ao método UPDATE.
Se um contato tivesse um numero maior de informações com mais de 10 campos e eu quizesse apenas atualizar alguns campos.
Como eu faria isso usando o PrepareStatement? Devo sempre mudar o codigo SQL e os parametros do PrepareStat.? Teria alguma outra forma simplificada de fazer isso usando outro método?
Valeu!!
Bruno desculpe a demora para responder.
Olha faz muito tempo que não trabalho com JDBC, mas eu acredito que essa validação você tem que fazer na “mão”.
Uma API que tem várias funções para facilitar nosso trabalho, inclusive essa função que você citou é o JPA(Java Persistence API).
Fico contente por ter ajudado de alguma forma.
Abraçoss.
Muito bom jovem, me ajudou muito, fiz algumas alterações para funcionar em java 8
public ArrayList allPersons(){
String sql = “select * from persons”;
ArrayList persons = new ArrayList();
try(Connection conn = Database.getConnection()){
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
while(rs.next()){
Person person = new Person(rs.getInt(“id”));
person.setName(rs.getString(“name”));
person.setPersonType(new PersonType(rs.getInt(“person_type_id”)));
person.setCreated( (Date) rs.getDate(“created”));
person.setModified( (Date) rs.getDate(“modified”));
persons.add(person);
}
}catch(SQLException e){
}
return persons;
}
Opa Elton,que bom que ajudou =)
É está meio desatualizado hehehe, mas a idéia é praticamente a mesma pra quem está iniciando.
Abraços
Olá Bruno, tudo bem ?
Estamos em 2019 e estou eu aqui utilizando o seu tutorial para aprender JAVA.
Muito legal, estou voltando a escrever sistema depois de alguns anos em outra área e além de conseguir fazer funcionar todas as rotinas ainda consegui entender melhor os conceitos de OOP.
Muito obrigado!
Bom dia Cícero,
Opa, que bom que ajudou, sucesso na retomada da jornada =D
Eu tenho uma vídeo aula aqui de como criar uma app web http://ensinobr.com.br/ acredito que possa ajudar também.
Abraçãoo