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.