Bancos de dados em Java

Aula
Estado
completo
notion image
  • A API JDBC possibilita que a aplicação seja construída independente do banco de dados utilizado. Qualquer banco que implemente essa API pode ser utilizado de forma intercambiável pela aplicação.
  • A Java Persistence API (JPA) é uma coleção de classes e métodos que ajudam a lidar com bancos de dados. Ela cria uma ponte entre classes Java e modelos relacionais (tabelas).
  • Na URL de conexão do banco de dados, primeiro é definido o driver que será utilizado pela aplicação e depois algumas informações que esse driver precisa para realizar a conexão.
    • Um driver é uma implementação da API JDBC específica para cada banco de dados. Alguns bancos possuem mais de uma implementação da API. As bibliotecas com a implementação da API devem ser dadas no momento de carregamento de classes da aplicação.
    • As informações que são passadas para na URL dependem do driver utilizado.
📌
É possível descobrir informações sobre a conexão de banco de dados em tempo de execução. A classe DatabaseMetaData possuí informações sobre suporte de funcionalidades, qual é o driver do banco, qual a versão, etc. Também existe a classe ResultSetMetaData com a qual são extraídas informações sobre quantidade de colunas, tipos, nomes, etc. do resultado de uma ação ao banco de dados.

Interfaces da JDBC API

notion image
  • A interface Connection representa uma sessão específica a um banco de dados e é utilizada para criar todos tipos de declarações (statements).
  • A interface CallableStatement representa chamadas para processos (procedures) e funções armazenadas no banco de dados.
  • Criar uma declaração de JDBC com a classe Statement não garante proteção contra injeção de SQL. Além disso, como os valores são inseridos através de concatenação, a declaração é recompilada a cada execução. Por esses motivos a classe Statement não é recomendada. (Deve-se utilizar a classe PreparedStatement ou CallableStatement, pois essas utilizam substituição de parâmetros.)
  • Todas interfaces da API JDBC implementam a interface AutoCloseable.
notion image
🚨
A ordem de encerramento das instâncias devem ser Connection, Statement e ResultSet. Se essa ordem não for respeitada, pode haver vazamento de memória.

Configurações

Quando temos uma conexão a algum banco e criamos um PrepraredStatement ou Statement, podemos passar algumas configurações sobre como o resultado será.
PreparedStatement ps = conn.prepareStatement( <SQL>, <ResultSetType>, <ResultSetConcurrency>, <ResultSetHoldability> );
📌
Algumas configurações não são suportadas por certos bancos de dados. Os métodos supportsResultSetType, supportsResultSetConcurrency e supportsResultSetHoldability, da classe DatabaseMetaData podem verificar esse suporte.

ResultSetType

Configura os métodos que poderão ser utilizados para navegar no ResultSet e como mudanças entregadas (committed) por outras declarações que ocorrem durante a leitura do ResultSet são refletidas no resultado.
TYPE_FORWARD_ONLY (valor padrão):
  • O único método disponibilizado no resultado será next().
  • A reflexão das mudanças depende do padrão do banco de dados.
  • Essa estratégia funciona em qualquer banco de dados.
TYPE_SCROLL_INSENSITIVE:
  • O resultado possuirá os métodos next(), previous(), first(), last(), absolute(int row) e relative(int row).
  • Utiliza a reflexão insensitiva. O que significa que o resultado não será atualizado com mudanças que ocorram durante sua leitura.
TYPE_SCROLL_SENSITIVE:
  • O resultado possuirá os mesmos métodos que TYPE_SCROLL_INSENSITIVE.
  • Utiliza a reflexão sensitiva. Com isso, mudanças feitas por outras declarações sobre os dados do resultado durante a leitura dos dados implicará em uma atualização do ResultSet.

ResultSetConcurrency

Controla possibilidade de alteração do conjunto de resultado.
  • CONCUR_READ_ONLY indica que um objeto ResultSet não pode ser alterado.
  • CONCUR_UPDATABLE indica que um objeto ResultSet pode ser alterado.

ResultSetHoldability

Configura o comportamento do ResultSet quando sua conexão realiza uma entrega (commit). O comportamento padrão depende de qual banco de dados está sendo utilizado.
  • HOLD_CURSORS_OVER_COMMIT indica que ainda será possível iterar sobre o conteúdo do resultado após alterações na mesma conexão forem entregues. (Idealmente deve ser utilizado com resultados read-only.)
  • CLOSE_CURSORS_AT_COMMIT indica que após alguma entrega ser realizada na conexão, essa encerra todos ResultSet. Em algumas aplicações esse comportamento pode aumentar a performance.