Java - Introdução a
banco de dados
Prof: Sérgio Souza Costa
Sobre mim
Sérgio Souza Costa
Professor - UFMA
Doutor 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 procedimento
1. 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 POJO
2. 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ório
Um 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;

Java - Introdução a banco de dados

  • 1.
    Java - Introduçãoa banco de dados Prof: Sérgio Souza Costa
  • 2.
    Sobre mim Sérgio SouzaCosta Professor - UFMA Doutor 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
  • 3.
    Introdução • Sistemas computacionaiscompartilham algumas necessidades comuns – Armazenar e recuperar informação (persistência) – Interagir com o usuário
  • 4.
    Introdução • Sistemas computacionaiscompartilham algumas necessidades comuns – Armazenar e recuperar informação (persistência) – Interagir com o usuário
  • 5.
    Persistência Armazenar e recuperarinformações eficientemente é em si um grande desafio.
  • 6.
    Persistência • Armazenar erecuperar 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) ..
  • 7.
    JDBC O Java disponibilizao JDBC, um framework para acesso a diferentes servidores de Banco De Dados:
  • 8.
  • 9.
    Primeiro desafio. Fazer umaagenda de contatos.
  • 10.
    Onde você irásalvar os dados ?
  • 11.
    Usarei um servidorde banco de dados, que é uma aplicação especializada para armazenar e recuperar dados
  • 12.
    CREATE TABLE contato ( emailtext, nome text, telefone text ); Primeiro, criar um banco e uma tabela em um dado SGBD. Por exemplo:
  • 13.
    Como minha aplicaçãoirá acessar o servidor ?
  • 14.
    Em outras linguagensfaç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.
  • 15.
    Porém, como fazerisso no Java ? Preciso pesquisar.
  • 16.
  • 17.
  • 18.
    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 :(
  • 19.
  • 20.
    Vá em propriedadesdo projeto, e depois aba “libraries”
  • 21.
    Depois, click em“Add External JARs”
  • 22.
  • 23.
    Agora preciso sabercomo executar um SQL através do Java
  • 24.
  • 25.
  • 26.
    Já sei executarum 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); }
  • 27.
    Recuperar é omesmo procedimento 1. 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
  • 28.
  • 29.
  • 30.
    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); }
  • 31.
    O que acharamdas minhas aplicações Java ? Podem testar funciona ☺
  • 32.
    Funciona … porémnão está utilizando os recursos da programação orientada a objetos
  • 33.
    Em Java, nósusamos orientação objeto, você precisa pesquisar mais sobre este paradigma.
  • 34.
  • 35.
    OK. Vou pesquisarmais um pouco ....
  • 36.
  • 37.
  • 38.
    Entendi, eu crioclasses que definem responsabilidades. Então já sei como melhorar minha aplicação
  • 39.
    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 ☺
  • 40.
    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
  • 41.
    Agora a soluçãoficou boa né ? O que vocês acham ?
  • 42.
    Está melhor, masvocê não devia misturar codigo específico de banco de dados dentro da sua classe contato.
  • 43.
    Ja OUVIU falarem POJO (Plain Old Java Objects) ? Mantenha sua classe contato simples, e delegue operações de banco de dados para outra classe
  • 44.
    Esses desenvolvedores, nunca estãosatisfeitos. Vou pesquisar mais um pouco
  • 45.
  • 46.
  • 47.
    Acho que jásei como resolver 1. Crio uma classe POJO 2. Depois outra classe para salvar no banco
  • 48.
    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
  • 49.
    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
  • 50.
    public void adiciona(ContatoContato) { 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.
  • 51.
    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 ….
  • 52.
    Parabéns ! Ficoumuito melhor.
  • 53.
    ATIVIDADE: Modifiquem a classeContatoDAO, para permitir a recuperação dos dados. O método irá retornar uma coleção de Contatos: public List<Contato> recuperarContatos() { // codigo aqui }
  • 54.
  • 55.
    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
  • 56.
    Codifiquem a ação“Sair”, similar ao que fizemos na aulas sobre interface gráfica
  • 57.
    Evitando fechamento acidental.Peça uma confirmação do usuário.
  • 58.
    O Java ofereceuma 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); } }
  • 59.
    JOptionPane.showMessageDialog ( null, "Montando umacaixa 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 );
  • 60.
    Defina o “mnemonic”para cada botão. Facilita o uso direto pelo teclado.
  • 61.
    Codifique a açãolimpar, como fizemos em aula passada.
  • 62.
    Codifique a açãocadastrar. No fim da ação, mostre uma mensagem para o usuário que foi salva com sucesso.
  • 63.
    Vamos usar obanco de dados “contato”, o mesmo utilizado na aula sobre banco de dados.
  • 64.
    Além disso, usaremosa mesma estrutura. As classes Contato e ContatoDao.
  • 65.
    Contudo, faremos umaclasse 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); } }
  • 66.
    A ConnectionFactory seráusada no construtor da ContatoDAO. public ContatoDAO() { connection = new ConnectionFactory().getConnection(); }
  • 67.
    Depois de testadoo aplicativo, substitua o textfield do telefone por um formattedtextfield.
  • 68.
    Inclua os importsao 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;