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 😉

Criando classe de conexão Java – Parte 1.

Olá.

Neste post iremos criar uma classe de conexão java.
Esta classe fará leitura de um arquivo de propriedades, nele conterá todo parâmetro para conexão.

Desta maneira não teremos acomplamento a um tipo de banco de dados, ou seja ,
não será necessário escrever na própria classe “hard code” a conexão com o banco de dados.

Obs:Se quiser seguir o tutorial a risca faça os downloads, senão ignore os passos seguintes e use o banco de dados que melhor servir, juntamente com seu driver JDBC.Depois é só editar o arquivo de propriedades que iremos criar.
1°)Faça os seguintes downloads, caso não possua estes arquivos:
Oracle Express 11g
ojdbc14.jar
Obs:o arquivo ojdbc14.jar ou qualquer outro driver jdbc,deve ser colocado na raiz do projeto, que iremos criar.
Clique em aceitar, para liberar o download e siga os procedimentos…
ScreenHunter_01 May. 26 00.15
2°)Após baixar os arquivos instale o Oracle Express 11g, que será nosso banco de dados, para este exemplo.
Siga os assistente de instalação, quando pedir uma senha digite “Tiger”, essa senha será do usuário SYSTEM que é o usuário padrão do Oracle.
Em caso de dúvida, segue um link com um video tutorial:
Instalação Oracle 11g

Abra o eclipse crie um novo projeto “Java Project“, aperte a combinação [CTRL+N], em “Project name” coloque ConexaoJDBC.

Novo projeto

Selecione o projeto, clique com botão direito do mouse e siga p/ Buid Path > Configure Build Path.
Como na imagem abaixo…
build path
Clique em [Add External Jars], e adicione o arquivo ojdbc14.jar ou o driver JDBC de sua preferência, após isso clique em [OK].

Após este passo, criaremos a classe de conexão Java, aperte a combinação [CTRL+N], o arquivo é do tipo Class.
Nome da classe “Name” será “AcessoBD” e no pacote “package” coloque “br.controle”.

ScreenHunter_01 Jun. 09 20.30

Agora que foi criado a classe e o pacote, teremos que criar os métodos da classe, conectar e desconectar.
Digite conforme o código abaixo ou copie e cole.


package br.controle;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
/**
*
* @author Roberto Silva
*/
public class AcessoBD{

    public static Connection conectar() throws Exception {
        Connection connection = null;
        String driver = "";
        String usuario = "";
        String senha = "";
        String url = "";
        String banco = "";

        //so renomear se precisar do outro properties
        File prop_file = new File(new File("").getAbsolutePath() + "/jdbc.properties");

        if (!prop_file.isFile()) {
            throw new Exception("Não achou a arquivo de propriedade, caminho:" + prop_file.getAbsolutePath() + " , errado.");
        }

        Properties properties = new Properties();
        //Setamos o arquivo que será lido
        FileInputStream fis = new FileInputStream(prop_file.getAbsolutePath());

        //método load faz a leitura através do objeto fis
        properties.load(fis);

        //Captura o valor da propriedade, através do nome da propriedade(Key)
        usuario = properties.getProperty("jdbc.user");
        senha = properties.getProperty("jdbc.pass");
        driver = properties.getProperty("jdbc.driver");
        url = properties.getProperty("jdbc.url");
        banco = properties.getProperty("jdbc.dataBase");

        Class.forName(driver);

        connection = DriverManager.getConnection(url + banco, usuario, senha);

        return connection;
    }

    //sobrecarga dos metodo desconectar,
    //na sobrecarga muda somente a assinatura dos metodos ou seja os parâmetros
    public static void desconectar(Connection conn) {
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (Exception e) {
            System.out.println("Exceção, causa:" + e.getClass());
            e.printStackTrace();
        }
    }

    public static void desconectar(Connection conn, PreparedStatement pstm) {
        try {
            if (pstm != null) {
                pstm.close();
            }

            if (conn != null) {
                conn.close();
            }

        } catch (Exception e) {
            System.out.println("Exceção, causa:" + e.getClass());
            e.printStackTrace();
        }
    }

    public static void desconectar(Connection conn, PreparedStatement pstm, ResultSet rs) {
        try {

            if (rs != null) {
                rs.close();
            }

            if (pstm != null) {
                pstm.close();
            }

            if (conn != null) {
                conn.close();
            }

        } catch (Exception e) {
            System.out.println("Exceção, causa:" + e.getClass());
            e.printStackTrace();

        }
    }
}

Como podemos observar o método conectar(), retornará um objeto do tipo java.sql.Connection,este objeto é da API JDBC, para uso do SQL.Também que fará leitura de um arquivo de propriedades,conforme este trecho:

 FileInputStream fis = new FileInputStream(prop_file.getAbsolutePath());

Vamos criá-lo neste momento, aperte a combinação [CTRL+N] para criar um novo arquivo, na árvore General, siga para o tipo File aperte [Next]. O nome do arquivo será “jdbc.properties”.

general_file
Digite o conteúdo abaixo.

#parametros de conexao com banco.
jdbc.dataBase=XE
jdbc.url=jdbc:oracle:thin:@localhost:1521:
jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.user=SYSTEM
jdbc.pass=Tiger

No próximo post iremos criar uma tabela no Oracle e testar a persistência com o banco de dados.

Obrigado pela visita.Até o próximo post.