DAO - Problemas com Banco de dados

5 respostas
alexasrc

Pessoal.

Estou estudando o pattern DAO, mas infelizmente esta acontecendo um problema que ainda não consegui identificar. :(

Eu criei um classe de teste (void main) para testar o comportamento da minha classe DAO.

import java.sql.SQLException;

import br.zj8t.bean.Aluno;
import br.zj8t.dao.AlunoDAO;
import br.zj8t.exception.DAOException;

public class DBConnectionTest{

	public static void main(String[] args) throws DAOException, SQLException{
	    Aluno aluno = new Aluno();
	    aluno.setId(1);
		aluno.setNome("Testando, testando ...");
		aluno.setIdade(111);
		aluno.setSexo("M");
		AlunoDAO dao = new AlunoDAO();
		try {
				dao.createAluno(aluno);
				System.out.println("Sucesso : Aluno criado !");
		}catch(DAOException e){
			System.err.print(e.getMessage());
		}
		
   	}
}

Criei a minha classe VO:

/**
 * @Class   ALuno
 * @Version 1.0
 * @Author  Alexandre Costa
 *
 * Implementação da Classe Bean Aluno
 * 
 **/
package br.zj8t.bean;

public class Aluno {
	
	private int     id;
	private String  nome;
	private int     idade;
	private String  sexo; 
	
	public Aluno(){
		
	}

	/**
	 * @return id
	 */
	public int getId() {
		return id;
	}

	/**
	 * @return Integer idade
	 */
	public int getIdade() {
		return idade;
	}

	/**
	 * @return String nome
	 */
	public String getNome() {
		return nome;
	}

	/**
	 * @return String sexo
	 */
	public String getSexo() {
		return sexo;
	}

	/**
	 * @param Integer id 
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * @param Integer idade
	 */
	public void setIdade(int idade) {
		this.idade = idade;
	}

	/**
	 * @param String nome
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}

	/**
	 * @param String sexo
	 */
	public void setSexo(String sexo) {
		this.sexo = sexo;
	}

}

Minha classe DAO:

/**
 * @Class   ALuno
 * @Version 1.0
 * @Author  Alexandre Costa
 *
 * Implementação da Classe DAO Aluno.
 * 
 **/
package br.zj8t.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import br.zj8t.bean.Aluno;
import br.zj8t.exception.DAOException;
import br.zj8t.patterns.singleton.DBConnection;


public class AlunoDAO{
	
	private final String SQL_CREATE_ALUNO = "INSERT INTO ALUNO (NOME,IDADE,SEXO) VALUES(?,?,?)";
	private final String SQL_UPDADE_ALUNO = "UPDATE  ALUNO SET NOME = ?, IDADE = ?,SEXO  = ? WHERE ID = ?";
	private final String SQL_SELECT_ALUNO = "SELECT ID NOME IDADE SEXO FROM ALUNO WHERE ID = ?";
	private final String SQL_LIST_ALUNO   = "SELECT ID NOME IDADE SEXO FROM ALUNO";
	
	private Connection connection  = null;
	private PreparedStatement stmt = null;
	
	public AlunoDAO(){
		
	}
	
	/**
	 * + createAluno() - Utilizado para inserir dados do aluno no banco de dados.
	 * 
	 * @param Aluno aluno
	 * @throws SQLException, DAOException
	 */
	public void createAluno(Aluno aluno) throws DAOException, SQLException{

		try {
			connection = DBConnection.getConnection();
			PreparedStatement stmt = connection.prepareStatement(SQL_CREATE_ALUNO);
	        stmt.setString(1,aluno.getNome());
	        stmt.setString(2,Integer.toString(aluno.getIdade()));
	        stmt.setString(3,aluno.getSexo());
	        int i = stmt.executeUpdate();
	        if (i <= 0){
	        	throw new DAOException("Erro : Não foi possível inserir o Aluno");
	        }
        } catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * + updateAluno() - Utilizado para atualiza dados do aluno no banco de dados.
	 * 
	 * @param Aluno aluno
	 * @throws DAOException
	 */	
	public void updateAluno(Aluno aluno) throws DAOException{
		// Verifica se o ID do aluno foi informado.
		if (aluno.getId() == 0 ){
			throw new DAOException("Error : ID do aluno deve ser informado.");
		}else{
			try {
				connection = DBConnection.getConnection();
				PreparedStatement stmt = connection.prepareStatement(SQL_UPDADE_ALUNO);
		        stmt.setString(1,aluno.getNome());
		        stmt.setString(2,Integer.toString(aluno.getIdade()));
		        stmt.setString(3,aluno.getSexo());
		        stmt.setString(4,Integer.toString(aluno.getId()));
		        int i = stmt.executeUpdate();
		        if (i <= 0){
		        	throw new DAOException("Erro : Não foi possível atualizar o Aluno");
		        }
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
}

Para conexão ao banco criei uma classe (seguindo o padrão Singleton).

/** * @Class DBconnection * @Version 1.0 * @Author Alexandre Costa * * Implementação do pattern Singleton para conexão a banco de dados * **/

package br.zj8t.patterns.singleton;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public final class DBConnection{

//Referência para instância única
private static Connection instance = null;

//Driver
private static String DRIVER_ODBC = "sun.jdbc.odbc.JdbcOdbcDriver";

//Banco
private static final String BANCO_ODBC = "jdbc:odbc:banco";

//Construtor privado
private DBConnection() throws ClassNotFoundException, SQLException{
try{
Class.forName(DRIVER_ODBC);
System.out.println("[Driver loaded]");

instance = DriverManager.getConnection(BANCO_ODBC);
System.out.println("[Connection done]");
System.out.println("[Connection obtained]");

}catch(ClassNotFoundException e){

System.err.println("[Class not found]");

}catch(SQLException e){

System.err.println("[Connection erro]");

}

}

//Fornece acesso a instância única
public static Connection getConnection() throws ClassNotFoundException, SQLException {

if(instance == null){
//Lazy instantation:só quando preciso
new DBConnection();
}

//Retorna a instância única da conexão
return instance;

}

//Encerra a conexão adequadamente
public static void shutdown() throws ClassNotFoundException, SQLException{

if (instance != null){

instance.close();
instance = null;
System.out.println("[Connection closed]");

}
}
}

Quando eu executo a classe de teste em debug , seguindo linha por linha., as inserções / alterações ocorrem com sucesso. Mas quando executo normalmente nada acontece. Ja tentei forçar uma commit na conexão, fechar o preparedStatement e nada aconteceu. Pode ser problema na modelagem das classes ? O banco de dados utilizado e um bd Ms. Acess.

Sds.

5 Respostas

_fs

Pera, você executa normalmente e não faz nada, então, sem alterar absolutamente nada você executa passo-a-passo e funciona?

alexasrc

Isso mesmo !. Eu executo a mesma classe de teste em debug, fuciona perfeitamente, quando eu executo “direto” , nada acontece.

F

No metodo que você insere o Aluno dentro do bloco try, tente fechar a conexão e vê se funciona.

Abs!

alexasrc

fred.frigieri:
No metodo que você insere o Aluno dentro do bloco try, tente fechar a conexão e vê se funciona.

Abs!

Fred.

Funcionou perfeitamente. Agora eu fiquei encucado, quando eu debugava sem fechar a conexão ele inseria as informações. Mas se eu tiver que manter a conexão aberta em tempo de sessão por exemplo. Existe outra forma de se fazer isso ? fechando o stmt não resolveria o problema ?

Sds.

alexasrc

Pessoal

Outro problema esta me acontecendo na minha classe DAO. Eu implementei o metodo de selecionar o aluno +selectAluno().

/**
 * @Class   ALuno
 * @Version 1.0
 * @Author  Alexandre Costa
 *
 * Implementação da Classe DAO Aluno.
 * 
 **/
package br.zj8t.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import br.zj8t.bean.Aluno;
import br.zj8t.exception.DAOException;
import br.zj8t.patterns.singleton.DBConnection;


public class AlunoDAO{
	
	private final String SQL_CREATE_ALUNO = "INSERT INTO ALUNO (NOME,IDADE,SEXO) VALUES(?,?,?)";
	private final String SQL_UPDADE_ALUNO = "UPDATE ALUNO SET NOME = ?, IDADE = ?,SEXO  = ? WHERE ID = ?";
	private final String SQL_DELETE_ALUNO = "DELETE FROM ALUNO WHERE ID = ?";
	private final String SQL_SELECT_ALUNO = "SELECT * FROM ALUNO WHERE ID = ?";
    private final String SQL_LIST_ALUNO   = "SELECT * FROM ALUNO";
	
	private Connection connection  = null;
	private PreparedStatement stmt = null;
	private ResultSet rs1 = null;
	
	public AlunoDAO(){
		
	}
	
	/**
	 * + createAluno() - Utilizado para inserir dados do aluno no banco de dados.
	 * 
	 * @param Aluno aluno
	 * @throws SQLException, DAOException
	 */
	public void createAluno(Aluno aluno) throws DAOException, SQLException{

		try {
			connection = DBConnection.getConnection();
			PreparedStatement stmt = connection.prepareStatement(SQL_CREATE_ALUNO);
	        stmt.setString(1,aluno.getNome());
	        stmt.setString(2,Integer.toString(aluno.getIdade()));
	        stmt.setString(3,aluno.getSexo());
	        int i = stmt.executeUpdate();
	        stmt.close();
	        connection.close();
	        if (i <= 0){
	        	throw new DAOException("Erro : Não foi possível inserir o Aluno");
	        }
        } catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * + updateAluno() - Utilizado para atualiza dados do aluno no banco de dados.
	 * 
	 * @param Aluno aluno
	 * @throws DAOException
	 */	
	public void updateAluno(Aluno aluno) throws DAOException{
		// Verifica se o ID do aluno foi informado.
		if (aluno.getId() == 0 ){
			throw new DAOException("Error : ID do aluno deve ser informado.");
		}else{
			try {
				connection = DBConnection.getConnection();
				PreparedStatement stmt = connection.prepareStatement(SQL_UPDADE_ALUNO);
		        stmt.setString(1,aluno.getNome());
		        stmt.setString(2,Integer.toString(aluno.getIdade()));
		        stmt.setString(3,aluno.getSexo());
		        stmt.setString(4,Integer.toString(aluno.getId()));
		        int i = stmt.executeUpdate();
		        stmt.close();
		        connection.close();
		        
		        if (i <= 0){
		        	throw new DAOException("Erro : Não foi possível atualizar o Aluno");
		        }
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * + deleteAluno() - Utilizado para eliminar dados do aluno no banco de dados.
	 * 
	 * @param Aluno aluno
	 * @throws DAOException
	 */	
	public void deleteAluno(Aluno aluno) throws DAOException{
//		Verifica se o ID do aluno foi informado.
		if (aluno.getId() == 0 ){
			throw new DAOException("Error : ID do aluno deve ser informado.");
		}else{
			try {
				connection = DBConnection.getConnection();
				PreparedStatement stmt = connection.prepareStatement(SQL_DELETE_ALUNO);
		        stmt.setString(1,Integer.toString(aluno.getId()));
		        int i = stmt.executeUpdate();
		        stmt.close();
		        connection.close();
		        
		        if (i <= 0){
		        	throw new DAOException("Erro : Não foi possível eliminar o Aluno");
		        }
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * + selectAluno() - Utilizado para retornar dados do aluno no banco de dados.
	 * 
	 * @param Aluno aluno
	 * @return Aluno aluno
	 * @throws DAOException
	 */		
	public Aluno selectAluno(Aluno aluno) throws DAOException{
		
//		Verifica se o ID do aluno foi informado.
		if (aluno.getId() == 0 ){
			throw new DAOException("Error : ID do aluno deve ser informado.");
		}else{
			try {
				connection = DBConnection.getConnection();
				PreparedStatement stmt = connection.prepareStatement(SQL_LIST_ALUNO);
		        //stmt.setString(1,Integer.toString(aluno.getId()));
		        ResultSet rs = stmt.executeQuery();
		        
		        Aluno aluno1 = new Aluno();
		        while (rs.next()){		        
		        	aluno1.setId(rs.getInt("ID"));
		        	aluno1.setNome(rs.getString("NOME"));
		        	aluno1.setIdade(rs.getInt("IDADE"));
		        	aluno1.setSexo(rs.getString("SEXO"));
		        }
		        return aluno1;
		        
		        
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				throw new DAOException("Erro : Nenhum aluno foi selecionado.");
			}
		}
		return aluno;
				
	}
}

Eu estou utilizando um objeto preparedStatement para executar a query SELECT e passando o id do aluno como parâmetro, quando executo o meu ResultSet não retorna nenhum registro. Quando eu faço um SELECT sem a clausula WHERE, ele popula a minha resultset sem problemas. Segue abaixo a minha classe de teste.

import java.sql.SQLException;

import br.zj8t.bean.Aluno;
import br.zj8t.dao.AlunoDAO;
import br.zj8t.exception.DAOException;

public class DBConnectionTest{

	public static void main(String[] args) throws DAOException, SQLException{
	    Aluno aluno = new Aluno();
	    aluno.setId(1);
		aluno.setNome("Testando, teste ...");
		aluno.setIdade(111);
		aluno.setSexo("M");
		AlunoDAO dao = new AlunoDAO();
		
		try {
				//dao.deleteAluno(aluno);
			    Aluno aluno1 = dao.selectAluno(aluno);
				System.out.println("Sucesso : Aluno criado !");
				
		}catch(DAOException e){
			System.err.print(e.getMessage());
		}
		
   	}
}

Alguem ja passou por esse problema ?

Sds.

Criado 23 de fevereiro de 2005
Ultima resposta 24 de fev. de 2005
Respostas 5
Participantes 3