Transcript
Introdução ao JDBC
Como utilizar o java para fazer uma conexão com um banco de dados,
detalhando como isto realmente acontece e qual é o papel do Driver.
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.
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.
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:
"1 java -classpath diretorio/meudriver.jar MinhaClasse "
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:
"1 Class.forName("com.mysql.jdbc.Driver"); "
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.
"1 Connection conn = "
"DriverManager.getConnection("jdbc:mysql://localhost/BANCO_DE_DADOS?user="
"root&password=root"); "
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.
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.
"1 Connection conn = "
"DriverManager.getConnection("jdbc:mysql://localhost/BANCO_DE_DADOS?user="
"root&password=root"); "
"2 Statement stm = conn.createStatement(); "
"3 ResultSet rs = stm.executeQuery("SELECT coluna1, coluna2, coluna3 FROM"
"tabela"); "
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:
"1 while (rs.next()) { "
"2 String coluna1 = rs.getString("coluna1"); "
"3 int coluna2 = rs.getInt("coluna2"); "
"4 Date coluna3 = rs.getDate("coluna3"); "
"5 } "
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...
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.