본문 바로가기
Java & Kotlin/Backend

7. PreparedStatement (excute, set)

by heekng 2021. 1. 19.
반응형
 

java.sql.PreparedStatement 클래스는 자바에서 SQL쿼리를 실행할 때 사용하는 클래스입니다.

쿼리문을 유동적으로 변형하여 사용할 수도 있고, 실제 쿼리를 실행하였을 때 커맨드창에서 리턴되는 값들을 출력받을 수도 있습니다.


1. execute(), executeUpdate(), executeQuery()

먼저 execute 메서드에 대하여 설명하겠습니다.

execute();

boolean type 리턴

쿼리를 실행한 뒤, 리턴되는 결과가 ResultSet 객체면 true, int형 정수거나 결과값이 없으면 false

executeUpdate();

int type 리턴

쿼리를 실행한 뒤, 적용된 행의 개수를 리턴

executeQuery();

ResultSet 클래스 리턴

쿼리를 실행한 뒤, 조회된 결과를 ResultSet에 담아 테이블 형태로 리턴

execute(); 메서드를 사용하면 결과값이 ResultSet형태일 때 true를 리턴해줍니다.

executeUpdate(); 메서드는 쿼리를 실행했을 때, 적용된 행의 개수를 돌려주며

executeQuery(); 메서드는 쿼리 실행과 동시에 ResultSet 클래스로 되돌려줍니다.


2. setString(), setInt(), setDouble()

이 메서드는 쿼리문이 유동적일 때에 유동적으로 변경할 부분을 ?으로 작성하고, 이후에 값들을 변경하여 최종적인 쿼리문을 완성합니다.

setString(n, [문자]);

n번째 물음표에 [문자]를 String타입으로 삽입, 외따옴표는 자동추가된다.

setInt(n, [정수]);

n번째 물음표에 [정수]를 Int타입으로 삽입

setDouble(n, [실수]);

n번째 물음표에 [실수]를 Double타입으로 삽입

만약 "INSERT INTO ex_table VALUES (?, ?, SYSDATE)"라는 쿼리문을 작성하였다면 ?으로 표시한 부분들을 원하는 문자로 삽입할 수 있게 도와주는 메서드입니다.

"INSERT INTO ex_table VALUES (?, ?, SYSDATE)" 쿼리문을 기준으로

setInt(1, 4); 라는 코드를 작성하면 1번째 물음표에 정수 4를 삽입하라는 뜻이며,

setString(2, "홍길동"); 라는 코드를 작성한다면 2번째 물음표에 홍길동 이라는 문자열이 추가되며 이 때에 외따옴표('')는 자동으로 추가되어 신경쓰지 않아도 됩니다.

setDouble(); 또한 setInt와 동일하게 사용 가능합니다.

 

따라서 반복하여 레코드를 삽입해야 할 때에 위 메서드를 사용하면 빠르고 쉽게 많은 레코드를 삽입할 수 있습니다.

예시)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

public class JdbcTest01 {

public static void main(String[] args) {

String id = "ex_user";

String password = "expassword";

String url = "jdbc:oracle:thin:@localhost:1521:xe";

Connection cn = null;

PreparedStatement ps = null;

boolean sw = true;

Scanner sc = new Scanner(System.in);

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

 

cn = DriverManager.getConnection(url, id, password);

 

while(sw) {

ps = cn.prepareStatement("INSERT INTO ex_table VALUES (ex_seq.NEXTVAL, ?, SYSDATE)");

System.out.println("이름 입력/n취소 입력시 끝");

String name = sc.next();

if(name.equals("취소")) {

System.out.println("작성 끝");

sw = false;

}else {

ps.setString(1, name); // 첫번째 물음표에 이름 삽입

ps.execute(); // 이름을 삽입한 레코드를 테이블에 추가

}

}

}catch(Exception e) {

e.printStackTrace();

}finally {

try {

if(ps != null) { // PreparedStatement ps가 아직 null인 경우는 닫을 필요가 없기 때문에 작성

ps.close();

}

if(cn != null) { // Connection cn이 아직 null인 경우는 닫을 필요가 없기 때문에 작성

cn.close();

}

}catch (Exception e) {

e.printStackTrace();

}

}

}

}

위 코드는 반복하여 이름을 입력받고 해당 이름을 ex_table에 추가하는 코드입니다.

실제 실행시에 콘솔을 통하여 이름을 입력하여 "김일번", "김이번", "김삼번"을 추가하였습니다.

커맨드창에서 확인하였을 때에도 정상적으로 세개의 레코드가 추가됨을 확인할 수 있습니다.

반응형