segunda-feira, 20 de abril de 2015

Novidades do JDBC 4

Apesar de hoje em dia não ser comum utilizar JDBC puro em grandes projetos, embora haja quem o faça, a API continua evoluindo junto com a especificação do JSE.

A nova API, JDBC 4, foi incorporada ao JDK 6 e traz algumas mudanças como: melhor gerenciamento de objetos e suporte a novos tipos de dados, além das já existentes flexibilidade e facilidade de uso.

Uma mudança que a nova versão trouxe é na hora de obtermos uma conexão com o banco. Antes era necessário carregar a classe do driver JDBC antes de chamar o getConnection de DriverManager, por exemplo:

Class.forName("com.mysql.jdbc.Driver");
//Chamada ao DriverManager aqui

Esta chamada não é mais necessária, pois o próprio DriverManager se encarregará de localizar e carregar  a classe do Driver JDBC, para isto, basta que nós adicionemos o .jar no classpath da aplicação.

Outra novidade é o suporte a tipos de dados em XML, que estão definidos na SQL2003. O objeto é o java.sql.SQLXML, podemos fazer por exemplo:

SQLXML xml = Connection.createSQLXML( );

ou ainda:

SQLXML xml = resultSet.getSQLXML( );
InputStream is = xml.getBinaryStream( );

Seu uso é similar aos dos tipos CLOB e BLOB, que são suportados desde à versão 2.0, a nova versão traz  também a classe RowId, que permite fazer o acesso a um registro de forma mais rápida.
Agora é possível executar funções escalares como:
  • CHAR_LENTH, CHARACTER_LENGTH
  • CURRENT_TIME, CURRENT_DATE

Com o advento dos frameworks de ORM, como Hibernate, JPA, ficou cada vez mais raro usar JDBC, talvez você nem mesmo soubesse que a API estava na versão 4.0, tô mentindo? :) Eu penso que é bom conhecer essas APIs mais básicas, pois se soubermos utilizar bem JDBC será mais fácil aprender a usar ORM, assim como o estudo de Servlets/JSP é importante para o aprendizado de frameworks web como JSF, Struts, Vraptor etc.

Há situações em que nós não precisamos ou não queremos utilizar um framework de grande porte, por exemplo, no caso de o projeto pode ser pequeno ou simples demais, ou ainda se tivermos restrições de desempenho ou espaço de armazenamento (sistemas embarcados, por exemplo).

Espero que tenham gostado do post! Até o próximo post então!

quarta-feira, 1 de abril de 2015

Javascript Fundamentos: Parte 2 - Escopo Léxico e Escopo de Função

No post anterior, nós vimos a definição de escopo e como funciona o escopo global do Javascript. Neste artigo irei mostrar o Escopo Léxico, que também é conhecido como escopo estático. Entendê-lo é fundamental para você compreender um outro assunto bacana de Javascript: Closures! Mas não se apresse! Primeiro vamos entender o que é esse tal de escopo léxico.

O escopo léxico tem a ver com o lugar onde suas variáveis e blocos foram escritos no código. Um nome (de uma variável ou bloco) sempre irá se referir ao seu escopo léxico local mais próximo, e essa propriedade não muda, independentemente da pilha da execução da linguagem. Como é que é?? Calma jovem, logo tudo isso fará mais sentido. 

O escopo léxico define como as variáveis são resolvidas em funções aninhadas, de forma que uma função aninhada terá acesso às variáveis declaradas nas funções mais externas. É como se a função interna contivesse todo o escopo das funções externas. Veja o exemplo abaixo:

Para resolver uma variável, a engine do Javascript faz uma busca em todos os escopos visíveis, do mais interno ao mais externo (global). Outra ponto importante de se destacar, é que a busca para ao encontrar a primeira declaração correspondente. Vejamos:

A operação mais interna a ser executada é a função bar, e nela, a chamada console.log(a, b, c). A engine tentará resolver 'a' no escopo de bar, ao não encontrar, ela sobe para o escopo foo, onde estará 'a', que será usado e a busca terminada. O mesmo ocorrerá com 'b', já no caso de 'c', o valor estará dentro do escopo de bar e será usado.

O escopo léxico é definido pelo programador ao escrever uma variável em determinado lugar do código. O mecanismo de interpretação do Javascript saberá então onde localizar o valor a ser atribuído durante a execução do código. Isso seria uma tarefa de compilação, porém como Javascript não é uma linguagem compilada, essa tarefa é chamada de Lexing Time.

Function Scope

Javascript não possui escopo de bloco! Isso confunde a cabeça de quem vem de linguagens como Java, C, C#, por exemplo. Toda função em Javascript cria um novo escopo. Vejamos um exemplo bem simples abaixo:

Como era esperado, a variável 'a' é criada em cada função e não é afetada por outros escopos. Nesse caso ocorre o fenômeno que é conhecido como Shadowing, se uma variável com o mesmo nome é criado em um escopo aninhado esta acaba 'sombreando' o valor declarado no escopo superior.

Já que não existe escopo de bloco em Javascript, estruturas como for ou while não criam um novo escopo. Vejamos qual implicação disso no trecho de código abaixo:

A variável 'i', embora criada dentro do laço for, é visível mesmo fora dele, ou seja, ela na verdade pertence ao escopo da função loop. Em um outro artigo veremos que isso ocorre devido a um comportamento da linguagem Javascript chamado de Hoisting.

No próximo artigo fecharemos o assunto de escopo falando sobre IIFE e Hoisting. Até o próximo post!