Introdução ao JDBC

em 31/05/2003 , por Paulo Silveira
Introdução
Com este tutorial, você aprenderá a utilizar o JDBC, fazendo uma conexão com o banco de dados. Apesar de ser bem básico, e fazer apenas um SELECT, iremos explicar direitinho como funciona o JDBC, para você não ter de decorar "receitas de bolo". Vamos utilizar o MySQL, mas você pode facilmente usar qualquer banco de dados de sua preferência.
O pacote java.sql
Olhando para a API do pacote, você logo vai se perguntar: Porquê as classes do java.sql são, em sua grande maioria, apenas interfaces? Desta maneira, a implementação dessas classes fica por conta de alguém que entenda de determina banco de dados. Por exemplo, se temos o MySQL, alguém que entenda do MySQL implementa as classes do java.sql, desta forma, nós podemos fazer conexão com o MySQL através destas classes. Ao contrário de linguagens como php, o java não implementa esses drivers, desta maneira, novos drivers vão aparecendo na medida em que novos bancos de dados e novas versões deles vão aparecendo, o que seria um caos para a SUN ter de fazer, além de provavelmente não utilizar o melhor potencial do banco de dados.
Um pouco de código
Então, onde configuramos qual driver a minha aplicação deve usar? Na verdade, você pode ter vários drivers ao mesmo tempo, e a utilização deles vai de acordo com qual String de conexão você utilizar. O driver é um jar (se for um driver puro java), e você deve te-lo em seu classpath, caso contrário não conseguirá utilizá-lo. Se preferir, coloque o driver no classpath na hora de chamar o java, atraves da linha de comando, por exemplo:

Você pode pegar o driver do mysql aqui. Porém, precisamos antes "carregar" o driver, de tal maneira que o Java saiba que ele existe, e possa usá-lo se necessário. Normalmente, os livros explicam isto de forma muito básica, e não entram em detalhes, já que o código que carrega o driver é do tipo:

Mas o que acontece realmente aqui? Quando você utiliza o método estático Class.forName(), o Class Loader tenta inicializar esta classe. Esta classe (que é o nosso driver jdbc) possui um bloco inicializador estático (não se preocupe caso você não conheça este recurso), que irá registrar essa classe como um driver JDBC, avisando o java.sql.DriverManager, pelo método registerDriver. Obs: Existem outras maneiras de carregar o driver, como por linha de comando (bootstrap). Agora que o driver já está registrado, podemos abrir uma conexão com o banco de dados, passando uma String de conexão.

Desta vez, o java.sql.DriverManager vai perguntar para cada Driver registrado, se ele aceita a String de conexão em questão. Se algum deles aceita esta String, a conexão é aberta (pelo Driver), e retornada. Caso contrário, uma exceção é lançada. Pela própria String de conexão, você pode passar muitos outros parâmetros (além de login, senha e nome do banco de dados, como neste caso), a maioria de interesse do Driver, como por exemplo saber se aquela conexão deve estar em modo de auto reconexão caso ela caia, e muitos outros. Este tipo de informação está na documentação do seu driver.
Um simples SELECT
Vamos agora fazer um SELECT, e pegar os dados que este SELECT devolver, imprimindo-os. Lembre-se que você deve adaptar a String de conexão e o nome do bancod e dados, tabela e campos para um que você já tenha em sua máquina, claro.

O método Connection.createStatement() te devolve um objeto java.sql.Statement, que representa uma simples Query ou comando. Nós utilizamos depois o Statement.executeQuery(), que devolve um java.sql.ResultSet com o resultado. Caso a quey fosse algo que não retornasse nada, tipo um INSERT ou UPDATE, você deve utilizar o Statement.executeUpdate(). Agora temos um java.sql.ResultSet, que contém o resultado da nossa Query. Vamos iterar sobre ele:

Muito intuitivo não? Repare que o java.sql.ResultSet possui uma série de métodos para que você possa pegar o valor da coluna já no tipo desejado, como String, int, Date, etc...
Considerações finais
Aqui utilizamos código SQL dentro das classes Java, isto é um péssimo hábito. O interessante é ter as queries dentro de um arquivo de configuração, como um XML ou um arquivo de properties. Desta maneira, caso você mude de banco de dados, pode facilmente mudar as queries que não são compatíveis. Além disso, apresentamos aqui apenas o java.sql.Statement, mas é altamente recomendável o uso do java.sql.PreparedStatement, onde você pode reutilizar bastante os statements e o seu driver JDBC pode ajudar bastante na hora de você ter de fazer coisas como escape de Strings (colocar \ na frente das aspas de uma String, por exemplo). Fica aqui a recomendação da leitura da api desta classe.