Por que eu devo ler este artigo: Neste artigo veremos como utilizar a JDBC de forma prática. Para isso, construiremos uma aplicação de Agenda de Contatos que terá uma interface simples no estilo “linha de comando”, a qual desenvolveremos utilizando a biblioteca CLI do projeto Apache Commons.

Os bancos de dados estão presentes em grande parte das aplicações que desenvolvemos e é fundamental saber como criar uma aplicação que utilize essa tecnologia. A JDBC é a API que permite construir aplicações Java para bancos de dados.

O tema é útil para a criação ou manutenção de aplicações Java que utilizem bancos de dados. Conhecer os conceitos básicos da JDBC também ajuda o desenvolvedor a entender como funcionam os frameworks ORM, como Hibernate, TopLink, etc. que serão abordados em artigos futuros.

Na primeira parte do nosso artigo sobre JDBC – API Java para acesso a bases de dados –, explicamos seus conceitos e arquitetura geral, vimos os tipos de drivers suportados, e mostramos, através de pequenos trechos de código, como obter uma conexão JDBC, executar um comando SQL no banco de dados e manipular os resultados. Além disso, demos início à construção de uma agenda de contatos, como exemplo prático de projeto.

Nesta segunda parte do artigo, continuaremos o desenvolvimento do nosso projeto, vendo o restante das funcionalidades, bem como a interface com o usuário, que será feita utilizando linha de comando.

O projeto exemplo: Agenda de Contatos

Como já sabemos, nosso projeto exemplo trata-se de uma Agenda de Contatos. Vamos apenas relembrar as funcionalidades que nossa aplicação irá fornecer ao usuário:

  • Cadastrar nome, telefone e e-mail dos contatos;
  • Editar as informações do cadastro;
  • Listar os contatos;
  • Obter informações detalhadas de um contato;
  • Excluir um contato;
  • Buscar contatos pelo nome.

A Figura 1 mostra um diagrama com as classes da nossa aplicação.

Diagrama de classes do projeto
Figura 1. Diagrama de classes do projeto

Até então, criamos uma base de dados chamada test_jdbc em cada um dos SGBDs que iremos utilizar (MySQL e PostgreSQL) e a tabela contacts. Além disso, baixamos os jars dos drivers JDBC do MySQL e PostgreSQL, e também da biblioteca Apache Commons CLI (ver URLs para download na seção Links). Por fim, criamos um projeto no Eclipse, adicionando os jars citados no Build Path, e definimos as classes Contact, ConnectionHelper, e ContactJdbcDao, além da interface IContactDao.

Como podemos perceber na Listagem 1, a classe ContactJdbcDao só está com alguns métodos implementados, exatamente como a deixamos na primeira parte do artigo. Ainda faltam as implementações dos métodos list(), search(), update() e delete(). Nas próximas seções, proveremos uma implementação para cada um desses métodos e criaremos a classe responsável pela interface de linha de comando da aplicação.

O projeto completo, incluindo o modelo de classes e script de banco, pode ser baixado diretamente do site da Easy Java.

Listagem 1. Classe ContactJbdcDao

package br.com.easyjava.examples.mycontacts.dao.jdbc;
   
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
 
import br.com.easyjava.examples.mycontacts.bean.Contact;
import br.com.easyjava.examples.mycontacts.dao.IContactDao;
 
public class ContactJdbcDao implements IContactDao {
 
  public Contact insert(Contact contact) {
    Connection connection = null;
    PreparedStatement statement = null;
 
    try {
      connection = ConnectionHelper.getConnection();
 
      String sql = "INSERT INTO contacts (name, email, phone) VALUES (?, ?, ?)";
 
      statement = connection.prepareStatement(sql,
          Statement.RETURN_GENERATED_KEYS);
      statement.setString(1, contact.getName());
      statement.setString(2, contact.getEmail());
      statement.setString(3, contact.getPhone());
 
      statement.executeUpdate();
      ResultSet keys = statement.getGeneratedKeys();
 
      keys.next();
      long key = keys.getLong(1);
      keys.close();
 
      contact.setId(key);
    } catch (Exception e) {
      throw new RuntimeException("Error inserting contact.", e);
    } finally {
      releaseDatabaseResources(statement, connection);
    }
 
    return contact;
  }
 
  public Contact get(Long id) {
    Contact contact = null;
    Connection connection = null;
    PreparedStatement statement = null;
 
    try {
      connection = ConnectionHelper.getConnection();
 
      String sql = "SELECT * FROM contacts WHERE id = ?";
 
      statement = connection.prepareStatement(sql);
      statement.setLong(1, id);
 
      ResultSet resultSet = statement.executeQuery();
 
      if (resultSet.next()) {
        contact = new Contact();
        contact.setId(resultSet.getLong("id"));
        contact.setName(resultSet.getString("name"));
        contact.setEmail(resultSet.getString("email"));
        contact.setPhone(resultSet.getString("phone"));
      }
 
      resultSet.close();
    } catch (Exception e) {
      throw new RuntimeException("Error getting contact.", e);
    } finally {
      releaseDatabaseResources(statement, connection);
    }
 
    return contact;
  }
 
  public List<Contact> list() {
    return null;
  }
 
  public List<Contact> search(String name) {
    return null;
  }
 
  public void update(Contact contact) {
  }
 
  public void delete(Contact contact) {
  }
 
  private void releaseDatabaseResources(Statement statement,
      Connection connection) {
    try {
      statement.close();
    } catch (Exception e) {}
 
    try {
      connection.close();
    } catch (Exception e) {}
  }
 
} ... 

Quer ler esse conteúdo completo? Tenha acesso completo