galera.. to com um problema..
tenho as seguites classes
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packageBanco;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.util.logging.Level;importjava.util.logging.Logger;importjavax.swing.JOptionPane;/** * * @author R.Campos */publicclassConexao{privateStringdriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";privateStringstrc="jdbc:sqlserver://localhost\SQLExpress:1433;databaseName=sisLoja";privateStringuser="tete";privateStringpass="tete";privateConnectioncon=null;publicConexao(){try{Class.forName(driver);con=DriverManager.getConnection(strc,user,pass);}catch(Exceptione){JOptionPane.showMessageDialog(null,e.getMessage());}}publicvoidcloseConexao(){try{if(con!=null){con=null;}con.close();}catch(SQLExceptionex){Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE,null,ex);}}publicConnectionopenConexao(){returncon;}}
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packageBanco;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;/** * * @author R.Campos */publicclassOperacoes{privatestaticStringerro="";publicstaticResultSetconsulta(Stringsql,Conexaocon){ResultSetrs=null;try{Statementstatement=con.openConexao().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);rs=statement.executeQuery(sql);returnrs;}catch(SQLExceptionsqlex){returnnull;}}}
na hora de usar faço o seguinte
ResultSet rsCat = Operacoes.consulta("SELECT * FROM categorias ORDER BY cat_nome", con);
sendo que eu crio uma instancia
conexao = new Conexao();
na primeira tela e passo por parametro para as outras (isso funciona.. pq funciona os insert, delete, update e etc)
só que nas consultas meus STATEMENT estão ficando aberto.. nao da pra fecha pq senao perde o rs :S
alguem sabe uma melhor maneira de fazer isso?! (seguindo essa lógica)
‘seguindo essa lógica’ eu não saberei te ajudar, pois quando estava iniciando meus estudos com conexao ao BD já tentei fazer dessa forma e vi que não era o melhor caminho e pensei em outra forma de resolver…
Abraço!
juliofsn
Ao invés de retornar um ResutSet, preencha um Set ou List de Map’s.
Ou melhor ainda, crie uma classe que represente os dados que você quer retornar, intancie ela e preencha seus atributos, retornando um List ou Set de instâncias dessa classe para vários registros.
r.campos
renanedpedroso:
alguem sabe uma melhor maneira de fazer isso?! (seguindo essa lógica)
‘seguindo essa lógica’ eu não saberei te ajudar, pois quando estava iniciando meus estudos com conexao ao BD já tentei fazer dessa forma e vi que não era o melhor caminho e pensei em outra forma de resolver…
Abraço!
qual a melhor forma me aconselha?
[]´s
r.campos
juliofsn:
Ao invés de retornar um ResutSet, preencha um Set ou List de Map’s.
Ou melhor ainda, crie uma classe que represente os dados que você quer retornar, intancie ela e preencha seus atributos, retornando um List ou Set de instâncias dessa classe para vários registros.
essa seria uma das possiveis melhores soluções?
vejo que seria um tanto quanto trabalhosa em uma aplicação de médio porte!
fazer resultset joga num list depois percorrer list e etc…
renanedpedroso
Trabalhe utilizando o padrão DAO.
Utilizando o padrão dão, você não tem problemas desse tipo.
Sem falar que você pode gerenciar melhor suas transações com o banco.
renanedpedroso
Só uma pergunta…
Por que você gostaria de ‘utilizar o mesmo Statement’ (digamos assim) na sua aplicação?
Quem sabe assim, posso te ajudar melhor…
Abraço!
r.campos
renanedpedroso:
Trabalhe utilizando o padrão DAO.
Utilizando o padrão dão, você não tem problemas desse tipo.
Sem falar que você pode gerenciar melhor suas transações com o banco.
tem algum tuto sobre esse padrão DAO que vc possa indicar?
qto a questão do STATEMENT… nao é que eu queira sempre utilizar o mesmo, mais queria evitar de fica declarando vários STATEMENT pq algums vezes uso um RS pra alimenta outro!
renanedpedroso
Na verdade, do jeito que eu faço, você cria vários Statements (por isso perguntei), mas mesmo assim seu código ficará muito mais organizado, na minha opinião…
E depois todas as suas classes que realizarão operações de CRUD (classes DAO), poderão herdar dessa classe que te passei.
Ou seja, você não estará ‘declarando manualmente seu Statement’, pois o statement será herdado.
renanedpedroso
Pode ser que exista outra maneira de fazer, mas essa eu acho mais clara, simples e objetiva.
Não sei se ‘reutilizar’ o Statement é uma boa prática, pode ser que futuramente se torne difícil de se dar manutenção…
Enfim, espero ter contribuído.
Abraço!
r.campos
renanedpedroso:
Na verdade, do jeito que eu faço, você cria vários Statements (por isso perguntei), mas mesmo assim seu código ficará muito mais organizado, na minha opinião…
publicclassPessoaDAOextendsClasseDAO{@Overrideprotectedvoidinserir(Objectobject)throwsBDError{try{Stringsql="INSERT INTO CADPESSOA (IDPESSOA, PESSOA) VALUES (?,?)";Pessoabean=(Pessoa)object;this.statement=conexao.prepareStatement("SELECT SEQUENCIA_CADPESSOA.NEXTVAL FROM DUAL");ResultSetrs=ps.executeQuery();while(rs.next()){bean.setId(rs.getInt(1));}rs.close();ps.close();rs=null;ps=null;ps=conexao.prepareStatement(sql);ps.setInt(1,bean.getId());ps.setString(2,bean.getNome());ps.executeUpdate();ps.close();ps=null;bean.setInclusao(false);}catch(SQLExceptionex){thrownewBDError(PessoaDAO.class.getName()+" - inserir: "+ex.getMessage());}}@Overrideprotectedvoidalterar(Objectobject)throwsBDError{try{Stringsql="UPDATE CADPESSOA SET PESSOA = ? WHERE IDPESSOA = ?";Pessoabean=(Pessoa)object;this.statement=conexao.prepareStatement(sql);ps.setString(1,bean.getNome());ps.setInt(2,bean.getId());intquantidade=ps.executeUpdate();ps.close();ps=null;if(quantidade==0){thrownewBDError(PessoaDAO.class.getName()+" - alterar: "+"Ao alterar nenhum registro foi afetado.");}}catch(SQLExceptionex){thrownewBDError(PessoaDAO.class.getName()+" - alterar: "+ex.getMessage());}}@Overridepublicvoidexcluir(Objectobject)throwsBDError{try{Stringsql="DELETE FROM CADPESSOA WHERE IDPESSOA = ?";Pessoabean=(Pessoa)object;this.statement=conexao.prepareStatement(sql);ps.setInt(1,bean.getId());intquantidade=ps.executeUpdate();ps.close();ps=null;if(quantidade==0){thrownewBDError(PessoaDAO.class.getName()+" - excluir: "+"Ao excluir nenhum registro foi afetado.");}}catch(SQLExceptionex){thrownewBDError(PessoaDAO.class.getName()+" - excluir: "+ex.getMessage());}}
Perceba que a classe ‘PessoaDAO’ herda características da classe ‘ClasseDAO’.
(Não testei o código, mas é bem por aí)…
Espero ter ajudado.
Abraço!
r.campos
cara
valeu… ajudo pra caramba!
entendi o funcionamento… seus post foram de grande valia!
abraço
renanedpedroso
Que bom que ajudou!
Muito obrigado, estamos aí pra isso!
Se o seu problema estiver solucionado mude o título do Post adicionando ‘[RESOLVIDO]’.
Abraço!
r.campos
entendi como usa o DAO… mais ainda fico a dúvida do RS e STMT!
como fazer o retorno em uma consulta?! :S
renanedpedroso
Você faz um método get que retorna um ou outro.
Porém utilizando essa estrutura que mostrei, não vejo a lógica de retornar o statement ou o resultset.
r.campos
no caso dessa estrutura DAO… o ideal seria retorna um List<?> ?!
renanedpedroso
Ah… sim…
Para consultar dados, você utilizaria List como retorno.
Ou então o próprio objeto Pessoa, no caso de busca por chave primária.
r.campos
ok..
valeu..
creio que agora está td resolvido! okakoakoakoakoakoakooka