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.





Deixe um comentário