Tradução Objeto > Banco > Objeto usando JDBC

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…

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

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?

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

[quote=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[/quote]

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?

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.