연결 객체가 문 및 준비된 상태 개체를 생성하는 것처럼 데이터베이스 저장 프로 시저를 실행하는 데 사용될 CallableStatement 객체를 만듭니다.
CallAblestatement 객체 작성 :
다음 Oracle 저장 절차를 실행해야한다고 가정합니다.
프로 시저 생성 또는 교체 getempname (emp_id 숫자, emp_first out varchar) asbegin id = emp_id; end;
참고 : 위의 내용은 Oracle 저장 절차를 작성했지만 MySQL 데이터베이스를 사용하여 MySQL에 대한 동일한 저장 프로 시저를 다음과 같은 EMP 데이터베이스에서 작성합니다.
Delimiter $$ drop procedure`emp`.` getempname` $$가 존재하는 경우``getempname` $$는 create process`emp`.`getempname` (emp_id int, out emp_first varchar (255)) 직원에서 emp_first로 먼저 선택을 시작합니다.
In, Out 및 Inout의 세 가지 유형의 매개 변수가 있습니다. PreparedStatement 객체는 매개 변수에서만 사용됩니다. CallableStatement 객체는 세 가지를 모두 사용할 수 있습니다.
각 정의는 다음과 같습니다.
다음 코드 스 니펫은 connection.preparecall () 메소드를 사용하여 위의 저장된 절차를 기반으로 CallableStatement 객체를 인스턴스화하는 방법을 보여줍니다.
CallAbleStatement CSTMT = NULL; try {String SQL = "{Call GetEmpName (?,?)}"; cstmt = conn.preparecall (SQL); . . .} catch (sqlexception e) {. . .} 마지막으로 { . . .}문자열 변수의 SQL은 매개 변수 자리 표시기를 사용하여 저장된 절차를 나타냅니다.
CallAblestatement 객체를 사용하면 준비된 스테이트 객체를 사용하고 있습니다. 명령문을 실행하기 전에 값은 모든 매개 변수에 결합되어야합니다. 그렇지 않으면 sqlexection이 수신됩니다.
매개 변수가있는 경우, 준비된 스테이트 객체에 적용되는 동일한 규칙과 트릭 만 따르십시오. 바인딩 할 Java 데이터 유형에 해당하는 setxxx () 메소드를 사용하십시오.
아웃 및 인 아웃 매개 변수를 사용하는 경우 추가 CallAbleStatement 메소드와 함께 RegisterOutParameter ()를 사용해야합니다. RegisterOutParameter () 메소드 JDBC 데이터 유형 데이터 유형에 의해 리턴 된 저장 프로 시저에 바인딩됩니다.
저장 프로 시저가 호출되면 getxxx () 메소드의 출력 매개 변수를 사용하여 값을 검색합니다. 이 메소드는 SQL 유형 값을 시전하여 Java 데이터 유형을 검색합니다.
CallAblestatement 객체를 닫습니다.
다른 명령문 객체를 닫는 것처럼, 동일한 이유로 CallableStatement 객체도 닫아야합니다.
Close () 메소드에 대한 간단한 호출은 작업을 수행합니다. 연결 객체가 먼저 닫히면 CallAbleStatement 객체도 닫습니다. 그러나 올바른 정리를 보장하기 위해 CallAblestement 객체는 항상 명시 적으로 닫아야합니다.
CallAbleStatement CSTMT = NULL; try {String SQL = "{Call GetEmpName (?,?)}"; cstmt = conn.preparecall (SQL); . . .} catch (sqlexception e) {. . .} 마침내 {cstmt.close ();} 추신 : CallableStatement 객체 인스턴스
다음은 다음 getempname ()와 함께 CallableStatement를 사용하여 MySQL 저장 프로 시저의 예입니다.
저장된 절차가 EMP 데이터베이스에서 작성되었는지 확인하십시오. MySQL 쿼리 브라우저를 사용하여 수행 할 수 있습니다.
Delimiter $$ drop procedure`emp`.` getempname` $$가 존재하는 경우``getempname` $$는 create process`emp`.`getempname` (emp_id int, out emp_first varchar (255)) 직원에서 emp_first로 먼저 선택을 시작합니다.
이 스크립트 코드는 이전 장의 환경 및 데이터베이스 설치를 기반으로 작성되었습니다.
다음 예제 jdbcexample.java, 다음과 같이 컴파일하고 실행하십시오.
// 1 단계. 가져 오기 필수 패키지 java.sql.*; public class jdbcexample {// jdbc 드라이버 이름 및 데이터베이스 URL 정적 최종 문자열 jdbc_driver = "com.mysql.jdbc.driver"; 정적 최종 문자열 db_url = "jdbc : mysql : // localhost/emp"; // 데이터베이스 자격 증명 정적 최종 문자열 user = "사용자 이름"; 정적 최종 문자열 pass = "비밀번호"; public static void main (String [] args) {Connection Conn = null; CallableStatement stmt = null; {// 2 단계 : jdbc driver class.forname을 등록합니다 ( "com.mysql.jdbc.driver"); // 3 단계 : Connection System.out.println을 엽니 다 ( "데이터베이스 연결 ..."); conn = drivermanager.getConnection (db_url, user, pass); // 4 단계 : query system.out.println을 실행합니다 ( "statement ..."); 문자열 sql = "{call getempname (?,?)}"; stmt = conn.preparecall (SQL); // 매개 변수에서 먼저 바인딩 한 다음 파라미터 int empid = 102를 바인딩합니다. stmt.setint (1, empid); // 이것은 ID가 102로 설정됩니다. // 실행 메소드를 사용하여 저장 프로 시저를 실행합니다. System.out.println ( "저장 프로 시저 실행 ..."); stmt.execute (); // getxxx 메서드로 직원 이름을 검색하십시오 String empname = stmt.getString (2); System.out.println ( "id id id id id id eM :" + empid + "는" + empname); stmt.close (); conn.close (); } catch (sqlexception se) {// jdbc se.printstacktrace ()의 오류 핸들. } catch (예외 e) {// class.forname e.printstacktrace ()의 오류를 처리합니다. } 마침내 {// 마지막으로 자원을 닫는 데 사용되는 블록 {if (stmt! = null) stmt.close (); } catch (sqlexception se2) {} // 우리가 할 수있는 것은 없습니다 {if (conn! = null) conn.close (); } catch (sqlexception se) {se.printstacktrace (); } // 종료 마침내 try} // END TRY SYSTEM.out.println ( "Goodbye!"); } // end main} // end jdbcexample이제 위의 예를 다음과 같이 컴파일하십시오.
C :> javac jdbcexample.java
jdbcexample을 실행할 때 다음과 같은 결과가 발생합니다.
C :> Java jdbcexample
데이터베이스에 연결 ... 명령문 작성 ... 저장 프로 시저 실행 ... ID로 EMP 이름 : 102 is Zaidgoodbye!
JDBC의 SQL Escape 구문 :
Escape Syntax를 사용하면 표준 JDBC 메소드 및 속성을 사용하여 데이터베이스의 특정 기능을 사용하는 유연성이 가능합니다.
일반 SQL Escape Syntax 형식은 다음과 같습니다.
{키워드 '매개 변수'}JDBC 프로그래밍에서 그렇게하는 동안 매우 유용한 다음은 다음과 같습니다.
d, t, ts 키워드 :
날짜, 시간 및 시간 스탬프 텍스트를 결정하는 데 도움이됩니다. 아시다시피, 두 개의 데이터베이스 관리 시스템은 같은 방식으로 시간과 날짜를 기반으로하지 않습니다. 이 탈출 구문은 드라이버에게 대상 데이터베이스에 렌더링 할 형식, 날짜 또는 시간을 알려줍니다. 구현 예 :
{d 'yyyy-mm-dd'}여기서 yyyy = year, mm = month, dd = day. 이 구문을 사용하여 {d '2009-09-03'}은 2009 년 3 월 9 일입니다.
다음은 날짜 테이블을 삽입하는 방법에 대한 간단한 예입니다.
// 명령문 만들기 개체를 만들기 객체를 만들어옵니다. conn.createstatement (); // data ==> id, 이름, 이름, 성, dobstring sql = "삽입" + "(100, 'zara', 'ali', {d '2001-12-16'}"; stmt.ecuteupdate (sql);마찬가지로, 다음 두 개의 구문 중 하나는 t 또는 ts :
{T 'HH : MM : SS'}여기서 hh = 시간, mm = 분, ss = 초입니다. 이 구문을 사용하여 {t '13 : 30 : 29 '}는 오후 1시 30 분 오후 29시입니다.
{ts 'yyyy-mm-dd hh : mm : ss'}타임 스탬프 조합 구문을 나타 내기 위해 위의 두 개의 구문 'd'와 't'입니다.
탈출 키워드 :
이 키워드는 Like 절에 사용 된 탈출 된 문자를 식별합니다. 0 이상의 문자가 일치하는 SQL WildCard %를 사용할 때 유용합니다. 예를 들어:
문자열 sql = " '/%'{Escape ''}와 같은 기호가있는 MathSymbols에서 기호를 선택합니다.백 슬래시 문자 ()를 탈출 문자로 사용하는 경우 Backslash는 Java Escape 캐릭터이기 때문에 Java String 리터럴에서 두 개의 Backslash 문자를 사용해야합니다.
FN 키워드 :
이 키워드는 DBMS에서 스칼라 함수를 사용하는 것을 의미합니다. 예를 들어 SQL 길이 함수를 사용하여 GE 문자열의 길이를 계산할 수 있습니다.
{fn 길이 ( 'Hello World')}이것은 문자열 'Hello World'의 길이 인 11을 반환합니다. .
키워드 호출 :
이 키워드는 저장 절차를 호출하는 데 사용됩니다. 예를 들어 저장 프로 시저의 경우 IN 매개 변수가 필요합니다. 다음 구문을 사용하십시오.
{call my_procedure (?)};저장된 프로 시저의 경우 다음 구문을 사용하여 IN 매개 변수가 필요하고 OUT 매개 변수가 반환됩니다.
{? = my_procedure (?)} 호출; OJ 키워드 :
이 키워드는 외부 조인을 나타내는 데 사용됩니다. 구문은 다음과 같습니다.
{OJ 외부 조인}외부 조인 테이블 = {왼쪽 | 오른쪽 | full} 외부 조인 {테이블 | 외부 조인} 검색 기준. 예를 들어:
String SQL = "{OJ Thistable Right OUTER OUTER ENTABLE on ID = '100'}"; STMT.Execute (SQL);