Criando classe de conexão Java – Parte 2 [MVC+JDBC+CRUD]

Olá 😀

Este post é uma continuação do post anterior, nele irei exemplificar uma arquitetura MVC com C.R.U.D – [CREATE,READ,UPDATE,DELETE].
Cada classe será responsável unicamente por sua tarefa, seguindo o padrão singleton.

Teremos a seguinte estrutura:
ScreenHunter_03 Jul. 05 20.51

Esta é a tabela que precisamos criar no banco de dados:

--execute este DDL, antes de executar o programa
CREATE TABLE EMPREGADO(
	ID   	 NUMBER(8),
	CONSTRAINT ID_PK PRIMARY KEY(ID),
	NOME 	 VARCHAR(30),
	DAT_NASC DATE,
	SALARIO  NUMBER(15,2)
);

COMMIT WORK;

Vamos criar os pacotes, aperte a combinação [CTRL+N] digite package ou vá na aba Java > package, crie os pacotes:
br.modelo
br.visual

No pacote br.modelo aperte a combinação [CTRL+N], digite class ou vá na aba Java > class, coloque o nome de Empregado, esta classe é do tipo padrão chamado JavaBeans
Primeiro escreva a classe e seus atributos:

package br.modelo;

import java.sql.Date;

/**
 * classe Bean tem os campos da entidade EMPREGADO
 * @author Roberto Silva
 *
 */
public class Empregado {
	private int id;
	private String nome;
	private Date dat_nasc;
	private double salario;
}

Agora vamos gerar os métodos, clique com botão direito do mouse sobre a classe, siga para Source > Generate Getters and Setters, selecione todos atributos [OK].

Após isto iremos criar o método toString(), ele irá exibir o nosso Empregado de forma legível, siga para Source > Generate toString() [OK].

Após estes processos teremos os seguinte resultado:

package br.modelo;

import java.sql.Date;

/**
 * classe Bean tem os campos da entidade EMPREGADO
 * @author Roberto Silva
 *
 */
public class Empregado {
	private int id;
	private String nome;
	private Date dat_nasc;
	private double salario;
	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}
	/**
	 * @param id the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}
	/**
	 * @return the nome
	 */
	public String getNome() {
		return nome;
	}
	/**
	 * @param nome the nome to set
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}
	/**
	 * @return the date
	 */
	public Date getDat_nasc() {
		return dat_nasc;
	}
	/**
	 * @param date the date to set
	 */
	public void setDat_nasc(Date dat_nasc) {
		this.dat_nasc = dat_nasc;
	}
	/**
	 * @return the salario
	 */
	public double getSalario() {
		return salario;
	}
	/**
	 * @param salario the salario to set
	 */
	public void setSalario(double salario) {
		this.salario = salario;
	}

	/* (non-Javadoc) - exibe os atributos de Empregado
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return " id=" + id + ", nome=" + nome + ", dat_nasc="
				+ dat_nasc + ", salario=" + salario + " \n ";
	}
}

Agora vamos criar a classe responsável pela persistência dos dados em Empregado,
ficará no pacote br.modelo e chama-se EmpregadoDAO.Esta classe é do tipo DAO-Data Acess Object.

package br.modelo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.controle.AcessoBD;

/**
 * classe faz a persistencia com a entidade EMPREGADOS do ORACLE
 * @author Roberto Silva
 * criado em: 04/07/2013
 */
public class EmpregadoDAO {

	private Connection conn;
	private PreparedStatement pstm;
	private ResultSet rs;

	private final String SELECT=" SELECT * FROM EMPREGADO ";
	private final String INSERT=" INSERT INTO EMPREGADO(ID,NOME,DAT_NASC,SALARIO)VALUES(?,?,?,?) ";
	private final String UPDATE=" UPDATE EMPREGADO SET NOME=?,DAT_NASC=?,SALARIO=? WHERE ID=? ";
	private final String DELETE=" DELETE FROM EMPREGADO WHERE ID=? ";

	/**
	 * metodo seleciona registros de EMPREGADO
	 * @param nome
	 * @return
	 * @throws Exception
	 */
	public List selecionar(){
		List empregados=new ArrayList();
		Empregado emp=null;
		try {
			conn=AcessoBD.conectar();
			pstm=conn.prepareStatement(SELECT);
			rs=pstm.executeQuery();

			while(rs.next()){
				emp=new Empregado();
				emp.setId(rs.getInt("id"));
				emp.setNome(rs.getString("nome"));
				emp.setDat_nasc(rs.getDate("dat_nasc"));
				emp.setSalario(rs.getDouble("salario"));

				empregados.add(emp);
			}

		} catch (Exception e) {
			System.err.println("Ocorreu um erro, causa:"+e.getMessage());
			e.printStackTrace();
		}finally{
			AcessoBD.desconectar(conn, pstm, rs);
		}

		return empregados;
	}

	/**
	 * faz a inserção de EMPREGADO
	 * @param empregado
	 * @throws Exception
	 */
	public void inserir(Empregado emp){
		try {
			conn=AcessoBD.conectar();
			pstm=conn.prepareStatement(INSERT);
			pstm.setInt(1, emp.getId());
			pstm.setString(2, emp.getNome());
			pstm.setDate(3, emp.getDat_nasc());
			pstm.setDouble(4, emp.getSalario());

			pstm.executeUpdate();
		} catch (Exception e) {
			System.err.println("Ocorreu um erro, causa:"+e.getMessage());
			e.printStackTrace();
		}finally{
			AcessoBD.desconectar(conn, pstm, rs);
		}
	}

	/**
	 * faz a atualização de EMPREGADO
	 * @param empregado
	 * @throws Exception
	 */
	public void atualizar(Empregado emp){
		try {
			conn=AcessoBD.conectar();
			pstm=conn.prepareStatement(UPDATE);
			pstm.setString(1, emp.getNome());
			pstm.setDate(2, emp.getDat_nasc());
			pstm.setDouble(3, emp.getSalario());
			pstm.setInt(4, emp.getId());

			pstm.executeUpdate();
		} catch (Exception e) {
			System.err.println("Ocorreu um erro, causa:"+e.getMessage());
			e.printStackTrace();
		}finally{
			AcessoBD.desconectar(conn, pstm, rs);
		}
	}

	/**
	 * faz a exclusão de Empregado
	 * @param id
	 * @throws Exception
	 */
	public void excluir(int id){
		try {
			conn=AcessoBD.conectar();
			pstm=conn.prepareStatement(DELETE);
			pstm.setInt(1, id);

			pstm.executeUpdate();
		} catch (Exception e) {
			System.err.println("Ocorreu um erro, causa:"+e.getMessage());
			e.printStackTrace();
		}finally{
			AcessoBD.desconectar(conn, pstm, rs);
		}
	}
}

E por último temos a classe visual, que será criada no pacote br.visual, o nome dela será Principal:

package br.visual;

import java.sql.Date;
import java.text.SimpleDateFormat;

import br.modelo.Empregado;
import br.modelo.EmpregadoDAO;

/**
 * classe onde executa o programa
 * @author Roberto Silva
 *
 */
public class Principal {
	public static void main(String[] args) throws Exception{
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		EmpregadoDAO empDao=new EmpregadoDAO();

		Empregado emp1=new Empregado();
		Empregado emp2=new Empregado();
		Empregado emp3=new Empregado();

		//setando o empregado 1
		emp1.setId(1);
		emp1.setNome("Roberto");
		emp1.setDat_nasc(new Date(sdf.parse("1983-08-12").getTime()));
		emp1.setSalario(5500.45);

		//setando o empregado 2
		emp2.setId(2);
		emp2.setNome("Katia");
		emp2.setDat_nasc(new Date(sdf.parse("1983-08-12").getTime()));
		emp2.setSalario(4500.50);

		//setando o empregado 3
		emp3.setId(3);
		emp3.setNome("Rose");
		emp3.setDat_nasc(new Date(sdf.parse("1983-08-12").getTime()));
		emp3.setSalario(6500.50);

		//inserindo
		empDao.inserir(emp1);
		empDao.inserir(emp2);
		empDao.inserir(emp3);

		//exibe os dados após a inserção
		System.out.println("Inserção:\n"+empDao.selecionar());

		//alterando os salarios, tiveram um aumento 🙂
		emp1.setSalario(6000.70);
		emp2.setSalario(5000.50);
		emp3.setSalario(7000.70);

		//atualizando os dados
		empDao.atualizar(emp1);
		empDao.atualizar(emp2);
		empDao.atualizar(emp3);

		//exibe os dados após a atualização
		System.out.println("Alteração do sálario:\n"+empDao.selecionar());

		//coloca em um array de Empregado
		Empregado []emps={emp1,emp2,emp3};

		//for each irá exclui um a um empregado do array
		for(Empregado empIn:emps)
		empDao.excluir(empIn.getId());

		System.out.println("Exclusão, total de registros :"+empDao.selecionar().size());
	}
}

Código simples e bem comentado, procurei deixar de maneira que fique “auto-explicativo”.
Execute o programa com banco de dados levantado.
A saída será:
ScreenHunter_02 Jul. 05 20.35

Github:clique aqui
Download do projeto:clique aqui

Obrigado pela visita, até mais 😉