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

JDBC Statement,PreparedStatement和CallableStatement

一旦获得连接,我们就可以与数据库进行交互。JDBC Statement、CallableStatement 和 PreparedStatement 接口定义了方法和属性,这些方法和属性使您能够发送 SQL 或 PL/SQL 命令并从数据库接收数据。

它们还定义了有助于弥合数据库中使用的 Java 和 SQL 数据类型之间的数据类型差异的方法。

La siguiente tabla resume el uso de cada interfaz para determinar la interfaz que debe usar.

Interfaz
Recomendado
Statement

Úsela para acceder de manera general a la base de datos. Es muy útil en tiempo de ejecución cuando se utilizan sentencias SQL estáticas. La interfaz Statement no puede aceptar parámetros.

PreparedStatement

Cuando planea usar una sentencia SQL varias veces, utilice esta opción. La interfaz PreparedStatement acepta parámetros de entrada en tiempo de ejecución.

CallableStatement

Cuando desee acceder a procedimientos almacenados en la base de datos, utilice esta opción. La interfaz CallableStatement también puede aceptar parámetros de entrada en tiempo de ejecución.

Objeto Statement

Crear objeto Statement

Antes de poder usar el objeto Statement para ejecutar sentencias SQL, es necesario crear una sentencia SQL utilizando el método createStatement() del objeto Connection, como se muestra en el siguiente ejemplo-

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

Una vez creado el objeto Statement, puede usar uno de sus tres métodos de ejecución para ejecutar sentencias SQL.

  • boolean execute (String SQL):devuelve un valor booleano true si se puede recuperar el objeto ResultSet; de lo contrario, devuelve false. Cuando necesite ejecutar verdaderamente SQL dinámico, utilice este método para ejecutar sentencias SQL DDL.

  • int executeUpdate (String SQL):devuelve el número de filas afectadas por la ejecución de la sentencia SQL. Puede usar este método para ejecutar sentencias SQL que desee afectar en número de filas, como INSERT, UPDATE o DELETE.

  • ResultSet executeQuery (String SQL):devuelve un objeto ResultSet. Cuando desee obtener un conjunto de resultados, utilice este método, al igual que con una sentencia SELECT.

Cerrar el objeto Statement

Al igual que cerrar el objeto Connection para ahorrar recursos de bases de datos, por el mismo motivo, también debe cerrar el objeto Statement.

Basta con llamar al método close() de manera sencilla. Si primero cierra el objeto Connection, también cerrará el objeto Statement. Sin embargo, siempre debe cerrar explícitamente el objeto Statement para asegurar una limpieza correcta.

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

Para entender mejor, le recomendamos que aprendaEjemplo de tutorial de Statement.

Objeto PreparedStatement

El interfaz PreparedStatement extiende el interfaz Statement, proporcionándole funciones adicionales y algunas ventajas en comparación con el objeto Statement genérico.

Esta declaración le permite proporcionar parámetros de manera flexible y dinámica.

Crear el objeto PreparedStatement

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

Todos los parámetros en JDBC se crean?Los símbolos representan, este símbolo se llama marcador de parámetro. Debe proporcionar un valor para cada parámetro antes de ejecutar la sentencia SQL.

EstossetXXX()El método enlaza valores a los parámetros, dondeXXXRepresenta el tipo de datos Java que desea enlazar al parámetro de entrada. Si olvida proporcionar un valor, se lanzará una SQLException.

Cada marcador de parámetro se refiere a su posición de orden. El primer marcador representa la posición1La segunda representa la posición2Y así sucesivamente. Este método es diferente al de los índices de arrays en Java, que comienzan en 0.

Todos los métodos de los objetos Statement utilizados para interactuar con la base de datos (a) execute (), (b) executeQuery () y (c) executeUpdate () también se pueden usar con el objeto PreparedStatement. Sin embargo, estos métodos se modificaron para usar sentencias SQL que admiten parámetros de entrada.

Cerrar el objeto PreparedStatement

Al igual que cerrar el objeto Statement, por las mismas razones, también debe cerrar el objeto PreparedStatement.

Con una simple llamada al método close() es suficiente. Si primero cierra el objeto Connection, también cerrará el objeto PreparedStatement. Sin embargo, debe cerrar explícitamente el objeto PreparedStatement para asegurarse de que se limpie correctamente.

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

Para entender mejor, estudiamosEjemplo de código de PreparedStatement.

Objeto CallableStatement

Al igual que el objeto Connection crea Statement y PreparedStatement, también crea el objeto CallableStatement, que se utilizará para ejecutar llamadas a procedimientos almacenados en la base de datos.

Crear el objeto CallableStatement

Supongamos que necesita ejecutar el siguiente procedimiento almacenado de 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: El procedimiento almacenado anterior se ha escrito para Oracle, pero estamos utilizando una base de datos MySQL, por lo que, escribamos el mismo procedimiento almacenado para MySQL, como se muestra a continuación, para crearlo en la base de datos 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 ;

Existen tres tipos de parámetros: IN, OUT y INOUT. El objeto PreparedStatement solo utiliza parámetros IN. El objeto CallableStatement puede usar todos estos tres.

Esta es la definición de cada uno-

RangoDescripción
IN

Parámetros desconocidos en el momento de crear la sentencia SQL. Utilice el método setXXX () para enlazar valores a IN something.

OUT

Su valor es proporcionado por los parámetros del SQL devuelto. Recupere los valores de los parámetros utilizando el método getXXX ()

INOUT

Proporciona parámetros con valores de entrada y salida. Puede enlazar variables utilizando el método setXXX () y recuperar valores utilizando el método getXXX ()

El siguiente fragmento de código muestra cómo usar el método Connection.prepareCall () para la procedimiento almacenado anterior-Instanciar el objeto CallableStatement

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

La variable de cadena SQL, que representa el procedimiento almacenado con marcadores de posición de parámetros.

El uso del objeto CallableStatement es muy similar al uso del objeto PreparedStatement. Debe enlazar todos los valores de los parámetros antes de ejecutar la sentencia; de lo contrario, recibirá una SQLException.

Si hay un parámetro IN, simplemente siga las reglas y técnicas aplicables al objeto PreparedStatement; utilice el método setXXX () correspondiente al tipo de datos Java enlazado.

Al usar parámetros OUT y INOUT, debe usar el método adicional CallableStatement registerOutParameter(). El método registerOutParameter() une el tipo de datos JDBC al tipo de datos esperado del procedimiento almacenado de retorno.

Después de llamar al procedimiento almacenado, se puede recuperar valores de los parámetros OUT utilizando métodos getXXX() apropiados. Este método convierte el valor de tipo SQL recuperado en tipo de datos Java.

Cerrar el objeto CallableStatement

Al igual que con otros objetos Statement, también debe cerrar el objeto CallableStatement por las mismas razones.

Basta con llamar al método close() para cerrar. Si primero cierra el objeto Connection, también cerrará el objeto CallableStatement. Sin embargo, siempre debe cerrar explícitamente el objeto CallableStatement para asegurar una limpieza correcta.

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

Para entender mejor, recomiendo aprenderCódigo de ejemplo de CallableStatement.