Tradução Objeto > Banco > Objeto usando JDBC

5 respostas
Marcelo_FS

Bom dia pessoal.

Apesar de já programar Java faz tempo, estou começando no pattern [url=“http://www.javafree.org/content/view.jf?idContent=183”]DAO[/URL] agora… o que estou tentando fazer é, com base em um objeto, inserir ele no banco, pegar a ID que ele ficou (no caso, essa id é a PK), setar a ID no objeto e retorná-lo. Só que eu quero fazer isso com JDBC, pois é um programa pequeno (~3MB, com as libs), e usar algum framework como Hibernate iria gerar um overhead muito grande.
Minha idéia era que a camada DAO tivesse alguns métodos mais ou menos assim:

public UmObjeto inserir(UmObjeto o) {
    PreparedStatement st = QueryManager.getPreparedStatement("insert");
    try {
        st.setInt(1, o.getAtributo()); // mais algumas linhas assim
        st.executeUpdate();
     
        // aqui que está a dúvida!!
        o.setIdNoBanco( ? ? ? );
        return o;
     } catch (final SQLException e) {
        this.log.warn(e.getMessage(), e);
        return null;
     }
}

public UmObjeto salvar(UmObjeto o) {
    PreparedStatement st = QueryManager.getPreparedStatement("save");
    try {
        st.setInt(1, o.getAtributo()); // mais uma linha assim
        st.setInt(3, o.getIdNoBanco()); // pega a ID do objeto no banco e define no sql
        st.executeUpdate();
        return o;
     } catch (final SQLException e) {
        this.log.warn(e.getMessage(), e);
        return null;
     }
}

Onde os SQLs dos PreparedStatements são:

insert= INSERT INTO Transfer(serverid, serverurl, transfersize, hits_last_hour, hits_total, register_time) VALUES(?, ?, ?, ?, ?, ?);

save= UPDATE Transfer SET hits_last_hour=?, hits_total=? WHERE idTransfer=?

No caso, estou usando o HSQLDB. Passei a tarde de ontem procurando sobre isso, mas a maior parte das pessoas usa alguma implementação do JPA, então não achei exemplo algum de como fazer o que eu quero…

5 Respostas

mduques

Cara, usando jdbc você terá que fazer um select, pegar o id e setar no objeto. Com jdbc só assim mesmo.

Marcelo_FS

No caso eu teria que fazer um select baseado nos outros atributos do objeto?
Talvez fosse melhor eu manter um campo ID próprio, com (por exemplo) o timestamp da criação do objeto, e já setar tudo na hora de incluir?

mduques

Você tem várias opções…
vc poderia ter uma tabela no seu banco utilizada como sequence sacou tipo:

table_name | sequence
FUNCIONARIO 500
VENDAS 300

daí antes de incluir vc teria um método que te retornasse o próximo, este método fazia um select pegava o id da tabela e atualizava… sacou?

synchronized Integer nextId(String tableName);

Você poderia ter um timestamp tbem, você pode ter problemas com relacionamento, pra manter isso, eu acho melhor vc ter esse “gerenciamento de sequences” é uma opção

Marcelo_FS

mduques:
Você tem várias opções…
vc poderia ter uma tabela no seu banco utilizada como sequence sacou tipo:

table_name | sequence
FUNCIONARIO 500
VENDAS 300

daí antes de incluir vc teria um método que te retornasse o próximo, este método fazia um select pegava o id da tabela e atualizava… sacou?

synchronized Integer nextId(String tableName);

Você poderia ter um timestamp tbem, você pode ter problemas com relacionamento, pra manter isso, eu acho melhor vc ter esse “gerenciamento de sequences” é uma opção

Hmm, saquei sim! Seguindo essa linha, um

não retornaria um resultado confiável para definir como id, partindo-se do princípio que sempre se adiciona um no count?

Marcelo_FS

A quem interessar possa: entrei em contato com a lista do HSQLDB, e pra conseguir a ID do último insert na tabela, é só usar o comando:

imediatamente após executar o insert. Ele retorna o último valor inserido em uma coluna do tipo identity na sessão.

Criado 28 de outubro de 2008
Ultima resposta 28 de out. de 2008
Respostas 5
Participantes 2