O documento apresenta uma introdução sobre sistemas computacionais e suas necessidades comuns de armazenar e recuperar informações de forma eficiente. Em seguida, discute sobre a persistência de dados e o framework JDBC no Java para acesso a bancos de dados. Por fim, apresenta um tutorial passo a passo sobre como desenvolver uma agenda de contatos usando banco de dados no Java.
2. 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
3. Introdução
• Sistemas computacionais compartilham algumas
necessidades comuns
– Armazenar e recuperar informação (persistência)
– Interagir com o usuário
4. Introdução
• Sistemas computacionais compartilham algumas
necessidades comuns
– Armazenar e recuperar informação (persistência)
– Interagir com o usuário
6. 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) ..
7. JDBC
O Java disponibiliza o JDBC, um framework para acesso a diferentes servidores de
Banco De Dados:
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 :(
26. 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);
}
27. 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
38. Entendi, eu crio classes 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
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(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.
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 ….
53. 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
}
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
58. 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);
}
}
59. 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
);
65. 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);
}
}
66. A ConnectionFactory será usada
no construtor da ContatoDAO.
public ContatoDAO() {
connection = new
ConnectionFactory().getConnection();
}
67. Depois de testado o aplicativo,
substitua o textfield do telefone
por um formattedtextfield.
68. 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;