Curso de Análise e Desenvolvimento de Software Disciplina: Linguagens de Programação II Prof. Gilmar Caiado Material de Apoio Java JDBC I 3 o Período 22/05/2009 Java JDBC - I Motivação: Realizar a integração Java Base de dados É possível fazer qualquer tipo de operação em um BD, via SQL, integradoà programação e componentes Java As classes Java de integração e manipulação de bancos de dados são encontradas no pacote java.sql Para a integração é necessária a obtenção de um driver JDBC, para cada banco de dados utilizado: Ex: para o MySQL é necessário o driver específico para este banco, denominado Connector/J: http://dev.mysql.com/downloads/connector/j/5.1.html; Ex. 2: para o SQLServer da Microsoft, o driver JDBC pode ser obtido em http://msdn.microsoft.com/en-us/data/aa937724.aspx Obs. Importante: Para o perfeito funcionamento do driver JDBC, o arquivo.jar deve ser configurado junto às bibliotecas do projeto, no caso do NetBeans. Ex: botão direito, Propriedades, aba Bibliotecas, botão Adicionar JAR/Pasta. Referência: Uma boa introdução ao assunto pode ser encontrada no Java Tutorial em http://java.sun.com/docs/books/tutorial/jdbc/index.html Ex 1: Teste de instalação do driver JDBC para MySQL - observar a chamada a Class.forName() buscando pelo driver JDBC específico carregado: se a classe não for achada, uma exceção é retornada (tratamento de exceções por try..catch), podendo ser apresentada uma mensagem de erro 1
public class LoadDriver { public static void main(string[] args) { //procura pelo driver JDBC instalado no sistema Class.forName("com.mysql.jdbc.Driver"); System.out.println("Driver JDBC carregado com sucesso!"); catch (Exception ex) { System.err.println(ex.getMessage()); Ex 2: Teste de conexão a um banco de dados este exemplo mostra o acesso a um banco de dados em MySQL, denominado books, apresentando a conexão ao mesmo: da mesma maneira que o exemplo anterior, se a classe não for achada ou a conexão não puder ser realizada com sucesso, uma exceção é retornada; São apresentadas aqui as classes/interfaces: java.sql.drivermanager: classe auxiliar que retorna um objeto Connection, auxiliando na conexão a uma determinada base de dados, a partir do nome do banco, nome do usuário e senha de acesso; java.sql.connection: classe que representa uma conexão ou sessão com um banco de dados. Instruções (statements) SQL são executados e os resultados retornados dentro do contexto da conexão. Maiores detalhes a serem abordados a partir do exemplo 3, com o uso da classe Statement. Obs: para este exemplo é necessário carregar o BD books no servidor MySQL: import java.sql.*; usar o arquivo books.sql e a seguinte instrução, a partir do dir de instalação do MySQL/bin: mysql -u root -p < books.sql entrar com a senha Executar as instruções apresentadas no apêndice deste material para certificar que o banco foi realmente carregado public class ConectaDB { static final String JDBC_DRIVER = "com.mysql.jdbc.driver"; static final String DB_URL = "jdbc:mysql://localhost/books"; 2
public static void main(string args[]) { Class.forName(JDBC_DRIVER); //carrega classe de dados do BD System.out.println("Driver JDBC carregado com sucesso!"); //estabelece conexão com o BD Connection connection = DriverManager.getConnection(DB_URL, "root", ""); System.out.println("Conexão estabelecida - Banco " + DB_URL); connection.close(); catch (Exception e) { System.err.println(e.getMessage()); Ex3: Teste de recuperação de registros em um BD, a partir de um statement SQL aqui é apresentada a interação completa a um BD, onde são estabelecidas a conexão e em seguida, feita uma consulta SQL, onde os resultados retornados são apresentados ao usuário. São apresentadas aqui as classes/interfaces: import java.sql.*; java.sql.statement: interface responsável por executar o comando SQL e retornar os resultados produzidos. Os resultados são retornados para a interface ResultSet; java.sql.resultset: representa os resultados obtidos do comando SQL, permitindo interação com os mesmos; java.sql.resultsetmetadata: classe responsável por retornar tipos ou propriedades das colunas das tabelas apresentadas em um ResultSet public class DisplayAutores { // nome do driver JDBC e URL do banco de dados static final String JDBC_DRIVER = "com.mysql.jdbc.driver"; static final String DB_URL = "jdbc:mysql://localhost/books"; // carrega o aplicativo public static void main( String args[] ) { Connection connection = null; // gerencia a conexão Statement statement = null; // instrução de consulta // conecta-se ao banco de dados books e o consulta 3
Class.forName( JDBC_DRIVER ); // carrega classe de driver do banco de dados // estabelece conexão com o banco de dados connection = DriverManager.getConnection( DB_URL, "root", "" ); // cria Statement para consultar banco de dados statement = connection.createstatement(); // consulta o banco de dados ResultSet resultset = statement.executequery( "SELECT authorid, firstname, lastname FROM authors" ); // processa resultados da consulta ResultSetMetaData metadata = resultset.getmetadata(); int numberofcolumns = metadata.getcolumncount(); System.out.println( "Tabela de Autores - BD Books:" ); for ( int i = 1; i <= numberofcolumns; i++ ) { System.out.printf( "%-8s\t", metadata.getcolumnname( i )); System.out.println(); while (resultset.next()) { for ( int i = 1; i <= numberofcolumns; i++ ) { System.out.printf( "%-8s\t", resultset.getobject( i )); System.out.println(); // fim do while // fim do try catch (SQLException sqlexception) { sqlexception.printstacktrace(); // fim do catch catch (ClassNotFoundException classnotfound) { classnotfound.printstacktrace(); // fim do catch finally {// assegura que a instrução e conexão são fechadas adequadamente statement.close(); connection.close(); // fim do try catch ( Exception exception ) { exception.printstacktrace(); // fim do catch // fim do finally 4
// fim de main Apêndice Alguns comandos úteis de MySQL A partir do MySQL Command Line Client, após a entrada da senha, temos acesso ao servidor, onde podem ser entrados comandos, tais como: mostra os bancos de dados configurados: show databases; seta um banco de dados para uso: use <nome_do_banco>; após o comando use, pode-se usar show tables;, para mostrar as tabelas do BD um teste com uma instrução ou statement SQL pode ser então realizado 5