[Java] Statement, PreparedStatement, CallableStatement

chael_lo·2021년 6월 23일
0

Java

목록 보기
44/52

접속된 DBMS 서버에 SQL 명령을 전달하여 실행된 결과를 반환하는 기능을 제공하는 객체들이다.

Statement

Statement 객체는 SQL문을 DB로 전송하는데 사용한다.
접속된 DBMS 서버에 SQL 명령을 전달하여 실행된 결과를 반환하는 기능을 제공하는 인스턴스다.
Statement 인터페이스는 SQL문들을 실행하고 결과들을 검색하기 위한 기본적인 메소드들이 있다.

  • 장점: 하나의 Statement 인스턴스로 다수의 SQL 명령을 전달하여 실행 가능하다.
  • 단점: SQL 명령에 Java 변수값을 포함하고자 할 경우 문자열 결합 기능을 이용해야 한다.
    문자열 결합을 이용할 경우 가독성 및 유지보수의 효율성이 감소한다.
    InSQL 해킹 기술(값 대신 부분적인 SQL 명령을 포함하는 기술)에 취약하다.
Statement stmt=con.createStatement();
//+연산자를 통해 결합
String sql1="insert into student values("+no+",'"+name+"','"+phone+"','"+address+"','"+birthday+"')";

int rows=stmt.executeUpdate(sql1);

PreparedStatement(Statement로부터 상속받는다.)

IN 매개변수를 가지거나 가지지 않는 프리 컴파일된 SQL문을 실행하는데 사용한다.
PreparedStatement 인터페이스는 IN 매개변수들을 다루기 위한 메소드들이 있다.
PreparedStatement 인스턴스에 저장된 SQL 명령에서는 ?(InParameter) 기호를 사용한다.

  • 장점: InParameter를 이용하여 값을 전달받아 SQL 명령을 작성할 수 있다.
    InParameter를 사용하면 가독성과 유지보수의 효율성이 증가한다.
    InSQL 해킹 기술을 무효화 처리한다.(사용자 입력값을 무조건 SQL 명령의 값으로 처리한다.)
  • 단점: PreparedStatement 인스턴스는 하나의 SQL 명령만을 저장하여 전달 가능하다.
//InParameter는 Java 변수값을 무조건 SQL 명령의 값으로만 인식되어 처리
//?는 InParameter
String sql="select * from student where name=? order by no";
//sql 명령을 pstmt에 저장
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setString(1, name);

CallableStatement(PreparedStatement로부터 상속받는다.)

DB 저장 프로시저(Stored Procedure)의 호출을 실행하는데 사용한다.
CallableStatement 인터페이스에는 OUT 매개변수들을 다루기 위한 메소드들이 있다.

저장 프로시저 사용 장점

데이터베이스 쪽에서 프로시저로 존재하는 것이기 때문에 클라이언트에서 저장된 프로시저를 실행만 해주면 그 프로시저 내용이 오라클 내부에서 바로 처리되므로 실행속도가 더 빠르다. 또 네트워크에서 사용하는 쿼리의 양도 줄어드므로 부하가 적다.

저장 프로시저를 호출하는 명령

{call 프로시저명({값|변수},{값|변수},...)}

//? 기호(InParameter) 사용 가능
String sql="{call delete_student(?)}";

//객체 생성할 때 prepareCall 메서드를 사용함
CallableStatement cstmt=con.prepareCall(sql);
cstmt.setInt(1, no);
		
//인스턴스에 저장된 SQL 명령을 전달하여 실행
cstmt.execute();
profile
천천히 꾸준히

0개의 댓글