Cursos / Informática para Internet / Desenvolvimento Web II / Aula

arrow_back Aula 10 - Projeto (Parte 1): Incorporando o Banco de Dados

Implementar a Classe RepositorioLivrosJDBC

Todo o acesso aos dados dos livros será feito pela classe RepositorioLivrosJDBC. Nesta classe, os livros não serão armazenados em memória (como era feito antes, usando-se uma lista do tipo List<Livro>).   Os pontos a seguir detalham o passo a passo que deve ser feito para implementar essa nova classe.

  1. Crie um nova classe chamada GerenciadorDeConexoes em um novo pacote chamado “livraria.bd”. Essa classe será responsável por carregar o driver e abrir a conexão com o banco de dados. Nesta classe, você deve criar um método para fazer essa ação, conforme foi aprendido na disciplina de Banco de Dados e mostrado no trecho de código a seguir.
x
1
public static java.sql.Connection getConexao() { 
2
3
      Connection connection = null;// atributo do tipo Connection 
4
      String driverName = "com.mysql.cj.jdbc.Driver"; 
5
      String serverName = "localhost";// caminho do servidor do BD 
6
      String mydatabase = "livraria";// nome do seu banco de dados 
7
      String url = "jdbc:mysql://" + serverName + "/" + mydatabase; 
8
      url += "?serverTimezone=UTC"; // Adicione/remova essa linha se tiver problemas em conectar com seu servidor MySQL
9
      String username = "root";// nome de um usuário de seu BD       
10
      String password = "123456";// sua senha de acesso 
11
12
      try { 
13
            Class.forName(driverName);
14
            connection = DriverManager.getConnection(url, username, password);
15
      } catch (Exception e) { 
16
            e.printStackTrace();
17
      }
18
      return connection;
19
}
  1. Adicione um método main nesta classe para testar se sua classe consegue estabelecer a conexão com o banco de dados. Lembre também de adicionar os comandos “import java.sql.Connection;” e “import java.sql.DriverManager;” no início da classe. Confira também se o nome do banco, usuário e senha do banco que criou estão corretos. Depois desse métod adicionado sua classe GerenciadorDeConexoes deve ter o seguinte código completo:
30
1
package livraria.bd;
2
3
import java.sql.Connection;
4
import java.sql.DriverManager;
5
6
public class GerenciadorDeConexoes {
7
public static java.sql.Connection getConexao() { 
8
9
          Connection connection = null;// atributo do tipo Connection 
10
          String driverName = "com.mysql.cj.jdbc.Driver"; 
11
          String serverName = "localhost";// caminho do servidor do BD 
12
          String mydatabase = "livraria";// nome do seu banco de dados 
13
          String url = "jdbc:mysql://" + serverName + "/" + mydatabase; 
14
          url += "?serverTimezone=UTC"; // Adicione/remova essa linha se tiver problemas em conectar com seu servidor MySQL
15
          String username = "root";// nome de um usuário de seu BD       
16
          String password = "123456";// sua senha de acesso 
17
18
          try { 
19
                Class.forName(driverName);
20
                connection = DriverManager.getConnection(url, username, password);
21
          } catch (Exception e) { 
22
                e.printStackTrace();
23
          }
24
          return connection;
25
    }
26
    
27
    public static void main(String[] args) { 
28
        Connection conexao = getConexao();
29
    }
30
}
  1. Crie a classe RepositorioLivrosJDBC dentro do pacote livraria.bd, com os métodos:
    • Construtor: Instancia uma variável de conexão utilizando o GerenciadorDeConexoes
    • public Livro getLivro(String idLivro): Obtém do banco o livro com o código passado por parâmetro
    • public List<Livro> getLivros(): Obtém do banco todos os livros
    • public int atualizaLivro(String idLivro, Livro livro): Atualiza os dados no banco de um livro originalmente com o idLivro passado e com os valores dos campos igual aos atributos do objeto livro também passado por parâmetro e com seus atributos diferentes dos que estão no banco de dados.
    • public static void main(String[] args): Método de testes para os recursos implementados.

O código do RepositorioLivrosJDBC deve ficar assim:

140
1
package livraria.bd;
2
3
import java.sql.Connection;
4
import java.sql.PreparedStatement;
5
import java.sql.ResultSet;
6
import java.sql.SQLException;
7
import java.util.ArrayList;
8
import java.util.List;
9
10
import livraria.negocio.Livro;
11
import livraria.negocio.excecoes.LivroNaoEncontradoException;
12
13
public class RepositorioLivrosJDBC {
14
    private Connection conexaoBD; 
15
    public RepositorioLivrosJDBC() {
16
        this.conexaoBD = GerenciadorDeConexoes.getConexao();
17
    }
18
19
    public Livro getLivro (String idLivro) throws LivroNaoEncontradoException {
20
21
        Livro livro = null;
22
23
        try {
24
            //1. Executa a consulta SQL pra recuperar o livro com esse id
25
            PreparedStatement st;
26
            st = this.conexaoBD.prepareStatement("SELECT * FROM livros WHERE idLivro=?");
27
            st.setString(1, idLivro);
28
            ResultSet result = st.executeQuery();
29
            
30
            //2. Recupera cada um dos campos do livro, a partir do objeto ResultSet
31
            if (result.first()) {   
32
                //3. Instancia o livro com os valores que foram recuperados
33
                livro = new Livro();
34
                livro.setIdLivro(result.getString("idLivro"));
35
                livro.setTitulo(result.getString("titulo"));
36
                livro.setAutores(result.getString("autores"));
37
                livro.setAno(result.getInt("ano"));
38
                livro.setPreco(result.getDouble("preco"));
39
                livro.setQuantidade(result.getInt("quantidade"));
40
                livro.setDescricao(result.getString("descricao"));
41
            }
42
            st.close();
43
        } catch (SQLException e) {
44
            e.printStackTrace();
45
            throw new LivroNaoEncontradoException("Não foi possível encontrar o livro: " + idLivro);
46
        }       
47
48
        return livro;
49
    }
50
51
    public List<Livro> getLivros() {
52
      
53
        List<Livro> livros = new ArrayList<Livro>();
54
        try {
55
            //1. Executa a consulta SQL pra recuperar todos os livros
56
            PreparedStatement st;
57
            st = this.conexaoBD.prepareStatement("SELECT * FROM livros");
58
            ResultSet result = st.executeQuery();
59
            
60
            //2. Para cada livro que for retornado como resultado:
61
            //a. Recupera cada um dos campos do livro, a partir do objeto ResultSet
62
            while (result.next()) {
63
                
64
                //b. Instancia um livro com os valores que foram recuperados
65
                Livro livro = new Livro();
66
                
67
                livro.setIdLivro(result.getString("idLivro"));
68
                livro.setTitulo(result.getString("titulo"));
69
                livro.setAutores(result.getString("autores"));
70
                livro.setAno(result.getInt("ano"));
71
                livro.setPreco(result.getDouble("preco"));
72
                livro.setQuantidade(result.getInt("quantidade"));
73
                livro.setDescricao(result.getString("descricao"));
74
                
75
                //c. Adiciona na lista de livros:);
76
                livros.add(livro);
77
            }
78
        } catch (SQLException e) {
79
            e.printStackTrace();
80
        }
81
        
82
        return livros;
83
    }
84
    
85
    public int atualizaLivro(String idLivro, Livro livro) {
86
        int result = 0;
87
        try {
88
            //1. Executa a consulta SQL pra recuperar o livro com esse id
89
            PreparedStatement st;
90
            st = this.conexaoBD.prepareStatement("UPDATE livros SET idLivro=?, titulo=?, autores=?, ano=?, preco=?, quantidade=?, descricao=? WHERE idLivro=?");
91
            st.setString(1, idLivro);
92
            st.setString(2, livro.getTitulo());
93
            st.setString(3, livro.getAutores());
94
            st.setInt(4, livro.getAno());
95
            st.setDouble(5, livro.getPreco());
96
            st.setInt(6, livro.getQuantidade());
97
            st.setString(7, livro.getDescricao());
98
            st.setString(8, livro.getIdLivro());
99
            result = st.executeUpdate();
100
        } catch (SQLException e) {
101
            e.printStackTrace();
102
        }
103
        
104
        return result;
105
    }
106
107
    
108
    // Método main de teste
109
    public static void main(String[] args) { 
110
        RepositorioLivrosJDBC repositorioLivros = new RepositorioLivrosJDBC();
111
        try {
112
            Livro livro = repositorioLivros.getLivro("0596005407");
113
            System.out.println(livro.getTitulo());
114
            
115
        } catch (LivroNaoEncontradoException e) {
116
            System.out.println("Livro não encontrado");
117
        }
118
        
119
        try {
120
            List<Livro> livros = repositorioLivros.getLivros();
121
            for (Livro livro : livros) {
122
                System.out.println("Livro: " + livro.getTitulo());
123
            }
124
        } catch(Exception e) {
125
            System.out.println(e.getMessage());
126
        }
127
        
128
        try {
129
            String idLivro = "0596005407";
130
            Livro livro = repositorioLivros.getLivro(idLivro);
131
            livro.setQuantidade( livro.getQuantidade() - 1);
132
            int resultado = repositorioLivros.atualizaLivro(idLivro, livro);
133
            if (resultado > 0) {
134
                System.out.println("Livro atualizado");
135
            }
136
        } catch (Exception e) {
137
            System.out.println(e.getMessage());
138
        }
139
    }
140
}
  1. Realize o teste executando essa classe como um Aplicativo Java e veja o resultado no console do Eclipse como a figura abaixo:
    Figura 05 - Resultado no console.
    Resultado no console.

Versão 5.3 - Todos os Direitos reservados