English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JDBC Statement, PreparedStatement e CallableStatement

Uma vez obtida a conexão, podemos interagir com o banco de dados. As interfaces JDBC Statement, CallableStatement e PreparedStatement definem métodos e propriedades que permitem que você envie SQL ou PL/Comandos SQL e a recebimento de dados do banco de dados.

Eles também definem métodos que ajudam a preencher as diferenças de tipos de dados entre os tipos de dados Java e SQL usados no banco de dados.

A tabela a seguir resume o uso de cada interface para determinar qual usar.

interface
Recomendado usar
Statement

Use-o para acessar o banco de dados de maneira genérica. É muito útil ao usar sentencas SQL estáticas no tempo de execução. A interface Statement não pode aceitar parâmetros.

PreparedStatement

Quando você planeja usar várias vezes a mesma sentença SQL, use esta opção. A interface PreparedStatement aceita parâmetros de entrada de tempo de execução.

CallableStatement

Quando você deseja acessar procedimentos armazenados no banco de dados, use esta opção. A interface CallableStatement também pode aceitar parâmetros de entrada de tempo de execução.

Objeto Statement

Criar objeto Statement

Antes de poder usar o objeto Statement para executar sentencas SQL, é necessário usar o método createStatement() do objeto Connection para criar uma sentença SQL, como mostrado no exemplo a seguir-

Statement stmt = null;
try {
   stmt = conn.createStatement();
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

Uma vez criado o objeto Statement, você pode usar um dos três métodos de execução para executar sentencas SQL.

  • boolean execute (String SQL):Se puder recuperar o objeto ResultSet, retorna o valor booleano true; caso contrário, retorna false. Quando precisar usar SQL verdadeiramente dinâmico, use este método para executar sentencas SQL DDL.

  • int executeUpdate (String SQL):Retorna o número de linhas afetadas pela execução da sentença SQL. Você pode usar este método para executar sentencas SQL que você deseja afetar, como INSERT, UPDATE ou DELETE.

  • ResultSet executeQuery (String SQL):Retorna um objeto ResultSet. Quando você deseja obter um conjunto de resultados, use este método, como se fosse uma consulta SELECT.

Fechar o objeto Statement

Da mesma forma que você fecha o objeto Connection para economizar recursos do banco de dados, você também deve fechar o objeto Statement por motivos semelhantes.

Uma simples chamada ao método close() é suficiente. Se você fechar primeiro o objeto Connection, ele também fechará o objeto Statement. No entanto, você deve sempre fechar explicitamente o objeto Statement para garantir uma limpeza correta.

Statement stmt = null;
try {
   stmt = conn.createStatement();
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   stmt.close();
}

Para entender melhor, recomendamos que você estudeTutorial de exemplo de Statement.

Objeto PreparedStatement

A interface PreparedStatement estende a interface Statement, fornecendo funcionalidades adicionais e algumas vantagens em comparação com o objeto Statement genérico.

Esta instrução permite que você forneça parâmetros de forma flexível e dinâmica.

Criar objeto PreparedStatement

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

Todos os parâmetros no JDBC são representados por?símbolos representam, esse símbolo é chamado de marcador de parâmetro. Você deve fornecer um valor para cada parâmetro antes de executar a instrução SQL.

EssessetXXX()O método vincula valores aos parâmetros, ondeXXXIndica o tipo de dados Java que você deseja vincular ao parâmetro de entrada. Se você esquecer de fornecer um valor, será lançada uma exceção SQLException.

Cada marcador de parâmetro é referenciado por sua posição ordinal. O primeiro marcador representa a posição1A segunda representa a posição2E assim por diante. Este método é diferente do método de índice de array em Java, que começa em 0.

Todos os métodos de objetos Statement usados para interagir com o banco de dados (a) execute (), (b) executeQuery () e (c) executeUpdate () também podem ser usados com objetos PreparedStatement. No entanto, esses métodos são modificados para usar consultas SQL que podem aceitar parâmetros.

Fechamento do objeto PreparedStatement

Da mesma forma que o objeto Statement, por motivos semelhantes, o objeto PreparedStatement também deve ser fechado.

Uma simples chamada ao método close() é suficiente. Se você fechar primeiro o objeto Connection, ele também fechará o objeto PreparedStatement. No entanto, você deve sempre fechar explicitamente o objeto PreparedStatement para garantir uma limpeza correta.

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   pstmt.close();
}

Para entender melhor, vamos aprenderExemplo de código de PreparedStatement.

Objeto CallableStatement

Assim como o objeto Connection cria objetos Statement e PreparedStatement, ele também cria objetos CallableStatement, que serão usados para executar chamadas de procedimentos armazenados no banco de dados.

Criar objeto CallableStatement

Suponha que você precise executar o seguinte procedimento armazenado Oracle-

CREATE OR REPLACE PROCEDURE getEmpName 
   (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END;

NOTA: O procedimento armazenado acima foi escrito para Oracle, mas estamos usando o banco de dados MySQL, portanto, vamos escrever o mesmo procedimento armazenado para MySQL, conforme mostrado a seguir, para criar-o no banco de dados EMP-

DELIMITER $$
DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName` 
   (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END $$
DELIMITER ;

Existem três tipos de parâmetros: IN, OUT e INOUT. O objeto PreparedStatement usa apenas parâmetros IN. O objeto CallableStatement pode usar todos os três.

Esta é a definição de cada um-

IntervaloDescrição
IN

Parâmetros desconhecidos no momento da criação da sentença SQL. Use o método setXXX () para vincular valores a IN something.

OUT

Seu valor é fornecido pelos parâmetros da sentença SQL retornada. Recupere valores dos parâmetros usando o método getXXX ()

INOUT

Oferece parâmetros com valores de entrada e saída. Você pode vincular variáveis usando o método setXXX () e recuperar valores usando o método getXXX ()

O código fragmento a seguir mostra como usar o método Connection.prepareCall () com base no procedimento armazenado anterior-Instanciar o objeto CallableStatement

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt =conn.prepareCall(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

A variável de string SQL, que representa um procedimento armazenado com marcadores de posição.

O uso do objeto CallableStatement é muito semelhante ao uso do objeto PreparedStatement. Você deve vincular valores a todos os parâmetros antes de executar a sentença, senão receberá uma SQLException.

Se houver parâmetro IN, siga as mesmas regras e técnicas aplicadas ao objeto PreparedStatement; use o método setXXX () correspondente ao tipo de dados Java vinculado.

Ao usar parâmetros OUT e INOUT, você deve usar o método adicional CallableStatement registerOutParameter(). O método registerOutParameter() liga o tipo de dados JDBC ao tipo de dados esperado retornado pelo procedimento armazenado.

Após chamar o procedimento armazenado, você pode usar o método getXXX() apropriado para recuperar valores do parâmetro OUT. Este método converte o valor do tipo SQL retornado para o tipo de dados Java.

Fechar objeto CallableStatement

Da mesma forma que fecha outros objetos Statement, por samme razão, você também deve fechar o objeto CallableStatement.

Basta chamar o método close() para fechar. Se você fechar primeiro o objeto Connection, ele também fechará o objeto CallableStatement. No entanto, você deve sempre fechar explicitamente o objeto CallableStatement para garantir uma limpeza correta.

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt =conn.prepareCall(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   cstmt.close();
}

Para entender melhor, eu recomendo aprenderCódigo de exemplo CallableStatement.