Web Services RESTful #6

Tempo de leitura: 18 min

Escrito por blackzig
em 13/04/2020

Utilizando o projeto criado nesse artigo, vamos conectá-lo ao banco de dados criado no artigo anterior.

Vou criar um novo pacote na pasta src com o nome de domain.

Vou criar uma classe com o nome BaseDAO no pacote domain. Nessa classe digite o seguinte código:

package br.com.micheladrianomedeiros.carros.domain;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 *
 * @author michel adriano medeiros
 */
public class BaseDAO {

    public BaseDAO() {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("ERRO BaseDAO " + e.getMessage());
        }
    }

    protected Connection getConnection() {
        Connection conn = null;
        try {
            String url = "jdbc:mysql://localhost/livro?serverTimezone=America/Sao_Paulo";
            conn = DriverManager.getConnection(url, "livro", "123");
        } catch (SQLException e) {
            System.out.println("Erro getConnection " + e.getMessage());
        }
        return conn;
    }

    public static void main(String[] args) {
        try {
            BaseDAO db = new BaseDAO();
            Connection conn = db.getConnection();
            System.out.println(conn);
        } catch (Exception e) {
            System.out.println("Erro main " + e.getMessage());
        }
    }

}

Modifique o arquivo pom.xml para ser adicionado o drive mysql no projeto.

<dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>8.0.1</version>
        <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.19</version>
    </dependency>
</dependencies>

Clique com o botão direito do mouse na pasta dependencies e escolha a opção Download Declared Dependencies, para baixar o drive.

Clique com o botão direito do mouse no arquivo BaseDAO e escolha a opção Run File.

Tentei utilizar o Java 14 mas não funcionou. O Java mais atual que funcionou foi o 9. Então, utilize o 8 ou o 9 para fazer o projeto.

Se tudo der certo a resposta no console vai ser parecido com essa.

Crie a classe Carro no pacote domain com o seguinte código:

package br.com.micheladrianomedeiros.carros.domain;

/**
 *
 * @author michel adriano medeiros
 */
public class Carro {

    private long id;
    private String nome;
    private String descricao;
    private String urlFoto;
    private String urlVideo;
    private String latitude;
    private String longitude;
    private String tipo;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getUrlFoto() {
        return urlFoto;
    }

    public void setUrlFoto(String urlFoto) {
        this.urlFoto = urlFoto;
    }

    public String getUrlVideo() {
        return urlVideo;
    }

    public void setUrlVideo(String urlVideo) {
        this.urlVideo = urlVideo;
    }

    public String getLatitude() {
        return latitude;
    }

    public void setLatitude(String latitude) {
        this.latitude = latitude;
    }

    public String getLongitude() {
        return longitude;
    }

    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    @Override
    public String toString() {
        return "Carro{" + "id=" + id + ", nome=" + nome + ", descricao="
                + descricao + ", urlFoto=" + urlFoto + ", urlVideo=" + urlVideo
                + ", latitude=" + latitude + ", longitude=" + longitude
                + ", tipo=" + tipo + '}';
    }

}

Crie um pacote com o nome tools e depois crie uma classe com o nome TratamentoConexao. Nessa classe digite o seguinte código:

package br.com.micheladrianomedeiros.carros.domain.tools;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author michel adriano medeiros
 */
public class TratamentoConexao {

    public static void fecharConexao(Connection con) {
        if (con != null) {
            try {
                con.close();
            } catch (SQLException ex) {
                Logger.getLogger(TratamentoConexao.class.getName())
                        .log(Level.SEVERE, null, ex);
            }
        }
    }

    public static void fecharConexaoEResultSet(Connection con, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException ex) {
                Logger.getLogger(TratamentoConexao.class.getName())
                        .log(Level.SEVERE, null, ex);
            }
        }
        fecharConexao(con);
    }

    public static void fecharConexaoEPreparedStatement(
            Connection con, PreparedStatement ps) {
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(TratamentoConexao.class.getName())
                        .log(Level.SEVERE, null, ex);
            }
        }
        fecharConexao(con);
    }

    public static void fecharConexaoEResultSetEPreparedStatement(
            Connection con, ResultSet rs, PreparedStatement ps) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException ex) {
                Logger.getLogger(TratamentoConexao.class.getName())
                        .log(Level.SEVERE, null, ex);
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                Logger.getLogger(TratamentoConexao.class.getName())
                        .log(Level.SEVERE, null, e);
            }
        }
        fecharConexao(con);
    }

}

Crie a classe CarroDAO no pacote domain com o seguinte código:

package br.com.micheladrianomedeiros.carros.domain;

import br.com.micheladrianomedeiros.carros.domain.tools.TratamentoConexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author michel adriano medeiros
 */
public class CarroDAO extends BaseDAO {

    String selectCarroWhere = "select * from carro where ";

    public Carro createCarro(ResultSet rs) {
        Carro c = new Carro();
        try {
            c.setId(rs.getLong("id"));
            c.setNome(rs.getString("nome"));
            c.setDescricao(rs.getString("descricao"));
            c.setUrlFoto(rs.getString("url_foto"));
            c.setUrlVideo(rs.getString("url_video"));
            c.setLatitude(rs.getString("latitude"));
            c.setLongitude(rs.getString("longitude"));
            c.setTipo(rs.getString("tipo"));
        } catch (SQLException e) {
            System.out.println("Erro createCarro " + e.getMessage());
        }
        return c;
    }

    public Carro getCarroById(long id) {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            stmt = conn.prepareStatement(selectCarroWhere + "id = ?");
            stmt.setLong(1, id);
            rs = stmt.executeQuery();
            if (rs.next()) {
                Carro c = createCarro(rs);
                return c;
            }
        } catch (SQLException e) {
            System.out.println("Erro getCarroById " + e.getMessage());
        } finally {
            TratamentoConexao
                    .fecharConexaoEResultSetEPreparedStatement(conn, rs, stmt);
        }
        return null;
    }

    public List<Carro> findByName(String name) {
        List<Carro> carros = new ArrayList<>();
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            stmt = conn.prepareStatement(selectCarroWhere + "nome like ?");
            stmt.setString(1, "%" + name + "%");
            rs = stmt.executeQuery();
            while (rs.next()) {
                Carro c = createCarro(rs);
                carros.add(c);
            }
        } catch (SQLException e) {
            System.out.println("Erro findByName " + e.getMessage());
        } finally {
            TratamentoConexao
                    .fecharConexaoEResultSetEPreparedStatement(conn, rs, stmt);
        }
        return carros;
    }

    public List<Carro> findByTipo(String tipo) {
        List<Carro> carros = new ArrayList<>();
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            stmt = conn.prepareStatement(selectCarroWhere + "tipo = ?");
            stmt.setString(1, tipo);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Carro c = createCarro(rs);
                carros.add(c);
            }
        } catch (SQLException e) {
            System.out.println("Erro findByTipo " + e.getMessage());
        } finally {
            TratamentoConexao
                    .fecharConexaoEResultSetEPreparedStatement(conn, rs, stmt);
        }
        return carros;
    }

    public List<Carro> getCarros() {
        List<Carro> carros = new ArrayList<>();
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            stmt = conn.prepareStatement("select * from carro");
            rs = stmt.executeQuery();
            while (rs.next()) {
                Carro c = createCarro(rs);
                carros.add(c);
            }
        } catch (SQLException e) {
            System.out.println("Erro getCarros " + e.getMessage());
        } finally {
            TratamentoConexao
                    .fecharConexaoEResultSetEPreparedStatement(conn, rs, stmt);
        }
        return carros;
    }

    public static long getGeneratedId(Statement stmt) {
        long id = 0L;
        try {
            ResultSet rs = stmt.getGeneratedKeys();
            if (rs.next()) {
                id = rs.getLong(1);
            }
        } catch (SQLException e) {
            System.out.println("Erro getGeneratedId " + e.getMessage());
        }
        return id;
    }

    public void save(Carro c) {
        Connection conn = null;
        PreparedStatement stmt = null;
        try {
            conn = getConnection();
            if (c.getId() == 0) {
                stmt = conn.prepareStatement("insert into carro "
                        + "values(0,?,?,?,?,?,?,?)",
                        Statement.RETURN_GENERATED_KEYS);
            } else {
                stmt = conn.prepareStatement("update carro set nome = ?, "
                        + "descricao = ?, url_foto = ?, url_video = ?, "
                        + "latitude = ?, longitude = ?, tipo = ? "
                        + "where id = ?");
            }
            stmt.setString(1, c.getNome());
            stmt.setString(2, c.getDescricao());
            stmt.setString(3, c.getUrlFoto());
            stmt.setString(4, c.getUrlVideo());
            stmt.setString(5, c.getLatitude());
            stmt.setString(6, c.getLongitude());
            stmt.setString(7, c.getTipo());
            if (c.getId() != 0) {
                stmt.setLong(8, c.getId());
            }
            int count = stmt.executeUpdate();
            if (count == 0) {
                System.out.println("Erro ao inserir o carro");
            }
            if (c.getId() == 0) {
                long id = getGeneratedId(stmt);
                c.setId(id);
            }
        } catch (SQLException e) {
            System.out.println("Erro save Carro " + e.getMessage());
        } finally {
            TratamentoConexao.fecharConexaoEPreparedStatement(conn, stmt);
        }
    }

    public boolean delete(long id) {
        boolean ok = false;
        Connection conn = null;
        PreparedStatement stmt = null;
        try {
            conn = getConnection();
            stmt = conn.prepareStatement("delete from carro where id = ?");
            stmt.setLong(1, id);
            int count = stmt.executeUpdate();
            ok = count > 0;
        } catch (SQLException e) {
            System.out.println("Erro delete carro " + e.getMessage());
        } finally {
            TratamentoConexao.fecharConexaoEPreparedStatement(conn, stmt);
        }
        return ok;
    }
}

Implementando o Data Access Object no Java EE

Crie um pacote com o nome services e dentro desse pacote crie uma classe com o nome CarroService e digite o seguinte comando:

package br.com.micheladrianomedeiros.carros.domain.services;

import br.com.micheladrianomedeiros.carros.domain.Carro;
import br.com.micheladrianomedeiros.carros.domain.CarroDAO;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author michel adriano medeiros
 */
public class CarroService {

    private final CarroDAO db = new CarroDAO();

    public List<Carro> getCarros() {
        try {
            List<Carro> carros = db.getCarros();
            return carros;
        } catch (Exception e) {
            return new ArrayList<>();
        }
    }

    public Carro getCarro(long id) {
        try {
            return db.getCarroById(id);
        } catch (Exception e) {
            return null;
        }
    }

    public boolean delete(long id) {
        try {
            return db.delete(id);
        } catch (Exception e) {
            return false;
        }
    }

    public boolean save(Carro carro) {
        try {
            db.save(carro);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public List<Carro> findByName(String name) {
        try {
            return db.findByName(name);
        } catch (Exception e) {
            return null;
        }
    }

    public List<Carro> findByTipo(String tipo) {
        try {
            return db.findByTipo(tipo);
        } catch (Exception e) {
            return null;
        }
    }

}

Vamos criar alguns testes, para ver se está tudo certo. Para isso, clique com o botão direito do mouse no pacote TestPackages e crie um JUnit Test.

Na próxima tela dê o nome da classe de CarroTest e no Package digite srctest.

Se você for até o arquivo pom.xml, você verá que tem novas dependências adicionadas. Apague todas as dependências adicionadas do junit e deixe dessa maneira:

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.6.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>8.0.1</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
    </dependencies>

Deve-se também adicionar o plugin maven-surefire-plugin. Veja como ficou os meus plugins:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M4</version>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>9</source>
                <target>9</target>
                <compilerArguments>
                    <endorseddirs>${endorsed.dir}</endorseddirs>
                </compilerArguments>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.3</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.2</version>
            <executions>
                <execution>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${endorsed.dir}</outputDirectory>
                        <silent>true</silent>
                        <artifactItems>
                            <artifactItem>
                                <groupId>javax</groupId>
                                <artifactId>javaee-endorsed-api</artifactId>
                                <version>7.0</version>
                                <type>jar</type>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Vou criar um teste para procurar alguns carros e ver se está tudo certo. O código ficou assim:

package srctest;

import br.com.micheladrianomedeiros.carros.domain.Carro;
import br.com.micheladrianomedeiros.carros.domain.services.CarroService;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;

/**
 *
 * @author michel adriano medeiros
 */
public class CarroTest {

    private CarroService carroService = new CarroService();

    @Test
    public void procurarCarros() {
        List<Carro> carros = carroService.getCarros();
        assertNotNull(carros);
        assertTrue(carros.size() > 0);
        Carro tucker = carroService.findByName("Tucker 1948").get(0);
        assertEquals("Tucker 1948", tucker.getNome());
        Carro ferrari = carroService.findByName("Ferrari FF").get(0);
        assertEquals("Ferrari FF", ferrari.getNome());
        Carro bugatti = carroService.findByName("Bugatti Veyron").get(0);
        assertEquals("Bugatti Veyron", bugatti.getNome());
    }

}

Para executar o teste, clique com o botão direito do mouse no arquivo de teste que se chama CarroTest e escolha a opção Test File.

Se estiver tudo certo, o resultado será esse:

Vamos criar um teste que salve um carro, busque os dados desse carro e modifique os dados, e por fim apague o carro. É o famoso CRUD. O método ficou assim:

    @Test
    public void crud() {
        //Criar carro (fase Create)
        Carro c = new Carro();
        c.setNome("Teste");
        c.setDescricao("teste descrição");
        c.setUrlFoto("url foto teste");
        c.setUrlVideo("url vídeo teste");
        c.setLatitude("lat teste");
        c.setLongitude("lon teste");
        c.setTipo("tipo teste");
        carroService.save(c);
        //Buscar carro salvo (fase Read)
        long id = c.getId();
        assertNotNull(id);
        c = carroService.getCarro(id);
        assertEquals("Teste", c.getNome());
        assertEquals("teste descrição", c.getDescricao());
        assertEquals("url foto teste", c.getUrlFoto());
        assertEquals("url vídeo teste", c.getUrlVideo());
        assertEquals("lat teste", c.getLatitude());
        assertEquals("lon teste", c.getLongitude());
        assertEquals("tipo teste", c.getTipo());
        //Atualiza dados do carro (fase Upadate)
        c.setNome("Teste UPDATE");
        carroService.save(c);
        //Verificar se realmente os dados foram atualizados
        c = carroService.getCarro(id);
        assertEquals("Teste UPDATE", c.getNome());
        //Deletar o carro (fase Delete)
        carroService.delete(id);
        //Buscar o carro para ver se foi realmente removido
        c = carroService.getCarro(id);
        //Confirmação de que o carro foi removido
        assertNull(c);
    }

Teste novamente, os dois métodos implementados devem estar corretos.

Agora está tudo certo.

Curso Java Para Iniciantes

Você vai gostar também:

Para enviar seu comentário, preencha os campos abaixo:

Deixe um comentário


*


*


Seja o primeiro a comentar!

Damos valor à sua privacidade

Nós e os nossos parceiros armazenamos ou acedemos a informações dos dispositivos, tais como cookies, e processamos dados pessoais, tais como identificadores exclusivos e informações padrão enviadas pelos dispositivos, para as finalidades descritas abaixo. Poderá clicar para consentir o processamento por nossa parte e pela parte dos nossos parceiros para tais finalidades. Em alternativa, poderá clicar para recusar o consentimento, ou aceder a informações mais pormenorizadas e alterar as suas preferências antes de dar consentimento. As suas preferências serão aplicadas apenas a este website.

Cookies estritamente necessários

Estes cookies são necessários para que o website funcione e não podem ser desligados nos nossos sistemas. Normalmente, eles só são configurados em resposta a ações levadas a cabo por si e que correspondem a uma solicitação de serviços, tais como definir as suas preferências de privacidade, iniciar sessão ou preencher formulários. Pode configurar o seu navegador para bloquear ou alertá-lo(a) sobre esses cookies, mas algumas partes do website não funcionarão. Estes cookies não armazenam qualquer informação pessoal identificável.

Cookies de desempenho

Estes cookies permitem-nos contar visitas e fontes de tráfego, para que possamos medir e melhorar o desempenho do nosso website. Eles ajudam-nos a saber quais são as páginas mais e menos populares e a ver como os visitantes se movimentam pelo website. Todas as informações recolhidas por estes cookies são agregadas e, por conseguinte, anónimas. Se não permitir estes cookies, não saberemos quando visitou o nosso site.

Cookies de funcionalidade

Estes cookies permitem que o site forneça uma funcionalidade e personalização melhoradas. Podem ser estabelecidos por nós ou por fornecedores externos cujos serviços adicionámos às nossas páginas. Se não permitir estes cookies algumas destas funcionalidades, ou mesmo todas, podem não atuar corretamente.

Cookies de publicidade

Estes cookies podem ser estabelecidos através do nosso site pelos nossos parceiros de publicidade. Podem ser usados por essas empresas para construir um perfil sobre os seus interesses e mostrar-lhe anúncios relevantes em outros websites. Eles não armazenam diretamente informações pessoais, mas são baseados na identificação exclusiva do seu navegador e dispositivo de internet. Se não permitir estes cookies, terá menos publicidade direcionada.

Visite as nossas páginas de Políticas de privacidade e Termos e condições.

Importante: Este site faz uso de cookies que podem conter informações de rastreamento sobre os visitantes.
Criado por WP RGPD Pro