
- 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

- A interface
Connectionrepresenta uma sessão específica a um banco de dados e é utilizada para criar todos tipos de declarações (statements).
- A interface
CallableStatementrepresenta chamadas para processos (procedures) e funções armazenadas no banco de dados.
- Criar uma declaração de JDBC com a classe
Statementnã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 classeStatementnão é recomendada. (Deve-se utilizar a classePreparedStatementouCallableStatement, pois essas utilizam substituição de parâmetros.)
- Todas interfaces da API JDBC implementam a interface
AutoCloseable.

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)erelative(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_ONLYindica que um objetoResultSetnão pode ser alterado.
CONCUR_UPDATABLEindica que um objetoResultSetpode 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_COMMITindica 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_COMMITindica que após alguma entrega ser realizada na conexão, essa encerra todosResultSet. Em algumas aplicações esse comportamento pode aumentar a performance.