A persistência de dados é um assunto importantíssimo independente da linguagem, nesse artigo vou ensinar como você pode gravar informações em seu banco de dados usando Java. Persistir dados em um banco de dados, arquivo ou qualquer outra forma é essencial para qualquer aplicação. Como iremos persistir estes dados é uma decisão importante a ser tomada pelo desenvolvedor.
Nesta aula iremos desenvolver uma forma bastante “primitiva” de persistência de dados e utilizaremos as classes de acesso (DAO – data access object). Estas classes isolam a persistência dos dados e utiliza strings para realizar as operações na base de dados.
Esse artigo pertence a uma sequência de conteúdos sobre programação web com Java. Clique aqui e acesse agora.
Inicializando um novo projeto
Para o projeto dessa aula iremos utilizar também a arquitetura MVC (model, view, controler). Nesta arquitetura iremos separar cada parte do projeto web para que eles realizem uma função específica.
- Model: irá conter as informações de cada entidade do banco de dados, assim como as definições de funções que poderão realizar a manipulação da base.
- View: é responsável por manipular a interface (HTML) e enviar informações para o controler.
- Controler: responsável por controlar a camada de view e model contendo as regras de negócio.
Considerando o padrão MVC, iremos criar 3 novos pacotes dentro de nosso projeto de exemplo dessa aula:
Criando um modelo básico de “pessoa”
Após a criação dos pacotes onde iremos guardar nossas classes, iremos começar criando um modelo muito simples de uma “pessoa”. Esta classe é muito utilizada para realizar cadastro de clientes. Veja a implementação:
package Model;
public class Pessoa {
private int idPessoa;
private String nomePessoa;
private String emailPessoa;
private String senhaPessoa;
public Pessoa(int idPessoa, String nomePessoa, String emailPessoa, String senhaPessoa) {
this.idPessoa = idPessoa;
this.nomePessoa = nomePessoa;
this.emailPessoa = emailPessoa;
this.senhaPessoa = senhaPessoa;
}
public Pessoa() {
}
public int getIdPessoa() {
return idPessoa;
}
public void setIdPessoa(int idPessoa) {
this.idPessoa = idPessoa;
}
public String getNomePessoa() {
return nomePessoa;
}
public void setNomePessoa(String nomePessoa) {
this.nomePessoa = nomePessoa;
}
public String getEmailPessoa() {
return emailPessoa;
}
public void setEmailPessoa(String emailPessoa) {
this.emailPessoa = emailPessoa;
}
public String getSenhaPessoa() {
return senhaPessoa;
}
public void setSenhaPessoa(String senhaPessoa) {
this.senhaPessoa = senhaPessoa;
}
@Override
public String toString() {
return "Pessoa{" + "idPessoa=" + idPessoa + ", nomePessoa=" + nomePessoa + ", emailPessoa=" + emailPessoa + ", senhaPessoa=" + senhaPessoa + '}';
}
}
Criando um controler (DAO)
No pacote denominado Controler iremos armazenar uma classe que utiliza um modelo e realiza a persistência dos dados no banco de dados. Para isso iremos definir 5 funções que são as principais de um sistema (CRUD). São elas: criar, ler por id, ler todos, atualizar e deletar.
Veja como os protótipos desta classe ficam (ainda sem a implementação da busca na base de dados):
package Controler;
import Model.Pessoa;
import java.util.ArrayList;
import java.util.List;
public class PessoaDAO {
public boolean criar(Pessoa p) {
return true;
}
public boolean update(Pessoa p) {
return true;
}
public boolean delete(Pessoa p) {
return true;
}
public Pessoa lerPorId(int id) {
Pessoa p = new Pessoa();
return p;
}
public List<Pessoa> lerTodas() {
List<Pessoa> listaDePessoas = new ArrayList<>();
return listaDePessoas;
}
}
Porém, para criar realizar estas operações é necessário especificar qual a base de dados utilizada, driver, string de conexão e principalmente abrir uma conexão com a base de dados. Então implementaremos uma classe chamada DbConnect que realizará esta conexão e armazenaremos dentro de um novo pacote denominado “Util”.
package Util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DbConnect {
public static String status = "Não conectou...";
public DbConnect() {
}
public static java.sql.Connection getConexaoMySQL() {
Connection connection = null; //atributo do tipo Connection
try {
String driverName = "com.mysql.jdbc.Driver";
Class.forName(driverName);
String serverName = "localhost"; //caminho do servidor do BD
String mydatabase = "mysql"; //nome do seu banco de dados
String url = "jdbc:mysql://" + serverName + "/" + mydatabase;
String username = "root"; //nome de um usuário de seu BD
String password = "12345"; //sua senha de acesso
connection = DriverManager.getConnection(url, username, password);
if (connection != null) {
status = ("STATUS--->Conectado com sucesso!");
} else {
status = ("STATUS--->Não foi possivel realizar conexão");
}
return connection;
} catch (ClassNotFoundException e) { //Driver não encontrado
System.out.println("O driver expecificado nao foi encontrado.");
return null;
} catch (SQLException e) {
System.out.println("Nao foi possivel conectar ao Banco de Dados.");
return null;
}
}
public static String statusConection() {
return status;
}
public static boolean FecharConexao() {
try {
DbConnect.getConexaoMySQL().close();
return true;
} catch (SQLException e) {
return false;
}
}
public static java.sql.Connection ReiniciarConexao() {
FecharConexao();
return DbConnect.getConexaoMySQL();
}
}
Veja que a classe implementada acima possui métodos de pegar uma conexão e fechar uma conexão. Porém, são métodos estáticos (static) e não precisam de uma instância para serem executados.
O primeiro passo para a persistência de dados é criar uma conexão no controler (conn) e posteriormente criar um statement. A partir do statement criado você poderá executar qualquer operação da base de dados (CRUD).
Veja abaixo como fica o código do comando criar:
public boolean criar(Pessoa p) {
Connection conn = DbConnect.getConexaoMySQL();
String insertSQL = "INSERT INTO Pessoa (nomePessoa, senhaPessoa, emailPessoa) VALUES ('"
+ p.getNomePessoa() + "','"
+ p.getSenhaPessoa() + "','"
+ p.getEmailPessoa() + "')";
try {
Statement st = conn.createStatement();
st.executeUpdate(insertSQL);
return true;
} catch (SQLException ex) {
Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
}
A seguir, temos o exemplo do comando de realizar uma leitura no banco de dados utilizando um ResultSet como objeto de retorno:
public Pessoa lerPorId(int id) {
Pessoa p = new Pessoa();
Connection conn = DbConnect.getConexaoMySQL();
String selectSQL = "SELECT * FROM Pessoa WHERE idPessoa = " + id;
try {
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(selectSQL);
while (rs.next()) {
p.setNomePessoa(rs.getString("nomePessoa"));
p.setSenhaPessoa(rs.getString("senhaPessoa"));
p.setEmailPessoa(rs.getString("emailPessoa"));
}
} catch (SQLException ex) {
Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
}
return p;
}
Para testarmos a persistência de dados criaremos uma classe no pacote de testes que realizara uma simples adição no banco e consulta.
public class TestandoPersistencia {
public static void main(String[] args) {
Pessoa p = new Pessoa(0, "Nome da pessoa", "[email protected]", "12345");
PessoaDAO pDao = new PessoaDAO();
pDao.criar(p);
System.out.println(pDao.lerPorId(1));
}
}
Acesse todo esse código no Github:
Exercício
Agora é sua vez… a aula mostrou como criar duas operações do CRUD – Create e Read. Ainda faltam o delete e o Update. Sua tarefa é modificar o código e realizar estas tarefas. Utilize outras classes de teste dentro do pacote “tests”.