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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
<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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
@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