JDBC(Java Database Connectivity)는 자바를 이용해 데이터베이스에 접속하고 SQL 문을 실행할 수 있게 해주는 API입니다. JDBC에서는 세 가지 종류의 Statements를 제공합니다.
<요약>
1. statement - 일반적인 sql쿼리를 실행
2. preparedStatement - 동적 또는 매개변수가 필요한 sql쿼리를 실행
3. callableStatement - 저장된 프로시져를 실행
1. Statement
- Statement 객체는 데이터베이스에 SQL 문을 보내기 위한 가장 기본적인 객체입니다.
- Connection 객체의 createStatement() 메서드를 호출하여 생성할 수 있습니다.
- SQL Injection 등의 보안 문제가 있을 수 있으므로, 인자로 전달된 문자열을 직접 SQL 문으로 사용하지 않는 것이 좋습니다.
기본적은 사용법은 다음과 같다.
String sql = "SELECT name, phone, address FROM classTable";
Statement s = conn.credateStatement();
ResultSet rs = s.executeQuerey(sql);
statement는 일반적인 sql 쿼리를 실행하는데 사용된다. 매개변수를 전달할 수도 없고 실행할 때마다 컴파일을 하게된다. 따라서 성능적인 면에서 안좋을 수 밖에 없고, 유연하지 못하다. 그래서 대부분의 statement 구문은 DDL문(create, alter, drop …)에서 주로 사용된다.
statement는 string형태로 sql을 작성하기 때문에 sql 작성이 다른 인터페이스보다 편하고 직관적인 장점이 있다.
2. PreparedStatement
- PreparedStatement 객체는 Statement 객체와 달리 SQL 문을 미리 컴파일하여 재사용할 수 있습니다.
- SQL Injection 공격을 예방할 수 있으며, 파라미터 값을 쉽게 바인딩할 수 있습니다.
- Connection 객체의 prepareStatement() 메서드를 호출하여 생성할 수 있습니다.
기본적인 사용방법은 다음과 같다.
String sql = "UPDATE classTable SET name = ?, phone = ?, address = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "마동석");
ps.setString(2, "010-1234-5678");
ps.setString(3, "서울시");
ResultSet rs = ps.executeQuerey();
prepared는 사전적 의미로 ‘준비된’ 이란 뜻이다. 이름에서 알 수 있듯이 준비된 statement이며 여기서 준비 = 컴파일을 말한다. preparedStatement는 statement를 확장한다.
미리 컴파일이 되어 준비하고 있기 때문에 statement에 비해 성능상으로 우위에 있다. 매개변수 전달이 필요한 sql 작성이나, for loop 등으로 여러번 sql을 실행하는 경우에 주로 사용한다.
3. CallableStatement
- CallableStatement 객체는 데이터베이스의 저장 프로시저(Stored Procedure)나 함수를 호출하기 위한 객체입니다.
- PreparedStatement 객체와 마찬가지로 SQL 문을 미리 컴파일할 수 있으며, 파라미터 값을 쉽게 바인딩할 수 있습니다.
- Connection 객체의 prepareCall() 메서드를 호출하여 생성할 수 있습니다.
기본적인 사용방법은 다음과 같다.
int classNumber = 1;
CallableStatement cs = conn.prepareCall("{ call procGetStudents(?, ?, ?) }");
cs.setString(1, classNumber);
cs.registerOutputParameter(2, Types.VARCHAR);
cs.registerOutputParameter(3, Types.VARCHAR);
cs.execute();
ResultSet rs = cs.getResultSet();
CallableStatement는 미리 작성해둔 프로시저를 실행하는데 사용한다. CallableStatement는 PreparedStatement를 확장한다.
CallableStatement를 사용할때는 ? 매개변수 자리에 프로시져에서 사용하는 매개변수와, 가져올 값에 대한 셋팅을 동시에 해준다. 프로시져 실행에 필요한 매개변수는 setString, setInt 등으로 해주고, 프로시져 응답으로 받을 값들에 대한 데이터 타입을 registerOutputParameter으로 모두 지정해주어야 한다.
CallableStatement 역시 미리 컴파일되어 DB에 저장되어 있기 때문에 성능상으로 이점이 있다.
**프로시저(Procedure)란?
데이터베이스에 대한 일련의 작업을 정리한 절차를 관계형 데이터베이스 관리 시스템에 저장한 것으로 영구저장모듈(Persistent Storage Module)이라고도 불립니다.
보통 저장 프로시저를 프로시저라고 부르며, 일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합입니다.
즉, 특정 작업을 위한 쿼리들의 블록입니다.
'개발공부 > CS Study' 카테고리의 다른 글
데이터 베이스 제약조건과 정규화 (0) | 2023.03.30 |
---|---|
JDBC 문법 (0) | 2023.03.29 |
4. 데이터베이스(3) - 트랜잭션과 무결성 (0) | 2022.11.01 |
4. 데이터 베이스 (2) - ERD와 정규화 과정 (0) | 2022.11.01 |
네트워크(2) (0) | 2022.09.27 |