Laboratório de Banco de Dados Aula 1 Acesso a Banco de Dados Prof. Josenildo Silva jcsilva@ifma.edu.br
Introdução O JDBC (Java Database Connectivity) foi criado com o intuito de fornecer aos programadores uma interface de acesso à banco de dados Os detalhes são deixados para os respectivos drivers, ou seja, a especificidade de acesso a cada banco é deixado a cargo do driver Objetivos Fornecer uma API que permita a execução de comandos SQL Deve ser baseada na experiência de outras APIs já existentes Deve ser simples
JDBC É o pacote Java para a manipulação de BDs Sua principal vantagem é a independência de plataforma e de software JDBC utiliza SQL para o acesso aos dados Se forem usados apenas elementos do SQL padrão é possível substituir toda a base de dados sem alterações críticas no programa JDBC foi baseado no ODBC da Microsoft
JDBC e SQL Através de JDBC é possível utilizar comandos SQL para definição, manipulação e controle de dados Para executar comandos SQL é preciso: Criar um Statement para envio de instruções Enviar os comandos com um dos vários métodos para envio dos comandos
Estrutura JDBC Aplicação Java JDBC Driver Manager Ponte JDBC/ODBC JDBC Driver ODBC Driver BD
Arquitetura
Drivers JDBC A Sun define quatro tipos de drivers: Tipo 1: são drivers que fazem a ligação(ponte) entre JDBC e ODBC. Tipo 2: são drivers escritos parte em Java e parte em uma linguagem de programação nativa. Tipo 3: são classes Java que usam protocolo independente e fazem requisições para um servidor. Tipo 4: são classes Java que se comunicam diretamente com a base de dados
Uso do JDBC Para usar o JDBC deve-se: Criar uma base de dados (SGBD) Carregar o driver adequado Definir uma URL de conexão Estabelecer uma conexão com a base de dados Enviar instruções SQL (com Statements) Processar o resultado Fechar a conexão
Criando uma Base de Dados Cada SGBD tem suas próprias ferramentas para criação de Bases de Dados Por exemplo no MySQL você pode usar o MySQL Workbench Create new schema
Carregando Drivers Todo driver JDBC tem uma classe que o representa Para carregar um driver deve-se carregar esta classe. Existem duas formas: Class.forName: carrega a classe indicada e registra-a como driver (mais usual) registerdriver: método de DriverManager que registra o driver. Neste caso deve-se antes carregar o driver através da criação de um objeto da classe correspondente
Definindo a Conexão O próximo passo é a criação de uma conexão entre o driver e a base de dados Para criar a conexão é necessário especificar a localização (URL) do BD: Protocolo: sempre iniciam com jdbc: seguido do protocolo de acordo com o SGBD O nome do host, caso a conexão seja remota A porta de comunicação, se existir O nome da base de dados Exemplo de URL com mysql jdbc:mysql://localhost:3306/meubanco
Estabelecendo a Conexão Para estabelecer a conexão deve-se criar um objeto Connection através de um dos três métodos getconnection de DriverManager Este método recebe três parâmetros: a string de conexão (URL), o nome do usuário e a senha, caso existam
Criando Statements Para criar este objeto usa-se os comandos createstatement ou preparestatement do objeto Connection: Statement createstatement() Quando não há parametros PreparedStatement preparestatement(string) quando existem parâmetros
Criando Statements Para criar este objeto usa-se os comandos createstatement ou preparestatement do objeto Connection: Statement createstatement() Quando não há parametros PreparedStatement preparestatement(string) quando existem parâmetros http://www.devmedia.com.br/sql-injection-em-ambientes-web/9733
Executando Comandos SQL Para enviar comandos SQL devemos utilizar um dos métodos do objeto: boolean execute (String SQL) executa um SQL que pode retornar mais de um resultado int executeupdate (String SQL) executa SQLs que retornam valores inteiros, como INSERT, UPDATE, DELETE ou que não retornam nada como CREATE TABLE e DROP TABLE ResultSet executequery(string SQL) executa pesquisas SQL através do comando SELECT
Criando e Excluindo Tabelas Para criar uma tabela deve-se utilizar o método executeupdate Este método retorna o número de linhas para INSERT, UPDATE e DELETE ou zero para outras instruções Para criar uma tabela: stm.executeupdate( create table... ); Para excluir uma tabela: stm.executeupdate( drop table nome );
Manipulando Dados Para acessar os dados de uma tabela também se usa o método executeupdate Para inserir dados usa-se o SQL INSERT INTO: stm.executeupdate( INSERT INTO... ); Para atualizar usa-se UPDATE... SET stm.executeupdate( UPDATE... SET... ); Para eliminar usa-se o DELETE FROM: stm.executeupdate( DELETE... FROM );
Pesquisando A pesquisa de dados envolve o método executequery e o SQL SELECT Este método retorna um objeto do tipo Resultset que contém as linhas e colunas que satisfazem a string de busca Para navegar pelas linhas usa-se next() Para acessar um certo valor usam-se os comandos getxxx que recebem o nome da coluna ou o número de ordem
Tratando Exceções A maioria dos métodos JDBC dispara a exceção SQLException Esta exceção possui métodos que retornam informações adicionais sobre o erro: String getsqlstate() retorna uma string com o SQLState formatado int geterrorcode() retorna o código de erro específico SQLException getnextexception() recupera a próxima exceção
Passos para Acessar o Oracle Criar um data source usando a classe OracleDataSource Ex: OracleDataSource ds = new OracleDataSource(); Parâmetros importantes a serem definidos no objeto OracleDataSource URL da conexão: ds.seturl("jdbc:oracle:thin:@localhost"); Usuário: ds.setuser("system"); Senha: ds.setpassword("senha123"); Instanciar um objeto da classe Connection usando o método getconnection do data source Criar um obeto da classe Statement que irá tratar os comandos SQL Executar o comando SQL colocando o resultado em um objeto da classe ResultSet
Conexão com BD O primeiro passo é instalar o JDBC para o banco que será utilizado o No caso do Oracle, a biblioteca do JDBC é instalada juntamente com o SGBD o Dois arquivos são necessários C:\oraclexe\app\oracle\product\10.2.0\server\jlib\orai8n.jar C:\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib\ojdbc14.j ar o Os diretórios de onde se encontram os arquivos.jar devem ser especificados na variável de sistema CLASSPATH Outra possibilidade é fornecer o caminho dos arquivos no momento da compilação o javac classpath C:\oraclexe\app\oracle\... arquivo.java
Para quem usa o Eclipse
Classes Importadas java.sql.connection usada para representar uma conexão por onde serão enviados os comandos SQL java.sql.resultset usada para receber o resultado de um comando SQL java.slq.sqlexception para tratar as exceções que possam ocorrer na execução de um comando SQL Java.sql.Statement usado para manipular os comandos SQL e solicitar a sua execução oracle.jdbc.pool.oracledatasource factory que manipula as conexões
Exemplo
Acesso com MySQL Adicione a biblioteca JDBC do MySQL ao seu projeto
Exemplo
Exemplo (cont.)
Instruções Pré-Compiladas Cada instrução SQL enviada para o SGBD é compilada e executada Para instruções subseqüentes é realizada uma verificação no SGBD para identificar se ela já foi executada recentemente Como muitas instruções são semelhantes é mais eficiente utilizar instruções parametrizadas chamadas de PreparedStatements.
Usando PreparedStatements Para criar uma instrução pré-compilada devese utilizar o método preparestatement que retorna um PreparedStatement Este método recebe uma instrução SQL com? para indicar os parâmetros Antes de executar um PreparedStatement deve-se passar os parâmetros com setxxx Estas instruções recebem o índice e o valor do parâmetro a ser executado
Usando PreparedStatements Existem instruções setxxx para os principais tipos de dados Para executar um PreparedStatement usam-se os métodos execute, executeupdate e executequery sem parâmetros Caso seja necessário limpar os parâmetros atuais deve-se usar o método clearparameters: void clearparameters()
Referências Slides do Prof. Omar Carmona Slides do Prof. Elton R. C. Spode http://www.inf.unifra.br/~espode Artigo sobre SQL Injection http://www.devmedia.com.br/sql-injection-emambientes-web/9733