Article image
Caio Oliveira
Caio Oliveira24/05/2023 08:42
Compartilhe

Banco de Dados Relacionais em Java

  • #SQL
  • #Java

Escrevi esse artigo com o objetivo de esclarecer algumas coisas no que diz respeito ao uso de bancos de dados em aplicações Java. Espero que esse artigo seja de grande ajuda para vocês. Let's Code!

O que é um Banco de dados?

Basicamente, banco de dados é um sistema que executa 3 tarefas básicas no que diz respeito à informação estruturada:

  • Armazenar (Guardar informação)
  • Gerenciar (Manipular informação)
  • Recuperar (Buscar informação)

Meu objetivo neste artigo é falar sobre os Bancos de Dados pelos Bancos de Dados Relacionais (SQL), até porque, só assim é possível entender oque motivou a criação dos bancos de dados NoSQL.

O que é um banco de dado Relacional?

É um banco de dados que segue um modelo baseado nas regras do A.C.I.D e se utilizam de uma liguagem padronizada para consultas (SQL - Structured Query Language).

Além disso, bancos SQL se utilizam do conceito de TRANSAÇÃO, que nada mais é que uma unidade de trabalho. Dentro de uma transação eu posso ter várias operações as quais são realizadas dentro do contexto transacional.

Ex:

TRANSAÇÃO_1{OPERAÇÃO_1,OPERAÇÃO_2,OPERAÇÃO_3,...., OPERAÇÃO_N}

Mas beleza Caio, oque é o ACID?

São Propriedades para garantir 3 coisas:

  • Consistencia da informação
  • Integridade dos dados
  • Confiabilidade

(A) Atomicidade: A atomicidade garante que uma transação seja tratada como uma unidade indivisível de trabalho. Isso significa que uma transação é executada com sucesso na íntegra ou, se ocorrer algum erro, ela é completamente desfeita (rollback) e nenhum efeito é persistido no banco de dados. Isso garante que o banco de dados permaneça em um estado consistente.

(C) Consistência: A consistência garante que, após uma transação ser concluída, o banco de dados esteja em um estado válido, de acordo com as restrições e regras da tabela persistida no Banco de Dados. Isso implica que as transações devem preservar a integridade dos dados, respeitando as restrições de chave primária, chave estrangeira, regras de validação e outros critérios definidos.

(I) Isolamento: O isolamento nos diz que cada transação deve ser executada de forma isolada e independente umas das outras. Isso evita problemas de concorrência, pois uma transação não interfere no resultado de outra.

(D) Durabilidade: A durabilidade garante que uma vez que uma transação seja confirmada (commit), suas alterações permaneçam persistentes mesmo em caso de falhas de hardware, quedas de energia ou reinicialização do sistema. 

Quando Flexibilizamos algumas dessas características do A.C.I.D, nós temos os chamados Bancos Não-Relacionais, mas isso é assunto pra outro artigo..

Agora que sabemos como funcionam os bancos de dados Relacionais, iremos entender como funciona a comunicação da nossa aplicação Java com esses bancos!

JDBC:

O JDBC nada mais é que uma API Java (java.sql) que fornece classes pra integração com os mais diversos bancos de dados SQL. Qualquer aplicação Java que se conecta a um banco de dados relacional utiliza o JDBC em seu background.

No princípio, era complicado salvar Objetos em Databases, pois havia pouca padronização e regras de como uma API devia ser feita para realizar a comunicação com os bancos de dados. Com o intiuito de simplicar as coisas para o desenvolvedor, criou-se a técnica ORM

ORM (Object-Relational Mapping)

Em poucas palavras, a ORM é uma técnica que permite o mapeamento de objetos de um sistema orientado à objetos para entidades do banco de dados

Ex:

      ObjetoCriado.class -> Tabela_Do_Objeto

Inicialmente, as ORM's eram feitas manualmente através de uma classe DAO (Data Access Object) que nada mais é que uma classe que faz o mapeamento entre uma classe de objetos e as utiliza para realizar operações de um banco de dados. Irei mostrar um "pequeno" exemplo de como isso era feito antigamente:

Ex:

  public class Cliente {
		private int id;
		private String nome;
		private String email;

		// Getters e Setters
		// ...
		}

  

  import java.sql.*;

  public class ClienteDAO {

    	private Connection connection;
    	
      public ClienteDAO(Connection connection) {
  		this.connection = connection;
		}

		public void insert(Cliente cliente) throws SQLException {
  		String sql = "INSERT INTO clientes (nome, email) VALUES (?, ?)";
  		try (PreparedStatement statement = connection.prepareStatement(sql)) {
    			statement.setString(1, cliente.getNome());
    			statement.setString(2, cliente.getEmail());
    			statement.executeUpdate();
  			}
		}
		

		public Cliente findById(int id) throws SQLException {
  		String sql = "SELECT * FROM clientes WHERE id = ?";
  		try (PreparedStatement statement = connection.prepareStatement(sql)) {
    			statement.setInt(1, id);
    			try (ResultSet resultSet = statement.executeQuery()) {
      			if (resultSet.next()) {
        				Cliente cliente = new Cliente();
        				cliente.setId(resultSet.getInt("id"));
        				cliente.setNome(resultSet.getString("nome"));
        				cliente.setEmail(resultSet.getString("email"));
        				return cliente;
      				}
    				}
  			}
  			return null;
			}
      }

  

Acho que a essa altura, você, caro leitor, percebeu como era complicado fazer essa modelagem né? Com o objetivo de facilitar a implementação das ORMs, surgiram algumas especificações para criação de ORMs em bancos de dados relacionais, e neste artigo, me limitarei a falar sobre a especificação JPA.

JPA

A JPA é uma especificação (assim como a ISO) que tem como ideia, abstrair os detalhes de implementação da comunicação com o banco, deixando o desenvolvedor focado apenas na parte de negócios.

Mas beleza Caio, como eu faço pra implementar o JPA na minha aplicação? É aí que entram os Frameworks da especificação JPA, e o mais famoso deles, o Hibernate 

HIBERNETE

O Hibernate, significou um grande avanço no que diz respeito à produtividade, trazendo algumas features que facilitam significativamente a vida do desenvolvedor, como as listadas abaixo:

  • Trouxe as famosas annotaions de banco de dados @Id, @Entity, @Table, @Column, @OneToMany, ...
  • As conexões com o banco, agora são feitas através de um arquivo xml (hibernate.cfg.xml)

É importante ressaltar, que o Spring-Data-JPA se utiliza do Hibernate para executar a ORM.

Conclusão

Espero que esse artigo tenha esclarecido suas dúvidas sobre essa verdadeira sopa de letrinhas [JPA, Hibernate, ORM,JDBC]. Quaisquer dúvidas, estou à disposição.

That's All Folks!

Compartilhe
Comentários (1)

FN

Francisco Neto - 24/05/2023 08:48

Obrigado pelo artigo bem sucinto, me ajudou a entender melhor.