Você está na página 1de 23

Desenvolvimento de Aplicaes de Banco de dados para Web com Java

Renato Campos Mauro


Msc COPPE/UFRJ Puzzle Sistemas de Informao / PUC-RJ

rmauro@puzzlenet.com.br

Java + BD + WEB
1 - Introduo Linguagem Java 2 - Tipos de Aplicao 3 - Execuo de Servlets / JSP 4 - JDBC 5 - SQLJ 6 - Agenda de Telefones 7 - Mais Informaes

1 - Introduo Linguagem Java


Porque Java? Java: Uma Linguagem Multiplataforma Processo de Compilao Arquivos JAR

1 - Introduo Linguagem Java


Porque Java? Java? Java: Uma Linguagem Multiplataforma Processo de Compilao Arquivos JAR

Smalltalk C / C++ COBOL Lisp Visual Basic Pascal

Fortran

Delphi

1 - Introduo Linguagem Java


Porque Java? Java: Java: Uma Linguagem Multiplataforma Processo de Compilao Arquivos JAR

Programa Programa Fonte Fonte( (.java .java) )

Executvel Executvel JVM JVM( (.class .class) )


Independente de Plataforma Dependente de Plataforma JAVA para Solaris

javac
( Compilador )

JAVA para Windows 95 JAVA para AS/400 JAVA para XPTO System

:Estao Sun :Pentium :IBM AS/400 :Xpto System

1 - Introduo Linguagem Java


Porque Java? Java: Uma Linguagem Multiplataforma Processo de Compilao Arquivos JAR

1 - Introduo Linguagem Java


Porque Java? Java: Uma Linguagem Multiplataforma Processo de Compilao Arquivos JAR
JAR = Java Archive Rene .class, .java, .gif, .jpg & etc em um nico arquivo compactado. Compatvel com pkzip ( jar = zip renomeado ) Vantagens: 1. Diminui o tamanho do projeto, 2. Em Applets diminui o trfego na rede, 3. Todas as dependncias ficam resolvidas em um nico arquivo.

Java - Linguagem OO
Classe X Objeto Herana Polimorfismo Encapsulamento Pacotes Pessoa
um ( uma )

Aluno

Funcionrio

abstract class Pessoa { private String nome; private int idade; public Pessoa( String nome, int idade ) { this.nome = nome; this.idade = idade; } public void mostraDados() { System.out.println( nome ); System.out.println( idade ); } }

Professor
abstract class Pessoa { } class Aluno extends Pessoa { } class Funcionario extends Pessoa { } class Professor extends Funcionario{ }

2 - Tipos de Aplicao Java

Aplicao Java

Executa diretamente sobre o S.O.

Executa em um "Container"

Aplicao Console Aplicao Janela

Applet Servlets JSP Stored Procedures

2 - Tipos de Aplicao Java

Aplicao Java

Executa diretamente sobre o S.O.

Executa em um "Container"

Aplicao Console Aplicao Janela

Applet Servlets JSP Stored Procedures

Aplicaes Console so aplicaes Java, que so executadas a partir da JVM instalada no S.O e seu resultado mostrado na tela do shell, sem recursos GUI. Ex.: Processamento Batch, Servidores TCP/IP.

2 - Tipos de Aplicao Java

Aplicao Java

Executa diretamente sobre o S.O.

Executa em um "Container"

Aplicao Console Aplicao Janela

Applet Servlets JSP Stored Procedures

Aplicaes Janela so aplicaes Java, que so executadas a partir da JVM instalada no S.O e seu resultado mostrado em uma Janela Grfica do sistema operacional utilizado. Concorrente de aplicaes VB, Delphi, etc...

2 - Tipos de Aplicao Java

Aplicao Java

Executa diretamente sobre o S.O.

Executa em um "Container"

Aplicao Console Aplicao Janela

Applet Servlets JSP Stored Procedures

Applets so Aplicaes em Java que rodam dentro de um navegador WEB compatvel com Java ( P. ex. I.Explorer ou Netscape ). Neste caso o Browser o Container.

2 - Tipos de Aplicao Java

Aplicao Java

Executa diretamente sobre o S.O.

Executa em um "Container"

Aplicao Console Aplicao Janela

Applet Servlets JSP Stored Procedures

Servlets so Aplicaes em Java que rodam dentro de um servidor WEB compatvel com Java. Servlets geram pginas HTML dinmicamente. O cliente pode, mas no precisa dar suporte Java.

Como Servlets Funcionam?


Requisio
GIF Hello PDF

Servidor WEB Contedo Dinmico Contedo Dinmico Repassa a Requisio

Executor de Servlets Contedo Dinmico Servlet Java Requisio

2 - Tipos de Aplicao Java

Aplicao Java

Executa diretamente sobre o S.O.

Executa em um "Container"

Aplicao Console Aplicao Janela

Applet Servlets JSP Stored Procedures

JSP - Java Server Pages. Assim como Servlets programas JSP so aplicaes em Java que geram contedo para WEB dinmicamente.

Como JSP Funciona


Requisio ( arquivo.jsp )

Servidor WEB Contedo Dinmico Contedo Dinmico Executor JSP Contedo Dinmico Script JSP Requisio Repassa a Requisio

JSP No EXISTE !
z
Todo Script em JSP convertido automaticamente em uma Servlet. O que de fato executado uma Servlet!

Como JSP Funciona


Incio

No

Servlet Criado

Sim

Sim
Criar Servlet

Servlet Desatualizado

No
Executar Servlet

Fim

2 - Tipos de Aplicao Java

XPTO ??

Aplicao Java

Executa diretamente sobre o S.O.

Executa em um "Container"

Aplicao Console Aplicao Janela

Applet Servlets JSP XPTO


XPTO

Stored Procedures

Como XPTO Funciona?


Requisio ( arquivo .xpto )

Servidor WEB Contedo Dinmico Contedo Dinmico Repassa a Requisio

Executor de XPTO Contedo Dinmico Programa XPTO Requisio

10

Servlet X JSP
JSP Tecnologias Associadas ASP Cold Fusion PHP Servlets

CGI

Filosofia

O programa em Java inserido dentro de pginas HTML

O HTML inserido dentro do programa em java.

Fcil de Fazer alteraes no HTML. Manuteno Armadilha! Colocar regras de negcio misturado gerao do HTML.

Difcil fazer modificaes no HTML.

Induz a uma melhor organizao do projeto.

Executores de Servlet e JSP


Mdulos integrveis ao servidor WEB, permitindo a execuo de Servlets e JSP. Exemplos:
Jakarta Tomcat ( Projeto Apache ) Apache Jserver ( verso anterior, no dava suporte jsp: apenas para Servlets ) Allaire Jrun

O Tomcat integrvel com o IIS da Microsoft e com o Apache. A configurao do Tomcat feita em Arquivos .XML O Tomcat gera automaticamente um arquivo .conf para integrar com o Apache. A integrao com IIS feita atravs da instalao de uma .dll redirecionadora e atravs da edio do Registro do Windows.

11

Estrutura Jakarta-Tomcat

.html .jsp .xpto

.class

.jar

2 - Tipos de Aplicao Java

Aplicao Java

Executa diretamente sobre o S.O.

Executa em um "Container"

Aplicao Console Aplicao Janela

Applet Servlets JSP Stored Procedures

Stored Procedures so programas executados tendo como container o SGBD. Cada banco de dados possui a sua prpria linguagem e API ( por exemplo PL/SQL, TSQL, etc ). Alguns bancos permitem escrever SP em Java.

12

Exemplo SP ( Oracle )
1 ) Escrever o programa Java para ser uma Stored Procedure respeitando a API do Oracle. 2 ) Compilar normalmente o programa ( gerando um .class ). 3 ) Carregar o .class para o Oracle com o comando LoadJava, fornecida junto com o banco. 4 ) Registrar a(s) funo(es) criadas. 5 ) Executar consultas chamando-se as funes registradas.

JDBC
Sigla para Java Database Connectivity. Padro de acesso a banco de dados relacionais atravs de Java.
Atravs de uma API comum os diversos banco de dados so acessados. Os fabricantes de Driver JDBC que so responsveis pela implementao dos aspectos especficos de um determinado banco. Permite um alto grau de portabilidade: A portabilidade no total devido no padronizao dos SQLs.

Qualquer tipo de aplicao Java pode acessar o banco de dados atravs de JDBC. JDBC bastante semelhante, em termos de arquitetura com o ODBC, com a diferena que escrito 100% em Java.

13

JDBC
Servlets JSP Applets

JDBC
DRIVER X DRIVER Y DRIVER DG

DBMS X

DBMS Y

DATA GATEWAY

Arquitetura 3 camadas

Servidor de Aplicao
Compatvel com JAVA

J D B C

Banco de Dados

14

Tipos de Driver JDBC


Classe 1
Ponte JDBC - ODBC: Somente funciona para aplicaes que rodam em Windows com o banco de dados registrado no ODBC Data Source

Aplicao JDBC Driver Manager ODBC Driver Manager Driver ODBC ( .dll )

Banco de Dados

Tipos de Driver JDBC


Classe 2
Acesso Nativo, utilizando as biblioteca do client do banco de dados em questo. Na mquina onde o programa em Java executado, necessita-se das bibliotecas especificas do fabricante.

Aplicao JDBC Driver Manager API Nativa do Banco ( C )

Banco de Dados

15

Tipos de Driver JDBC


Classe 3
Acesso por Midware. No h necessidade de configurao da mquina cliente. A aplicao se comunica com o Midware atravs de Socket. O Midware converte a chamada independente de banco para o banco de dados alvo de forma transparente para o cliente. Exemplos: CA-EDBC.

Aplicao JDBC Driver Manager Protocolo Prprio usando Sockets

REDE

Midware

Banco de Dados

Tipos de Driver JDBC


Classe 4
Acesso direto ao servidor, por TCP/IP utilizando-se o protocolo do prprio banco. Nenhuma configurao requerida na mquina onde a aplicao est sendo executada.

Aplicao JDBC Driver Manager Protocolo Prprio usando Sockets

REDE

Banco de Dados

16

Abrindo Conexo
import java. java.sql.*; sql.*; public class TesteConexao { public static void main( main(String args[]) args[]) { Connection c = null; null; try { String driver = "..."; String url = "..."; String usuario = "..."; String senha = "..."; Class. Class. forName( forName( driver ); c = DriverManager. DriverManager.getConnection( getConnection( url, url, usuario, usuario, senha ); System. System.out. out.println( println( "Conexo Aberta com sucesso!" ); // Executar Aqui as Consultas... c.close c.close(); (); } catch( catch( ClassNotFoundException ex ) { System. System.out. out.println( println( "Driver no Encontrado..." ); } catch( catch( SQLException ex ) { System. System.out. out.println( println( "Problemas com o banco..." ); System. System.out. out.println( println( ex. ex.getMessage() getMessage() ); System. System.out. out.println( println( ex. ex.getErrorCode() getErrorCode() ); } } }

Alguns Drivers / URLs

Banco ODBC ORACLE MYSQL

Driver sun.jdbc.odbc.JdbcOdbcDriver oracle.jdbc.driver.OracleDriver org.gjt.mm.mysql.Driver

URL jdbc:odbc:<DSN> jdbc:oracle:thin:@<IP>:<PORTA>:<SID> jdbc:mysql://<IP>/<banco>

Para outros bancos, consultar a documentao especfica...

17

Exemplo Access
import java. java.sql.*; sql.*; public class TesteConexao { public static void main( main(String args[]) args[]) { Connection c = null; null; try { String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; String url = "jdbc:odbc:scott"; String usuario = ""; String senha = ""; Class. Class. forName( forName( driver ); c = DriverManager. DriverManager.getConnection( getConnection( url, url, usuario, usuario, senha ); System. System.out. out.println( println( "Conexo Aberta com sucesso!" ); // Executar Aqui as Consultas... c.close c.close(); (); } catch( catch( ClassNotFoundException ex ) { System. System.out. out.println( println( "Driver no Encontrado..." ); } catch( catch( SQLException ex ) { System. System.out. out.println( println( "Problemas com o banco..." ); System. System.out. out.println( println( ex. ex.getMessage() getMessage() ); System. System.out. out.println( println( ex. ex.getErrorCode() getErrorCode() ); } } }

Exemplo Oracle
import java. java.sql.*; sql.*; public class TesteConexao { public static void main( main(String args[]) args[]) { Connection c = null; null; try { String driver = "oracle.jdbc.driver.OracleDriver"; String url = "jdbc:oracle:thin:@localhost:1521:orcl"; String usuario = "pim"; String senha = "pim"; Class. Class. forName( forName( driver ); c = DriverManager. DriverManager.getConnection( getConnection( url, url, usuario, usuario, senha ); System. System.out. out.println( println( "Conexo Aberta com sucesso!" ); // Executar Aqui as Consultas... c.close c.close(); (); } catch( catch( ClassNotFoundException ex ) { System. System.out. out.println( println( "Driver no Encontrado..." ); } catch( catch( SQLException ex ) { System. System.out. out.println( println( "Problemas com o banco..." ); System. System.out. out.println( println( ex. ex.getMessage() getMessage() ); System. System.out. out.println( println( ex. ex.getErrorCode() getErrorCode() ); } } }

18

Exemplo MySQL
import java. java.sql.*; sql.*; public class TesteConexao { public static void main( main(String args[]) args[]) { Connection c = null; null; try { String driver = "org.gjt.mm.mysql.Driver"; String url = "jdbc:mysql://127.0.0.1/ecomm"; String usuario = ""; String senha = ""; Class. Class. forName( forName( driver ); c = DriverManager. DriverManager.getConnection( getConnection( url, url, usuario, usuario, senha ); System. System.out. out.println( println( "Conexo Aberta com sucesso!" ); // Executar Aqui as Consultas... c.close c.close(); (); } catch( catch( ClassNotFoundException ex ) { System. System.out. out.println( println( "Driver no Encontrado..." ); } catch( catch( SQLException ex ) { System. System.out. out.println( println( "Problemas com o banco..." ); System. System.out. out.println( println( ex. ex.getMessage() getMessage() ); System. System.out. out.println( println( ex. ex.getErrorCode() getErrorCode() ); } } }

Exemplo Select 1
Class.forName( driver ); c = DriverManager.getConnection( url, usuario, senha ); String sql = "SELECT cod_produto, dsc_produto FROM produto"; Statement stm = c.createStatement(); ResultSet rs = stm.executeQuery( sql ); while( rs.next() ) { System.out.println( "Codigo......: + rs.getInt( "cod_produto" ) ); System.out.println( "Descricao...: " + rs.getString( "dsc_produto" ) ); } rs.close(); stm.close(); c.close();

1) Obter Conexo 2) Criar Statement a partir da conexo 3) Executar Consulta 4) Percorrer Cursor ( ResultSet ) 5) Pega os campos desejados com get<TIPO> ( <NOME CAMPO> )

19

Exemplo Select 2
Class.forName( driver ); c = DriverManager.getConnection( url, usuario, senha ); String sql = "SELECT cod_produto, dsc_produto FROM produto" + " WHERE cod_produto = ?"; PreparedStatement stm = c.prepareStatement( sql ); int codigo = Integer.parseInt( args[0] ); stm.setInt( 1, codigo ); ResultSet rs = stm.executeQuery(); while( rs.next() ) { System.out.println( "Codigo......: " + rs.getInt( "cod_produto" ) ); System.out.println( "Descricao...: " + rs.getString( "dsc_produto" ) ); } rs.close(); stm.close(); c.close();

SQL com parmetros ( ? ) Antes de executar, deve-se definir o valor dos parmetros

Consulta ao Metadados
Dado um SQL qualquer, podemos em tempo de execuo descobrir:
quantas colunas a consulta resultou, o nome de cada coluna, o tipo de cada coluna, dentre outras informaes

Dado um ResultSet ( cursor ) podemos chamar o mtodo rs.getMetaData(), que retorna um objeto da classe ResultSetMetadata. Este objeto tem os seguintes mtodos:
getColumnCount() -- Quantas colunas getColumnName( int pos ) -- Nome da coluna pos getCoumnTypeName( int pos ) -- Tipo da coluna pos

20

Exemplo - Metadados
String sql = "SELECT cod_produto, dsc_produto FROM produto"; Statement stm = c.createStatement(); ResultSet rs = stm.executeQuery(sql); ResultSetMetaData rsmd = rs.getMetaData(); System.out.println( "Numero de Colunas: " + rsmd.getColumnCount() ); while( rs.next() ) { for( int i = 1; i <= rsmd.getColumnCount(); i++ ) { System.out.print( rsmd.getColumnName(i) ); System.out.print( "(" ); System.out.print( rsmd.getColumnTypeName(i) ); System.out.print( ")" ); System.out.print( "=" ); System.out.println( rs.getString(i) ); } } rs.close(); stm.close();

Aplicao Prtica - ISQL

ISQL

21

Consulta Atualizao
String sql = " UPDATE produto SET PRECO = ? " + " WHERE cod_produto = ?"; PreparedStatement stm = c.prepareStatement( sql ); int preco = Integer.parseInt( args[0] ); int codigo = Integer.parseInt( args[1] ); stm.setInt( 1, codigo ); stm.setInt( 2, preco ); int quant = stm.executeUpdate(); System.out.println( "Registros Atualizados: " + quant ); stm.close();

SQLJ
Utilizao de SQL como se fosse parte da linguagem Um pr-compilador transforma o fonte .sqlj em .java O programa Java Gerado usa JDBC para acessar o banco.

Class.forName( driver ); DefaultContext.setDefaultContext(new DefaultContext( url, usuario, senha )); int codigo = Integer.parseInt( args[0] ); int preco = Integer.parseInt( args[0] ); #sql { update produto set preco = :preco where codigo = :codigo }

22

Agenda - Modelo de Dados


SQL> create table Agenda ( 2 codigo numeric(4), 3 nome varchar(40), 4 email varchar(40), 5 telefone varchar(30) 6 ); Tabela criada. SQL> create sequence sq_agenda; Seqncia criada. SQL> alter table Agenda 2 add constraint pk_agenda 3 primary key ( codigo ); Tabela alterada.

Renato Campos Mauro rmauro@puzzlenet.com.br

Slides e Programas fontes podem ser baixados de http://www.puzzlenet.com.br/sbbd2001

23

Você também pode gostar