‘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!
‘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.
ok…
valeu…
creio que agora está td resolvido! okakoakoakoakoakoakooka
porém uma ultima duvida
essa classe[code]public ublic 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;
}
}[/code]
seria um Bean?!
to tentando enteder os conceitos de DAO, Beans essas coisas! e me parece que é a mesma coisa!