Qual a diferença entre JDBC e JDBI?

Recentemente um colega meu me indicou o usou de JDBI para substituir um ORM. ORM é bom para quem trabalha com múltiplos banco de dados e necessita colocar a mesma aplicação para consumir diferentes bancos de dados. Essa facilidade tem um custo, o custo de performance, pois as ferramentas de ORM precisam converter as chamadas SQL do framework para chamadas que o banco compreende, ou semelhante a nativa.

Então, porque ao invés de não se realizar direto a chamada de JDBC e não tivesse um framework que agilize meu desenvolvimento, mas não comprometa a performance?

Pensando nisso, a galera criou o JDBI, não é nova, tem desde 2004, mas eu só vim descobrir recentemente.

jDBI é uma biblioteca construída em cima de JDBC. JDBC funciona muito bem, mas geralmente parece otimizar para os fornecedores de banco de dados (escritores drivers). jDBI tenta expor a mesma funcionalidade, mas em uma API otimizada para os desenvolvedores.

É nível muito mais baixo do que um ORM como Hibernate ou JPA. A biblioteca é semelhante ao MyBatis (sucessora bifurcada para iBATIS).

jDBI suporta duas APIs estilo, um estilo velho, que se parece com:

List<AlgumaClasse> r = h.createQuery("select * from algo where id = :id and nome = :nome")
.bind("nome", "andre")
.bind("id", 1)
.map(AlgumaClasse.class)
.list();

E o estilo novo da API SQL objeto, que trabalha de uma forma reflexiva  e realmente abstraindo o JDBC:

interface NovoAPISQL
{
@SqlUpdate("insert into algo (id, nome) values (:id, :nome)")
int insert(@Bind("id") int id, @Bind("nome") String nome);

@SqlQuery("select id, nome from algo where id = :id")
AlgumaClasse findById(@Bind("id") long id);
}

A biblioteca tem uma boa referência (javadoc) e documentação estilo tutorial em http://jdbi.org/.

Concluindo

Outro lado interessante é que a comunidade trabalha bastante em melhorias e correções nela, por ser open source.
Vale a pena pensar se seu time ou seu projeto não merece ganhar uma produtividade no trabalho com tarefas de DAO.

Meu github: https://github.com/andremrezende

Resolvendo o problema de scroll com href do HTML com Jscript

Se deseja evitar o scroll do href bastar adicionar ao evento “onclick” um “return false”.
Exemplo:
Se tem um código parecido como abaixo em seu HTML, isso ocasionará um scroll de página, retornando ao topo da página.

<a href='#' onclick="javascript:alert('oi');">Fechar</a>

Para evitar o scroll, adicione um “return false” ao final de sua chamada jscript ou retorne false de sua função.

<a href='#' onclick="javascript:alert('oi');return false;">;Fechar</a>

Código HTML completo:

<html>
<head>
</head>
<body>
43243324423<br>
dfgdgfd<br>
fdgfdg<br>
fdgg<br>
dgdfg<br>
fdgdgfd<br>
gddgdgfd<br>
gfdfdgfd<br>
fdgfghgfhfhjfg<br>
gfhgffhgfhgf<br>
gfhgfghgh<br>
hhhfghgfh<br>
ffff<br>
43243324423<br>
dfgdgfd<br>
fdgfdg<br>
fdgg<br>
gddgdgfd<br>
gfdfdgfd<br>
fdgfghgfhfhjfg<br>
gfhgffhgfhgf<br>
gfhgfghgh<br>
hhhfghgfh<br>
ffff43243324423<br>
dfgdgfd<br>
fdgfdg<br>
fdgg<br>
dgdfg<br>
fdgdgfd<br>
gddgdgfd<br>
gfdfdgfd<br>
fdgfghgfhfhjfg<br>
43243324423<br>
dfgdgfd<br>
gfdfdgfd<br>
fdgfghgfhfhjfg<br>
gfhgffhgfhgf<br>
gfhgfghgh<br>
hhhfghgfh<br>
ffff43243324423<br>
dfgdgfd<br>
fdgfdg<br>
fdgg<br>
dgdfg<br>
fdgdgfd<br>
gddgdgfd<br>
gfdfdgfd<br>
<a href='#' onclick="javascript:alert('oi'); return false">Fechar</a>
</body>
</html>

Ajudando a Oracle a melhorar suas certificações Java

Já realizei 3 certificações da ex Sun e não prossegui com outras certificações depois da aquisição pela Oracle. O motivo é simples, estou descontentado com obrigação de se realizar curso em algumas delas.  Todas as minhas certificações adquiri material e realizei os exames com louvor. Sei que um curso é uma maneira mais prática e rápida de se adquirir um conhecimento, mas não acho que o caminho da Oracle fosse tornar isso obrigatório.

Hoje descobri que a Oracle está querendo mudar esse universo. Ela está realizando um questionário para tornar mais atraente o programa de certificação Java.

Quem puder contribuir, acredito que ajudaria muito a melhorar nossa comunidade Java brasileira.

O link é https://www.surveymonkey.com/s/YDMC2Q5

Abraços,
André Rezende

Limpeza de código morto

UCDetector

UCDetector

Trabalhar com manutenção de código não é tarefa fácil.
Depende do local que trabalha, terá tempo para executar testes e melhorar a solução que já existe.
Comecei minha vida de programador Java em 2002, quando aprendi procurando em tutoriais na internet da antiga SUN e trabalhando na área.
Desde lá, Java evolui muito como as IDEs de suporte, exemplo disso é o Eclipse, mas e o código legado? Infelizmente não, porque? Nas empresas onde trabalhei, tempo de refactoring é tempo perdido.
A vantagem de refactoring em código pode ser muito grande, mas o tempo inicial investido pode ser gigantesco. Isso requisita retestar algo que já funciona ou tudo por completo.
O ditado sempre é o mesmo: “Em time que está ganhando não se mexe.”. Será verdade? Ganhando por estar funcionando como planejado inicialmente, mas não tirando o melhor proveito da tecnologia. Evolução é melhoria em meu ponto de vista. Nessa evolução inclui, qualidade, performance, produtividade, dentre outros fatores.
Uma questão da qual eu não vejo muita discussão em refactorings, será que código não utilizado deve ser mantido? N vezes a pessoa que faz manutenção não é a mesma que criou, ou pior, a pessoa criadora daquele código já pode ter abandonado o barco. Comecei então a tirar dos projetos todo código que não é utilizado, tarefa árdua para legados.
No Eclipse achei um plugin que tem me ajudado, o UCDetector. Ele faz a limpeza de código fonte inútil. Busca referências de classe, pacote e até projeto que não possuem nenhuma associação apontando os respectivos problemas ou melhorias.
Sempre que sobra um tempo, executo o UCDector no projeto desejado e realizo a refatoração. Sei muito bem que ela vai me ajudar a não ver código perdido e todos vão ganhar para realizar leitura e manutenções nas aplicações.

Sobre o UCDetector: É um plugin do Eclipse para busca código Java morto. Por exemplo, classe públicas, métodos e propriedade que não tem referência.
Ele cria marcadores para os seguintes melhorias: Código não necessário (morto), código onde a visibilidade por ser alterada (protected, default ou private), métodos ou campos que podem ser final. São apenas sugestões. Tenha certeza das alterações que você irá realizar. As referências ainda podem ser usadas em:
Reflexões, frameworks, código de terceiros, jars, jsp, xml, e outros, alterar visibilidade por causar transtornos e não executar conforme esperado.

Link: http://www.ucdetector.org/

Espero ter ajudado,
André Rezende

Hibernate e Oracle

Depois de passar 1 dia investigando o problema com o hibernate, oracle no tomcat “org.hibernate.dialect.Oracle10gDialect cannot be cast to java.sql.Driver”, finalmente descobri a causa do problema.

Meu hibernate não estava definindo o dialect, somente o driver Oracle. Todos meus Junits funcionavam perfeitamente, porém quando realizada deploy, o hibernate reclamava e não carregava a entidade.

A resolução é simples, no arquivo persistence.xml deixe sempre as seguintes propriedades:

<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>

Lembrando que o persistence.xml deverá estar na pasta META-INF do seu projeto (jar ou war). Isso tudo dependerá da hierarquia de pasta de seu projeto.
Abraços,
André Rezende