galera… to com um problema…
tenho as seguites classes
[code]/*
- To change this template, choose Tools | Templates
- and open the template in the editor.
*/
package Banco;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
/**
*
-
@author R.Campos
*/
public class Conexao {
private String driver = “com.microsoft.sqlserver.jdbc.SQLServerDriver”;
private String strc = “jdbc:sqlserver://localhost\SQLExpress:1433;databaseName=sisLoja”;
private String user = “tete”;
private String pass = “tete”;
private Connection con = null;
public Conexao() {
try {
Class.forName(driver);
con = DriverManager.getConnection(strc, user, pass);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
}
public void closeConexao() {
try {
if (con != null) {
con = null;
}
con.close();
} catch (SQLException ex) {
Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
}
}
public Connection openConexao() {
return con;
}
}[/code]
[code]
/*
- To change this template, choose Tools | Templates
- and open the template in the editor.
*/
package Banco;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
*
-
@author R.Campos
*/
public class Operacoes {
private static String erro = “”;
public static ResultSet consulta(String sql, Conexao con) {
ResultSet rs = null;
try {
Statement statement = con.openConexao().createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs = statement.executeQuery(sql);
return rs;
} catch (SQLException sqlex) {
return null;
}
}
}[/code]
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)
valeu
‘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!
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.
[quote=renanedpedroso][quote]
alguem sabe uma melhor maneira de fazer isso?! (seguindo essa lógica)
[/quote]
‘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!
[/quote]
qual a melhor forma me aconselha?
[]´s
[quote=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.[/quote]
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…
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.
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!
[quote=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.[/quote]
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!
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…
Faz o seguinte…
Crie uma classe abstrata da seguinte maneira:
public abstract class ClasseDAO {
public PreparedStatement statement;
public Conexao conexao;
public abstract inserir(Object object);
public abstract excluir(Object object);
public abstract alterar(Object object);
}
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.
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!
[quote=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…
Faz o seguinte…
Crie uma classe abstrata da seguinte maneira:
public abstract class ClasseDAO {
public PreparedStatement statement;
public Conexao conexao;
public abstract inserir(Object object);
public abstract excluir(Object object);
public abstract alterar(Object object);
}
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.[/quote]
entendi a idéia… mais nao entendi a prática!
teria como posta um exemplo só pra mim ver o funcionando!?
ficaria grato!
att.
pq na minha opnião… se eu fizer um Consult na classe DAO e retorna o RS… ainda assim vai perde o RS se fecha o statement!
Vamos supor que você vá trabalhar com uma classe Pessoa…
Então você cria essa classe…
public class Pessoa {
private int id;
private String nome = "";
public String getNome() {
return nome;
}
public void setNome(String nome) throws ValorInvalidoException {
this.nome = nome;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
Em seguida a classe DAO para essa classe será:
public class PessoaDAO extends ClasseDAO {
@Override
protected void inserir(Object object) throws BDError {
try {
String sql = "INSERT INTO CADPESSOA (IDPESSOA, PESSOA) VALUES (?,?)";
Pessoa bean = (Pessoa) object;
this.statement = conexao.prepareStatement("SELECT SEQUENCIA_CADPESSOA.NEXTVAL FROM DUAL");
ResultSet rs = 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 (SQLException ex) {
throw new BDError(PessoaDAO.class.getName() + " - inserir: " + ex.getMessage());
}
}
@Override
protected void alterar(Objectobject) throws BDError {
try {
String sql = "UPDATE CADPESSOA SET PESSOA = ? WHERE IDPESSOA = ?";
Pessoa bean = (Pessoa) object;
this.statement = conexao.prepareStatement(sql);
ps.setString(1, bean.getNome());
ps.setInt(2, bean.getId());
int quantidade = ps.executeUpdate();
ps.close();
ps = null;
if (quantidade == 0) {
throw new BDError(PessoaDAO.class.getName() + " - alterar: " + "Ao alterar nenhum registro foi afetado.");
}
} catch (SQLException ex) {
throw new BDError(PessoaDAO.class.getName() + " - alterar: " + ex.getMessage());
}
}
@Override
public void excluir(Objectobject) throws BDError {
try {
String sql = "DELETE FROM CADPESSOA WHERE IDPESSOA = ?";
Pessoa bean = (Pessoa) object;
this.statement = conexao.prepareStatement(sql);
ps.setInt(1, bean.getId());
int quantidade = ps.executeUpdate();
ps.close();
ps = null;
if (quantidade == 0) {
throw new BDError(PessoaDAO.class.getName() + " - excluir: " + "Ao excluir nenhum registro foi afetado.");
}
} catch (SQLException ex) {
throw new BDError(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!
cara
valeu… ajudo pra caramba!
entendi o funcionamento… seus post foram de grande valia!
abraço
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!
entendi como usa o DAO… mais ainda fico a dúvida do RS e STMT!
como fazer o retorno em uma consulta?! :S
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.
no caso dessa estrutura DAO… o ideal seria retorna um List<?> ?!
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.