personalização do conjunto de resultados

A API JDBC moderna permite que você personalize bastante os objetos.DeclaraçãoEconjunto de resultados. Por exemplo, usandoconjunto de resultadosvocê pode alterar as linhas no banco de dados.

Ao criar um objeto de instrução, podemos passar vários de nossos desejos para ele. Esses desejos podem ser divididos em três grupos:

  • Tipo de conexão básica
  • Controle de acesso simultâneo
  • Persistência e transações

Esses parâmetros podem ser passados ​​ao criar um objetoDeclaraçãoouDeclaração preparada. Exemplo:

Statement statement = connection.createStatement(
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT );

PreparedStatement statement = connection.prepareStatement(sql,
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT);

Não estudaremos essas coisas em profundidade, mas quero que você saiba que isso é possível se você encontrar algo semelhante no código de outra pessoa.

Tipos de conjuntos de resultados

ResultSet pode ser de um tipo específico. O tipo define algumas das características e capacidades do ResultSet.

Nem todos os tipos são suportados por todos os bancos de dados e drivers JDBC. Você terá que verificar seu banco de dados e driver JDBC para ver se ele suporta o tipo que deseja usar. O método DatabaseMetaData.supportsResultSetType(int type) retorna true ou false dependendo se o tipo fornecido é suportado ou não.

No momento da escrita, existem três tipos de ResultSet:

  • ResultSet.TYPE_FORWARD_ONLY
  • ResultSet.TYPE_SCROLL_INSENSITIVE
  • ResultSet.TYPE_SCROLL_SENSITIVE

O tipo padrão é TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY significa que o ResultSet só pode ser movido para frente. Ou seja, você só pode mover da linha 1, linha 2, linha 3, etc. Em um ResultSet, você não pode mover para trás: você não pode ler dados da 9ª linha depois de ler a décima.

TYPE_SCROLL_INSENSITIVE significa que o ResultSet pode ser movido (rolado) para frente ou para trás. Você também pode mover para uma posição relativa à posição atual ou mover para uma posição absoluta.

Um ResultSet desse tipo é insensível a alterações na fonte de dados subjacente enquanto o ResultSet está aberto. Ou seja, se uma entrada no ResultSet for alterada no banco de dados por outra thread ou processo, ela não será refletida no já abertoconjunto de resultadosdeste tipo.

TYPE_SCROLL_SENSITIVE significa que o ResultSet pode ser movido (rolado) para frente ou para trás. Você também pode mover para uma posição relativa à posição atual ou mover para uma posição absoluta.

Um ResultSet desse tipo é sensível a alterações na fonte de dados subjacente enquanto o ResultSet está aberto. Ou seja, se uma entrada no ResultSet for alterada no banco de dados por outra thread ou processo, ela será refletida no já abertoconjunto de resultadosdeste tipo.

Simultaneidade

A simultaneidade de um ResultSet determina se o ResultSet pode ser atualizado ou apenas lido.

Alguns bancos de dados e drivers JDBC suportam a atualização de um ResultSet, mas não todos. O método DatabaseMetaData.supportsResultSetConcurrency(int concurrency) retorna verdadeiro ou falso , dependendo se o modo de simultaneidade fornecido é suportado ou não.

ResultSet pode ter um dos dois níveis de simultaneidade:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY significa que o ResultSet só pode ser lido.

CONCUR_UPDATABLE significa que o ResultSet pode ser lido e modificado.

Um exemplo de alteração de dados no banco de dados

Com esses parâmetros, você pode controlar o Statement gerado e seu ResultSet.

Por exemplo, você pode criar um ResultSet atualizável e usá-lo para alterar o banco de dados. Ao criar uma Declaração, é importante observar as seguintes condições:

  • apenas uma tabela é especificada
  • não contém cláusulas join ou group by
  • colunas de consulta devem conter uma chave primária

Quando as condições acima forem atendidas, o ResultSet atualizado pode ser usado para atualizar uma tabela no banco de dados. Ao criar um objeto Statement, você precisa especificar os seguintes parâmetros:

Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)

O resultado da execução dessa instrução é um conjunto de resultados atualizável. O método update é mover o cursor ResultSet para a linha que você deseja atualizar e, em seguida, chamar o método updateXXX() .

O método updateXXX funciona de forma semelhante ao método getXXX() . O método updateXXX() tem dois parâmetros. O primeiro é o número da coluna que está sendo atualizada, que pode ser um nome de coluna ou um número de série. O segundo são os dados que precisam ser atualizados, e esse tipo de dado deve ser o mesmo que XXX.

Para realmente atualizar a linha no banco de dados, você precisa chamar o método updateRow() antes que o cursor ResultSet deixe a linha alterada, caso contrário, as alterações não entrarão no banco de dados.

Você também pode adicionar novas linhas à tabela:

Primeiro você precisa mover o cursor para uma linha vazia. Para fazer isso, chame o método moveToInsertRow() .

Então você precisa preencher esta linha com dados usando o método updateXXX() .

Então você precisa chamar o método inserterRow() para adicionar a linha à base.

E, finalmente, você precisa retornar o cursor chamando o método moveToCurrentRow() .

Importante! Nem todos os DBMSs oferecem suporte a essas opções para a instrução estendida. Em caso de problemas, consulte a documentação oficial de um determinado DBMS.