Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação Orientada a Objetos. 1 Prof.Fábio Rener Banco de Dados com JDBC. JDBC (Java DataBase Connectivity). Existem diversas maneiras de uma aplicação Java acessar uma base de dados (local ou remota), porém a maneira mais comum é através do padrão JDBC. O JDBC está para o Java assim como o ODBC está para outras linguagens. Tanto o JDBC como o ODBC são interfaces de programação através das quais é possível acessar bancos de dados relacionais. Existem drivers JDBC para bancos de dados como Oracle, Microsoft SQL Server,Sybase, MySql, entre outros. A JDBC é composta por classes agrupadas no pacote java.sql. Através dessas classes, é possível estabelecer uma conexão com um banco de dados, enviar comandos SQL, disparar stored procedures, processar resultados e controlar transações. Estabelecendo Conexão. Para estabelecer conexão com uma base de dados precisamos realizar duas etapas: 1. Carregar o driver a ser utilizado. Antes de qualquer coisa devemos adicionar em nosso classpath o arquivo jar que contém o driver. Programação Orientada a Objetos. 2 Prof.Fábio Rener Para carregar o driver devemos utilizar o método forName da classe Class conforme o exemplo a seguir: Class.forName("org.gjt.mm.mysql.Driver"); No nosso exemplo iremos utilizar uma conexão ODBC para nos ajudar a conectar no banco de dados Access, dessa forma devemos carregar o driver “sun.jdbc.odbc.JdbcOdbcDriver”. O driver ODBC já vem no pacote do java não sendo necessario importar nenhum outro arquivo. Iremos criar uma conexão ODBC para o banco de dados Access, seguir a orientação do professor para essa tarefa, na criação iremos dar um nome para a conexão ODBC, vamos usar o nome ANHANGUERA. 2. Criando a Conexão. String STR_CON = "jdbc:mysql://localhost:3306/nomebancodedados"; Connection conn = DriverManager.getConnection(STR_CON, USER, PASSWORD); Devemos consultar a documentação do driver para verificar como deve ser a string de conexão (url) para o banco de dados. Aqui em nosso exemplo como estamos trabalhando com ODBC iremos utilizar a seguinte url “jdbc:odbc:ANHANGUERA” e não é necessario passar usuário e senha para conexão. Exemplo: package br.anhanguera.poo.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class BaseDAO { private static final String STR_DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver"; private static final String STR_CON = "jdbc:odbc:ANHANGUERA"; public static Connection getConexao() throws DAOException{ Connection conn = null; try { // 1) Faca o carregamento do driver Class.forName(STR_DRIVER); // 2) Obter conexao conn = DriverManager.getConnection(STR_CON); return conn; } catch (ClassNotFoundException e) { String errorMsg = "Driver não encontrado"; throw new DAOException(errorMsg, e); } catch (SQLException e) { String errorMsg = "Erro ao obter a conexão"; Programação Orientada a Objetos. 3 Prof.Fábio Rener throw new DAOException(errorMsg, e); } } public static void closeAll(Connection conn,PreparedStatement stmt,ResultSet rs) { try { if (conn != null) { conn.close(); } if(stmt != null){ stmt.close(); } if(rs != null){ rs.close(); } } catch (Exception e) { String errorMsg = "Não foi possível fechar a conexão com o banco"; DAOException.print(e, errorMsg); } } public static void main(String args[]) { Connection conn = null; try { conn = BaseDAO.getConexao(); } catch (DAOException ge) { ge.print(); } finally { closeAll(conn,null,null); } } } Consultando e atualizando a base de dados. Para enviar cláusulas SQL para a base de dados devemos utilizar a classe PreparedStatement ou Statement do pacote java.sql. Para realizar consultas (SELECT) utilizamos o método executeQuery. Para atualizar a base ou alterar tabelas utilizamos o método executeUpdate. Ambos os métodos estão presentes nas classes PreparedStatement e Statement. Exemplo: private final static String GET_ALL_ALUNOS = "select * from tb_aluno"; public List<Aluno> getAllAlunos() throws DAOException { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; List<Aluno> alunos = new ArrayList<Aluno>(); try { conn = getConexao(); stmt = conn.prepareStatement(GET_ALL_ALUNOS); rs = stmt.executeQuery(); while (rs.next()) { Aluno aluno = new Aluno(rs.getInt("id_aluno"), rs.getString("str_nome"), rs.getString("str_endereco"),rs.getString("str_telefone"),rs.getString(" str_rg")); Programação Orientada a Objetos. 4 Prof.Fábio Rener alunos.add(aluno); } }catch(SQLException e){ String errorMsg = "Não foi possível executar a pesquisa no banco de Dados!"; throw new DAOException (errorMsg, e); }finally{ closeAll(conn, stmt, rs); } return alunos; } Utilizando ResultSet(Tratando Resultado). O objeto ResultSet do exemplo anterior contém os registros retornados pelo SELECT executado na base de dados. O exemplo mostra a forma de utilização do ResultSet: try { conn = getConexao(); stmt = conn.prepareStatement(GET_ALL_ALUNOS); rs = stmt.executeQuery(); while (rs.next()) { Aluno aluno = new Aluno(rs.getInt("id_aluno"), rs.getString("str_nome"), rs.getString("str_endereco"),rs.getString("str_telefone"),rs.getString(" str_rg")); alunos.add(aluno); } }catch(SQLException e){ String errorMsg = "Não foi possível executar a pesquisa no banco de Dados!"; throw new DAOException (errorMsg, e); }finally{ closeAll(conn, stmt, rs); } Podemos acessar os campos pelo nome do mesmo como no exemplo anterior, ou pelo seu índice, como mostrado a seguir: try { conn = getConexao(); stmt = conn.prepareStatement(GET_ALL_ALUNOS); rs = stmt.executeQuery(); while (rs.next()) { Aluno aluno = new Aluno(rs.getInt(1), rs.getString(2), rs.getString(3),rs.getString(4),rs.getString(5)); alunos.add(aluno); } }catch(SQLException e){ String errorMsg = "Não foi possível executar a pesquisa no banco de Dados!"; throw new DAOException (errorMsg, e); }finally{ Programação Orientada a Objetos. 5 Prof.Fábio Rener closeAll(conn, stmt, rs); } Liberação de Recursos. Após a execução dos comandos SQL em nossa aplicação devemos ter o cuidado de liberar todos os recursos que temos ligados a conexão efetuada, ou seja, devemos finalizar os objetos(Connection, PreparedStatement, Statement e ResultSet), geralmente fazemos isso usando a cláusula finally. Exemplo: public List<Aluno> getAllAlunos() throws DAOException { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; List<Aluno> alunos = new ArrayList<Aluno>(); try { conn = getConexao(); stmt = conn.prepareStatement(GET_ALL_ALUNOS); rs = stmt.executeQuery(); while (rs.next()) { Aluno aluno = new Aluno(rs.getInt("id_aluno"), rs.getString("str_nome"),rs.getString("str_endereco"),rs.getString("str_telefone"),rs.getString(" str_rg")); alunos.add(aluno); } }catch(SQLException e){ String errorMsg = "Não foi possível executar a pesquisa no banco de Dados!"; throw new DAOException (errorMsg, e); }finally{ closeAll(conn, stmt, rs); } return alunos; } Em nossa classe BaseDAO, temos o método closeAll que é responsável por encerrar a utilização dos recursos ligados a uma conexão. public static void closeAll(Connection conn,PreparedStatement stmt,ResultSet rs) { try { if (conn != null) { conn.close(); } if(stmt != null){ stmt.close(); } if(rs != null){ rs.close(); } } catch (Exception e) { String errorMsg = "Não foi possível fechar a conexão com o banco"; Programação Orientada a Objetos. 6 Prof.Fábio Rener DAOException.print(e, errorMsg); } } Vamos analisar um pequeno projeto: Explicação dos pacotes. br.anhanguera.poo.dao – Pacote com classes que implementam o pattern DAO, dentro dele temos a classe BaseDAO que será herdada por todas as classes, esse SuperClasse contém os métodos para criação e finalização de recursos ligados ao banco de dados. package br.anhanguera.poo.dao; public class DAOException extends Exception { private static final long serialVersionUID = -471445208566549759L; public DAOException(String mensagem, Exception e) { super(mensagem, e); } public DAOException(String mensagem) { super(mensagem); } public static void print(Exception e, String mensagem) { System.out.println("==============Exception==============="); System.out.println(mensagem); System.out.println("PrintStackTrace: "); e.printStackTrace(); System.out.println("============End Exception============="); } public void print() { System.out.println("==============Exception==============="); System.out.println(getMessage()); System.out.println("PrintStackTrace: "); getCause().printStackTrace(); System.out.println("============End Exception============="); } } Programação Orientada a Objetos. 7 Prof.Fábio Rener package br.anhanguera.poo.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class BaseDAO { private static final String STR_DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver"; private static final String STR_CON = "jdbc:odbc:ANHANGUERA"; public static Connection getConexao() throws DAOException{ Connection conn = null; try { // 1) Faca o carregamento do driver Class.forName(STR_DRIVER); // 2) Obter conexao conn = DriverManager.getConnection(STR_CON); return conn; } catch (ClassNotFoundException e) { String errorMsg = "Driver nao encontrado"; throw new DAOException(errorMsg, e); } catch (SQLException e) { String errorMsg = "Erro ao obter a conexao"; throw new DAOException(errorMsg, e); } } public static void closeAll(Connection conn,PreparedStatement stmt,ResultSet rs) { try { if (conn != null) { conn.close(); } if(stmt != null){ stmt.close(); } if(rs != null){ rs.close(); } } catch (Exception e) { String errorMsg = "Não foi possível fechar a conexão com o banco"; DAOException.print(e, errorMsg); } } public static void main(String args[]) { Connection conn = null; try { conn = BaseDAO.getConexao(); } catch (DAOException ge) { ge.print(); } finally { closeAll(conn,null,null); } } } Programação Orientada a Objetos. 8 Prof.Fábio Rener package br.anhanguera.poo.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import br.anhanguera.poo.to.Aluno; public class AlunoDAO extends BaseDAO{ // constante com o comando de insert na tabela de alunos private final static String INSERIR_ALUNO = "insert into tb_aluno (str_nome,str_endereco,str_telefone,str_rg) values (?,?,?,?)"; // constante com o comando de update na tabela de alunos private final static String ATUALIZAR_ALUNO = "update tb_aluno set str_nome=?, str_endereco= ?, str_telefone=?, str_rg=? WHERE id_aluno = ?"; // constante com o comando de select sem parametros private final static String GET_ALL_ALUNOS = "select * from tb_aluno"; //variavel instance sera utilizada para implementacao do pattern singleton private static AlunoDAO instance = null; //construtor privado para implementacao do pattern singleton, private AlunoDAO() {} //metodo que retorna a instancia da classe public static synchronized AlunoDAO getInstance() { if(instance == null){ instance = new AlunoDAO(); } return instance; } public void incluir(Aluno aluno) throws DAOException { // Criar uma variavel para a Conexao Connection conn = null; // Criar uma variavel para a PreparedStatement PreparedStatement stmt = null; try { // Obtem uma conexao com o banco de dados conn = getConexao(); // Cria um preparedStatement para o BD conseguir pre-compilar um SQL previamente stmt = conn.prepareStatement(INSERIR_ALUNO); // Atribui uma String para a 1a. interrogacao (nome) stmt.setString(1, aluno.getStrNome()); // Atribui uma String para a 2a. interrogacao (endereco) stmt.setString(2, aluno.getStrEndereco()); // Atribui uma String para a 3a. interrogacao (telefone) stmt.setString(3, aluno.getStrTelefone()); // Atribui uma String para a 3a. interrogacao (rg) // Esse coluna aceita valores nulos devemos dessa forma fazer o tratamento Programação Orientada a Objetos. 9 Prof.Fábio Rener if(aluno.getStrRg()!= null && !aluno.getStrRg().trim().equals("")){ stmt.setString(4, aluno.getStrRg()); }else{ stmt.setNull(4, java.sql.Types.VARCHAR); } // Executa o comando junto com os parametros configurados stmt.executeUpdate(); }catch (SQLException e) { String errorMsg = "Não foi possível incluir o aluno no banco de dados,\nverifique sua operação!"; //e.printStackTrace(); throw new DAOException (errorMsg, e); } finally { // Finalizar o statement e a conexao closeAll(conn, stmt,null); } } public void alterar(Aluno aluno) throws DAOException { // Criar uma variavel para a Conexao Connection conn = null; // Criar uma variavel para a PreparedStatementPreparedStatement stmt = null; try { // Obtem uma conexao com o banco de dados conn = getConexao(); // Cria um preparedStatement para o BD conseguir pre-compilar um SQL previamente stmt = conn.prepareStatement(ATUALIZAR_ALUNO); // Atribui uma String para a 1a. interrogacao (nome) stmt.setString(1, aluno.getStrNome()); // Atribui uma String para a 2a. interrogacao (endereco) stmt.setString(2, aluno.getStrEndereco()); // Atribui uma String para a 3a. interrogacao (telefone) stmt.setString(3, aluno.getStrTelefone()); // Atribui uma String para a 4a. interrogacao (rg) // Esse coluna aceita valores nulos devemos dessa forma fazer o tratamento if(aluno.getStrRg()!= null && !aluno.getStrRg().trim().equals("")){ stmt.setString(4, aluno.getStrRg()); }else{ stmt.setNull(4, java.sql.Types.VARCHAR); } // Atribui int para a 5a. interrogacao (id_aluno) stmt.setInt(5, aluno.getIdAluno()); // Executa o comando junto com os parametros configurados stmt.executeUpdate(); } catch (SQLException e) { String errorMsg = "Não foi possível alterar o aluno no banco de dados,\nverifique sua operação!"; //e.printStackTrace(); throw new DAOException (errorMsg, e); Programação Orientada a Objetos. 10 Prof.Fábio Rener } finally { // Finalizar o statement e a conexao closeAll(conn, stmt,null); } } public List<Aluno> getAllAlunos() throws DAOException { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; List<Aluno> alunos = new ArrayList<Aluno>(); try { conn = getConexao(); stmt = conn.prepareStatement(GET_ALL_ALUNOS); rs = stmt.executeQuery(); while (rs.next()) { Aluno aluno = new Aluno(rs.getInt("id_aluno"), rs.getString("str_nome")rs.getString("str_endereco"),rs.getString ("str_telefone"),rs.getString("str_rg")); alunos.add(aluno); } } catch (SQLException e) { String errorMsg = "Não foi possível executar a pesquisa no banco de Dados!"; throw new DAOException (errorMsg, e); } finally { closeAll(conn, stmt, rs); } return alunos; } } br.anhanguera.poo.to – Pacote com classes que implementam o pattern TO. package br.anhanguera.poo.to; import java.io.Serializable; public class Aluno implements Serializable { private static final long serialVersionUID = 7451493081496319340L; private int idAluno; private String strNome; private String strEndereco; private String strTelefone; private String strRg; public Aluno(){} public Aluno(int idAluno, String strNome, String strEndereco, String strTelefone, String strRg) { this.idAluno = idAluno; this.strNome = strNome; this.strEndereco = strEndereco; this.strTelefone = strTelefone; Programação Orientada a Objetos. 11 Prof.Fábio Rener this.strRg = strRg; } public Aluno(String strNome, String strEndereco, String strTelefone, String strRg) { this.strNome = strNome; this.strEndereco = strEndereco; this.strTelefone = strTelefone; this.strRg = strRg; } public int getIdAluno() { return idAluno; } public void setIdAluno(int idAluno) { this.idAluno = idAluno; } public String getStrNome() { return strNome; } public void setStrNome(String strNome) { this.strNome = strNome; } public String getStrEndereco() { return strEndereco; } public void setStrEndereco(String strEndereco) { this.strEndereco = strEndereco; } public String getStrTelefone() { return strTelefone; } public void setStrTelefone(String strTelefone) { this.strTelefone = strTelefone; } public String getStrRg() { return strRg; } public void setStrRg(String strRg) { this.strRg = strRg; } @Override public String toString() { return "Aluno [idAluno=" + idAluno + ", strNome=" + strNome + ", strEndereco=" + strEndereco + ", strTelefone=" + strTelefone + ", strRg=" + strRg + "]"; } }
Compartilhar