Java - Introdução a banco de dados

Preview:

DESCRIPTION

Aula topico 1 topico 2

Citation preview

Sobre mim

Sérgio Souza CostaProfessor - UFMADoutor em Computação Aplicada (INPE)

prof.sergio.costa@gmail.com

https://sites.google.com/site/profsergiocosta/home

https://twitter.com/profsergiocosta

http://gplus.to/sergiosouzacosta

http://www.slideshare.net/skosta/presentations?order=popular

Introdução

• Sistemas computacionais compartilham algumas necessidades comuns

– Armazenar e recuperar informação (persistência)

– Interagir com o usuário

Introdução

• Sistemas computacionais compartilham algumas necessidades comuns

– Armazenar e recuperar informação (persistência)

– Interagir com o usuário

Persistência

Armazenar e recuperar informações eficientemente é em si um grande desafio.

Persistência

• Armazenar e recuperar informações eficientemente é em si um grande desafio.

• Nossas aplicações precisam resolver outros desafios específicos do problema.

• Persistência é um serviço oferecido por diversas empresas e instituições, como Oracle, Microsoft, GNU ( MySQL, Postgres) ..

JDBC

O Java disponibiliza o JDBC, um framework para acesso a diferentes servidores de Banco De Dados:

Tutorial

Primeiro desafio. Fazer uma agenda de contatos.

Onde você irá salvar os dados ?

Usarei um servidor de banco de dados, que é uma aplicação especializada para armazenar e recuperar dados

CREATE TABLE contato (

email text, nome text, telefone text

);

Primeiro, criar um banco e uma tabela em um dado SGBD. Por exemplo:

Como minha aplicação irá acessar o servidor ?

Em outras linguagens faço assim:1. Abro uma conexão com o meu servidor

de banco de dados 2. Depois uso o SQL para recuperar e

armazenar dados.

Porém, como fazer isso no Java ?Preciso pesquisar.

Pesquisando ...

Alguns minutos depois ...

Connection conn;String url = "jdbc:postgresql://localhost/contatos?user=postgres&password=postgres";try { conn = DriverManager.getConnection(url); System.out.println("conectado"); } catch(SQLException excecao) { throw new RuntimeException(excecao); }

Já sei como abrir uma conexão, mas não está funcionando :(

https://jdbc.postgresql.org/download/postgresql-42.1.1.jre6.jar

Faltou adicionar o drive do postgresql. Baixe no link abaixo:

Vá em propriedades do projeto, e depois aba “libraries”

Depois, click em “Add External JARs”

Biblioteca já adicionada.

Agora preciso saber como executar um SQL através do Java

Pesquisando ...

Alguns minutos depois ...

Já sei executar um SQL no servidor

String sql = "INSERT INTO contato(nome,email, telefone) VALUES(?,?, ?)"; try { PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, "sergio"); stmt.setString(2, "skosta@gmail.com"); stmt.setString(3, "123"); stmt.execute(); stmt.close(); System.out.print("inserido"); } catch (SQLException u) { throw new RuntimeException(u); }

Recuperar é o mesmo procedimento1. Abro uma conexão com o meu servidor

de banco de dados 2. Depois uso o SQL para recuperar os

dados .3. Depois manipula o resultado,

normalmente armazenado em um resultset

Pesquisando ...

Alguns minutos depois ...

String sql = "select * from contato"; try { PreparedStatement stmt = conn.prepareStatement(sql); ResultSet rs = stmt.executeQuery(); while (rs.next()) { System.out.println("Nome:"+rs.getString("nome")); System.out.println("Email:"+rs.getString("email")); } stmt.close(); } catch (SQLException u) { throw new RuntimeException(u); }

O que acharam das minhas aplicações Java ?

Podem testar funciona ☺

Funciona … porém não está utilizando os recursos da programação orientada a objetos

Em Java, nós usamos orientação objeto, você precisa pesquisar mais sobre este paradigma.

Como vocês resolveriam este problema ?

OK. Vou pesquisar mais um pouco ....

Pesquisando ...

Alguns minutos depois ...

Entendi, eu crio classes que definem responsabilidades.

Então já sei como melhorar minha aplicação

public class Contato {

private String nome; private String email;private String phone;

public Contato(String n, String e, String p) {this.nome = n;this.email = e;this.phone = p;

}public void salvaNoBanco () {….}

}

Faço uma classe contato que é responsável por salvá-la no banco ☺

public class CadastraContato {

public static void main(String[] args) {Contato contato = new Contato (”sergio",

skosta@gmail.com, “123”);contato .salvaNoBanco();

}

}

Depois basta instanciar um objeto e executar o método salvaNoBanco

Agora a solução ficou boa né ?

O que vocês acham ?

Está melhor, mas você não devia misturar codigo específico de banco de dados dentro da sua classe contato.

Ja OUVIU falar em POJO (Plain Old Java Objects) ?Mantenha sua classe contato simples, e delegue operações de banco de dados para outra classe

Esses desenvolvedores, nunca estão satisfeitos. Vou pesquisar mais um pouco

Pesquisando ...

Alguns minutos depois ...

Acho que já sei como resolver

1. Crio uma classe POJO2. Depois outra classe para

salvar no banco

public class Contato {

private String nome; private String email;private String telefone;

String getNome() {return nome;

}void setNome(String nome) {

this.nome = nome;}….

}

Minha classe POJO

public class ContatoDAO {private Connection connection;private String url =

"jdbc:postgresql://localhost/contatos?user=postgres&password=postgres";

public ContatoDAO() {try {

conn = DriverManager.getConnection(url); System.out.println("conectado"); } catch (SQLException excecao) {

throw new RuntimeException(excecao);}

}public void adiciona(Contato Contato) {….}

}

Minha classe DAO que salva no banco … abrindo conexão

public void adiciona(Contato Contato) {String sql = "INSERT INTO Contato(nome,email,telefone) VALUES(?,?,?)”try {

PreparedStatement stmt = connection.prepareStatement(sql);

stmt.setString(1, Contato.getNome());stmt.setString(2, Contato.getEmail());stmt.setString(3, Contato.getTelefone());stmt.execute();stmt.close();

} catch (SQLException u) {throw new RuntimeException(u);

}}

O Método que salva um contato no banco.

public class CadastraContato {public static void main(String[] args) {

Contato contato = new Contato();contato.setNome("sergio");contato.setEmail("skosta@gmail.com");contato.setTelefone("123");ContatoDAO dao = new ContatoDAO();dao.adiciona(contato);

}}

Então minha aplicação cliente precisa apenas ….

Parabéns ! Ficou muito melhor.

ATIVIDADE: Modifiquem a classe ContatoDAO, para permitir a recuperação dos dados.

O método irá retornar uma coleção de Contatos:

public List<Contato> recuperarContatos() {// codigo aqui

}

LaboratórioUm aplicativo de “Cadastro de Contatos” em Swing

Cadastro de contatos

• Montem a seguinte interface.

• Alterem o nome das variáveis referentes as caixas de textos e botões.

• Usem nomes sugestivos e sigam um “padrão”. Exemplo, btnCadastrar, btnLimpar, txtNome, txtEmail

Codifiquem a ação “Sair”, similar ao que fizemos na aulas sobre interface gráfica

Evitando fechamento acidental. Peça uma confirmação do usuário.

O Java oferece uma classe que cria este tipo de “caixas”, de mensagem, confirmação e entrada de

usuário.

private void btnSairActionPerformed(java.awt.event.ActionEvent evt)

{int confirm = JOptionPane.showConfirmDialog (this,

"Deseja Realmente fechar a aplicação?", "Sair - Confirmação",

JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (confirm == JOptionPane.YES_OPTION) { System.exit(1); }}

JOptionPane.showMessageDialog (null,"Montando uma caixa de Dialogo sem ícone","Mensagem",JOptionPane.PLAIN_MESSAGE );

int opcao = JOptionPane.showConfirmDialog (null,"Deseja terminar ?","Mensagem Final",JOptionPane.YES_NO_OPTION ,JOptionPane.QUESTION_MESSAGE )

String numero=JOptionPane.showInputDialog (null,"Digite uma informação qualquer”,"Entrada de dados",JOptionPane.QUESTION_MESSAGE );

Defina o “mnemonic” para cada botão. Facilita o uso direto pelo

teclado.

Codifique a ação limpar, como fizemos em aula passada.

Codifique a ação cadastrar. No fim da ação, mostre uma mensagem para o usuário que foi salva com

sucesso.

Vamos usar o banco de dados “contato”, o mesmo utilizado na

aula sobre banco de dados.

Além disso, usaremos a mesma estrutura. As classes Contato e

ContatoDao.

Contudo, faremos uma classe para abrir a conexão. A

ConnectionFactory

public class ConnectionFactory { public Connection getConnection() {

String url = "jdbc:postgresql://localhost/contatos?user=postgres&password=postgres";

try { return DriverManager.getConnection(url); } catch(SQLException excecao) { throw new RuntimeException(excecao); } }

A ConnectionFactory será usada no construtor da ContatoDAO.

public ContatoDAO() {connection = new

ConnectionFactory().getConnection();}

Depois de testado o aplicativo, substitua o textfield do telefone

por um formattedtextfield.

Inclua os imports ao código fonte e o código para configurar a

máscara em personalizar codigo.

MaskFormatter mascara; try { mascara = new MaskFormatter(

"(##)#####-####"); mascara.setPlaceholderCharacter('_'); fmttxtFone.setFormatterFactory (

new DefaultFormatterFactory(mascara)); } catch (ParseException ex) {}

import javax.swing.text.DefaultFormatterFactory;import javax.swing.text.MaskFormatter;

Recommended