• Nenhum resultado encontrado

Programação para Bancos de Dados JDBC

N/A
N/A
Protected

Academic year: 2021

Share "Programação para Bancos de Dados JDBC"

Copied!
20
0
0

Texto

(1)

1

Programação para Bancos de Dados

JDBC

MAC0439 – Laboratório de Bancos de Dados

Aula 18 – Parte 1

16 de maio de 2018

Profa. Kelly Rosa Braghetto

(2)

2

Interfaces entre Hospedeira/SQL via Bibliotecas

Existem 2 abordagens que integram linguagens de programação e bancos de dados, mas que envolvem o uso de códigos que são específicos para um dado SGBD:

Stored procedures

SQL embutida

Existe ainda uma 3ª abordagem, em que os recursos de bancos de dados são expostos ao programador de uma forma padronizada

(independente de SGBD), por meio de uma biblioteca (API)

(3)

3

Exemplos de APIs de Integração a BDs

C + SQL/CLI (Call Level Interface) – que é parte do padrão SQL

Java + JDBC (Java Database Connectivity)

PHP + PEAR MDB2

Python + DB-API

...

(4)

4

O URL do BD, o nome do

usuário e a senha aparecem aqui.

Carregado por forName

O driver

para Postgres;

existem outros

Classes JDBC

Criando uma Conexão em JDBC

import java.sql.*;

Class.forName(“org.postgresql.Driver”);

Connection myCon =

DriverManager.getConnection(…);

(5)

5

Comandos

 JDBC disponibiliza duas classes de comandos:

1. Statement = um objeto que pode aceitar uma string que é um

comando SQL e executá-lo.

2. PreparedStatement = um objeto que possui um comando SQL

associado a ele, pronto para ser executado.

(6)

6

Criação de Comandos

Parâmetro da consulta, a ser definido na

chamada ao execute

A classe de conexão possui métodos para a criação de Statements e PreparedStatements.

Statement stat1 = myCon.createStatement();

PreparedStatement stat2 = myCon.prepareStatement(

”SELECT nome_refri, preco FROM Vendas ” +

”WHERE nome_lanch = ? ” );

(7)

7

Execução de Comandos SQL

O JDBC diferencia consultas e modificações, que ele chama de “updates.”

Tanto Statement quanto PreparedStatement possuem os métodos executeQuery e

executeUpdate.

Para Statements: um só argumento – a consulta ou modificação a ser realizada.

Para PreparedStatements: número de argumentos reflete os argumentos (“?”) existentes na string usada em sua criação.

(8)

8

Exemplo: Modificação

stat1 é um Statement.

Podemos usá-lo para inserir uma tupla, como em:

stat1.executeUpdate(

”INSERT INTO Vendas ” +

”VALUES(’Sujinhos’,’Dolli’,3.00)”

);

(9)

9

Exemplo: Consulta

stat2 é um PreparedStatement com a

consulta ”SELECT nome_refri, preco FROM Vendas WHERE nome_lanch = ?”.

executeQuery devolve um objeto da

classe ResultSet (sobre o qual veremos mais detalhes depois)

A consulta:

stat2.setString(1, “Sujinhos”);

ResultSet menu = stat2.executeQuery();

(10)

10

O Uso do ResultSet

Um objeto do tipo ResultSet é algo parecido com um cursor.

O método next() avança o “cursor” para a próxima tupla.

Na primeira vez em que o next() é aplicado, ele obtém a primeira tupla.

Se não há mais tuplas, next() devolve o valor false.

(11)

11

Acessando os Atributos de uma Tupla

Quando um ResultSet se refere a uma tupla, podemos obter os atributos dessa tupla executando determinados

métodos do ResultSet.

O método getX(i), where X é um tipo e i é o número do atributo, devolve o valor do atributo.

O valor precisa ser do tipo X.

(12)

12

Exemplo: Acessando Atributos

menu = ResultSet da consulta “SELECT nome_refri, preco FROM Vendas WHERE nome_lanch = ’Sujinhos’ ”.

Para obter o refri e o preço em cada tupla:

while ( menu.next() ) {

oRefri = menu.getString(1);

oPreco = menu.getFloat(2);

/* algum processamento envolvendo oRefri e oPreco */

}

(13)

13

Um parênteses:

Injeção de SQL

Consultas SQL frequentemente são construídas por programas.

Essas consultas podem envolver dados fornecidos como entrada por usuários.

Um código “descuidado” pode permitir que consultas maliciosas sejam

construídas e executadas.

(14)

14

Exemplo: Injeção de SQL

Relação Cartões(nome, senha, num_cartão).

Interface Web: obtém nome e senha do usuário, armazena-as nas strings n and s, constrói a consulta, executa-a e mostra o número da conta.

consulta = “SELECT num_cartão FROM Cartões WHERE login = '” + n +

“' AND senha = “ + s

(15)

15

Usuário (que não é o Bill Gates) Digita:

Login:

Senha:

O número do cartão é: 123.456.789.012

gates' --

qualquer uma

Comentário

em PostgreSQL

(16)

16 Tudo tratado como comentário!

A Consulta Executada

SELECT num_cartão FROM Cartões WHERE login = 'gates' --' AND senha = 'qualquer uma'

(17)

17

Exemplo 2: Injeção de SQL

(18)

18

Exemplo 3: Injeção de SQL

Bobby Tables: A guide to preventing SQL injection http://bobby-tables.com/

Fonte: xkcd (http://xkcd.com/327/)

(19)

19

Injeção de SQL

O uso do preparedStatement da JDBC evita problemas desse tipo

Num preparedStatement, os valores do tipo string atribuídos a parâmetros da consulta são “tratados” antes de serem passados ao BD

Veja um exemplo detalhado sobre isso em Java + JDBC em

http://www.journaldev.com/2489/jdbc-statement-vs-preparedstatement-sql-injection -example

(20)

20

Referências Bibliográficas

Slides Prof. Jeffrey Ullman, da Stanford University

Referência “oficial”

http://docs.oracle.com/javase/tutorial/jdbc/

Capítulo 6 do livro “Database Management Systems” (3rd edition), Ramakrishnan e Gehrke

Capítulo 13 do livro “Sistemas de Banco de Dados”

(6ª edição), Elmasri e Navathe

SQL Call Level Interface (CLI)

http://pubs.opengroup.org/onlinepubs/009654899/toc.pdf

Referências

Documentos relacionados

Este trabalho buscou, através de pesquisa de campo, estudar o efeito de diferentes alternativas de adubações de cobertura, quanto ao tipo de adubo e época de

17 CORTE IDH. Caso Castañeda Gutman vs.. restrição ao lançamento de uma candidatura a cargo político pode demandar o enfrentamento de temas de ordem histórica, social e política

A assistência da equipe de enfermagem para a pessoa portadora de Diabetes Mellitus deve ser desenvolvida para um processo de educação em saúde que contribua para que a

Foram realizados testes em garrafões de 20 litros para estabelecer critérios de operação e dimensionamento de uma planta de lixiviação em pilhas permanentes para tratar

Neste tipo de situações, os valores da propriedade cuisine da classe Restaurant deixam de ser apenas “valores” sem semântica a apresentar (possivelmente) numa caixa

Distribuição das respostas dos Ingressantes em cada alternativa das questões objetivas no Componente de Conhecimento Específico, considerando-se a IES, Categoria

The aim of the present work is an investigation of the clas- sical properties of the 4D theory obtained from the 5D (A)dS Chern–Simons theory by a Kaluza–Klein compactification,

 Caminho simples que contém todas as arestas do grafo (e,. consequentemente, todos os