Statement 와 Prepared Statement

빙그르·2023년 5월 18일

SPRING

목록 보기
2/9

Statement

- 데이터베이스 연결로부터 SQL문을 수행할 수 있도록 해주는 클래스

- executeQuery() : SELECT문 수행 시, 반환 값은 ResultSet

- executeUpdate() : UPDATE, DELETE와 같은 문 수행 시, 반환 값은 처리된 데이터 수를 나타내는 int

Statement stmt = conn.createStatement();

stmt.executeUpdate("insert into test values ' " + request.getParameter("username") + " ')");

=> 사용자 입력 값이 쿼리에 들어가야 할 경우 쿼리가 너무 복잡해지고 유지보수가 어려워진다는 단점.

- 생성 : Connection.createStatement()

- 쿼리문 사용하고 재사용하지 않음

- 어쩌다 한 번 사용되는 쿼리문일 때 사용 (Create, Alter 등)

- 쿼리에 인자를 부여할 수 없음.

- 실행할 때마다 컴파일을 수행함.

- 쿼리문 준비

String sql ="CREATE TABLE member("

+"ID VARCHAR2(50)"+")";

​ 이런식으로 하나씩 다 적어줘야 한다.

- Statement준비

Statement stmt = conn.createStatement();


Prepared Statement

- PreparedStatement 인터페이스는 Connection 객체의 prepareStatement() 메소드를 사용해서 객체를 생성한다. PreparedStatement 객체는 SQL 문장이 미리 컴파일되고, 실행시간동안 인수 값을 위한 공간을 확보할 수 있다는 점에서 Statement 객체와는 다르다.

- PreparedStatement 객체는 동일한 질의문을 특정 값만 바꾸어서 여러 번 실행해야 할 때, 많은 데이터를 다루기 때문에 질의문을 정리해야 할 필요가 있을 때, 인수가 많아서 질의문을 정리해야 될 필요가 있을 때 사용하면 유용하다.

- 또한 Statement 객체의 SQL 은 실행될 때 매번 서버에서 분석되어야 하는 반면, PreparedStatement 객체는 한 번 분석되면 재사용이 용이하다는 장점을 가지고 있다.

- PreparedStatement 인터페이스는 각각의 인수에 대해 위치홀더 (placeholder)를 사용하여 SQL 문장을 정의할 수 있게 해준다. 위치홀더는 물음표(?)로 표현된다. 위치홀더는 SQL 문장에 나타나는 토큰(token)인데, 이것은 SQL 문장이 실행되기 전에 실제 값으로 대체된다. 이러한 방법을 이용하면 특정 값으로 문자열을 연결하는 방법보다 훨씬 쉽게 SQL 문장을 만들 수 있다.

- Statement 클래스를 상속받으므로, Statement 클래스 메서드를 모두 사용 가능

- 생성 : Connection.prepareStaement()

- 쿼리 재사용 가능

- ? : 뭐가 들어올지 모를때 사용

- 자주 사용되는 쿼리문에 사용.

- 쿼리를 미리 컴파일시켜서 사용하기 때문에 속도가 빠르다

- 쿼리문 준비

? 대응 일 때 -> String sql = "INSERT INTO TABLE VALUES(column의 갯수만큼 ?로 표시)";

? 대응이 아닐 때 -> String sql = "SELECT [COLUMN] FROM [TABLE]"

3-2. Connection 으로부터 PreparedStatement 준비

-> PreparedStatement pstmt = conn.prepareStatement(sql);

3-3. ? 대응

? 대응 일 때 -> pstmt.setString(1, "admin"+i); / pstmt.setInt(4, 20+i);

(pstmt 는 각 ?에 무엇이 들어가는지 알려주어야 한다)

? 대응이 아닐 때 -> 쿼리 상황에 따라서 ? 대응


ResultSet

- 결과값을 저장할 수 있다.

- 저장된 값을 한 행 단위로 불러올 수 있다.

- 한 행에서 값을 가져올 때는 타입을 지정해 불러올 수 있다

입력/수정/삭제와 달리 데이터를 갖고 오는 경우, 가져온 결과 데이터를 처리하기 위한 ResultSet 객체 필요

ResultSet rs = pstmt.executeQuery();

- ResultSet은 조회한 결과 값에 순차적으로 접근할 수 있는 커서를 제공, 데이터베이스 내부적으로 수행된 SQL문 처리 결과를 JDBC에서 쉽게 관리할 수 있도록 해주는 JAVA 객체이다.

- executeUpdate() 메서드 호출 시 반환되는 객체로 실제 데이터를 가지고 있는 것이 아니라, SELECT 문의 결과에 접근할 수 있는 일종의 포인터로 이해해야 한다.

- rs.next() 메서드를 이용해 위치를 옮겨 다음 로우에 접근하며, 각 로우에 있는 데이터는 rs.getXXX()와 같이 데이터타입별 메서드로 가져온다.

- 사용이 끝나면 rs.close()로 닫아주어야 한다.

  1. 커서(원하는 데이터로 이동하기 위해 사용)

- 초기에 첫 번째 행의 직전을 가리키도록 되어 있는데, ResultSet 객체의 next() 메소드를 사용하면 다음 위치로 커서를 옮길 수 있다.

- Cursor 를 활용할 경우 Prepare Statement 선언 시 상수를 이용하여 여러 제한을 줄 수 있다

PreparedStatement prepareStatement(String sql, int 커서 이동과 관련된 옵션들, int 데이터 변경과 관련된 옵션)

first() : 커서를 첫 번째 행으로 옮긴다.

last() : 커서를 마지막 행으로 옮긴다.

beforeFirst() : 커서를 첫번째 행 이전으로 옮긴다.

afterLast() : 커서를 마지막 행 다음으로 옮긴다.

*next() : 커서를 다음 행으로 옮긴다.

previous() : 커서를 이전 행으로 옮긴다.

- ResultSet에서 행을 처리하는데 반복문을 사용하며 next() 메소드가 다음행이 내려갈 다음행이 있을 경우 TRUE를 반환하고, 없을 경우 FALSE를 반환한다.

id 중복체크의 경우 동일 아이디가 존재하면 true, 아니면 false반환!

0개의 댓글