Computer >> 컴퓨터 >  >> 프로그램 작성 >> MySQL

JDBC에서 CallableStatement란 무엇입니까?

<시간/>

CallableStatement 인터페이스는 저장 프로시저를 실행하는 메서드를 제공합니다. JDBC API는 저장 프로시저 SQL 이스케이프 구문을 제공하므로 단일 표준 방식으로 모든 RDBMS의 저장 프로시저를 호출할 수 있습니다.

CallableStatement 생성

CallableStatement의 개체를 만들 수 있습니다. (인터페이스) prepareCall() 사용 연결 방법 상호 작용. 이 메서드는 쿼리를 나타내는 문자열 변수를 받아 저장 프로시저를 호출하고 CallableStatement를 반환합니다. 개체.

Callable 문은 입력 매개변수, 출력 매개변수 또는 둘 다를 가질 수 있습니다. 프로시저 호출에 입력 매개변수를 전달하려면 자리 표시자를 사용하고 CallableStatement 인터페이스에서 제공하는 setter 메서드(setInt(), setString(), setFloat())를 사용하여 값을 설정할 수 있습니다.

데이터베이스에 myProcedure라는 프로시저 이름이 있다고 가정하고 호출 가능한 명령문을 다음과 같이 준비할 수 있습니다.

//Preparing a CallableStatement
CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");

입력 매개변수에 값 설정

setter 메소드를 사용하여 프로시저 호출의 입력 매개변수에 값을 설정할 수 있습니다.

이것은 두 개의 인수를 허용합니다. 하나는 입력 매개변수의 배치 인덱스를 나타내는 정수 값이고, 다른 하나는 int 또는, String 또는, float 등... 프로시저에 asinput 매개변수를 전달하는 데 필요한 값을 나타냅니다.

참고: 인덱스 대신 문자열 형식의 매개변수 이름을 전달할 수도 있습니다.

cstmt.setString(1, "Raghav");
cstmt.setInt(2, 3000);
cstmt.setString(3, "Hyderabad");

호출 가능 명령문 실행

CallableStatement 객체를 생성하면 execute() 중 하나를 사용하여 실행할 수 있습니다. 방법.

cstmt.execute();

예시

Employee라는 테이블이 있다고 가정합니다. 다음 데이터가 있는 MySQL 데이터베이스:

+---------+--------+----------------+
| Name    | Salary | Location       |
+---------+--------+----------------+
| Amit    | 30000  | Hyderabad      |
| Kalyan  | 40000  | Vishakhapatnam |
| Renuka  | 50000  | Delhi          |
| Archana | 15000  | Mumbai         |
+---------+--------+----------------+

그리고 아래와 같이 이 테이블에 값을 삽입하기 위해 myProcedure라는 프로시저를 만들었습니다.

Create procedure myProcedure (IN name VARCHAR(30), IN sal INT, IN loc VARCHAR(45))
   -> BEGIN
   -> INSERT INTO Employee(Name, Salary, Location) VALUES (name, sal, loc);
   -> END //

다음은 호출 가능한 문을 사용하여 위에서 생성한 프로시저를 호출하여 Employee 테이블에 새 레코드를 삽입하는 JDBC 예제입니다.

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class CallableStatementExample {
   public static void main(String args[]) throws SQLException {
      //Registering the Driver
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());

      //Getting the connection
      String mysqlUrl = "jdbc:mysql://localhost/testdb";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("Connection established......");
      //Preparing a CallableStateement
      CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");

      cstmt.setString(1, "Raghav");
      cstmt.setInt(2, 3000);
      cstmt.setString(3, "Hyderabad");

      cstmt.setString(1, "Kalyan");
      cstmt.setInt(2, 4000);
      cstmt.setString(3, "Vishakhapatnam");

      cstmt.setString(1, "Rukmini");
      cstmt.setInt(2, 5000);
      cstmt.setString(3, "Delhi");

      cstmt.setString(1, "Archana");
      cstmt.setInt(2, 15000);
      cstmt.setString(3, "Mumbai");

      cstmt.execute();
      System.out.println("Rows inserted ....");
   }
}

출력

Connection established......
Rows inserted ....

select 쿼리를 사용하여 Employee 테이블의 내용을 검색하면 아래와 같이 새로 추가된 레코드를 확인할 수 있습니다.

mysql> select * from employee;
+---------+--------+----------------+
| Name    | Salary | Location       |
+---------+--------+----------------+
| Amit    | 30000  | Hyderabad      |
| Kalyan  | 40000  | Vishakhapatnam |
| Renuka  | 50000  | Delhi          |
| Archana | 15000  | Mumbai         |
| Raghav  | 3000   | Hyderabad      |
| Raghav  | 3000   | Hyderabad      |
| Kalyan  | 4000   | Vishakhapatnam |
| Rukmini | 5000   | Delhi          |
| Archana | 15000  | Mumbai         |
+---------+--------+----------------+
9 rows in set (0.00 sec)