* ResultSet?
결과가 아니다! 서버에서 결과를 가져오는 일을 할 객체이다.
즉 서버의 select 실행 결과를 가져올 때 사용하는 도구이다.
*executeQuery()
-DBMS 서버에 select 문을 보낸다.
-리턴 값: java.sql.ResultSet 구현 객체
DBMS에 SQL문 보내기 : select
select * from x_board order by board_id desc
getXxx(컬럼명):
컬럼의 번호를 지정하는 방식은 소스 코드를 읽을 때 매우 불편하다.
해당 번호가 어떤 컬럼을 가리키는지 알려면
select 문을 살펴봐야 하는 번거로움이 있다.
가능한 번호 대신 컬럼의 이름을 사용한다.
반복문을 사용하면 서버에서 여러 개의 데이터를 가져올 수 있다.
- next()는 서버에서 레코드 1개를 가져온다.
while (rs.next()) {}
컬럼 타입에 상관없이 getString()으로 값을 꺼낼 수 있다.
DBMS에 SQL문 보내기 : update
executeUpdate()
DBMS 서버에 update 문을 보낸다.
리턴 값: 변경된 레코드의 개수이다.
DBMS에 SQL문 보내기 : delete
부모 테이블의 데이터를 지우려면,
부모 테이블의 데이터를 참조하는 자식 테이블의 데이터를 먼저 지워야 한다.
1) 게시글을 참조하는 첨부 파일 데이터를 먼저 지운다.
delete from x_board_file where board_id = 1
2) 부모 테이블의 데이터를 지운다.
delete from x_board where board_id = 1
Statement vs PreparedStatement
1) SQL 문장의 간결함
[Statement]
- 값을 가지고 문자열로 직접 SQL 문을 만들기 때문에 작성하거나 읽기 힘들다.
[PreparedStatement]
- SQL 문장과 값이 분리되어 있기 때문에 작성하거나 읽기 쉽다.
2) SQL 삽입 공격
[Statement]
- 사용자가 입력한 값을 가지고 SQL 문장을 만들기 때문에 해킹되기 쉽다.
[PreparedStatement]
- SQL 문장과 값이 분리되어 다뤄지기 때문에 해킹할 수 없다.
3) 바이너리 데이터 다루기
[Statement]
- 문자열로 SQL 문장을 만들기 때문에
바이너리 타입의 컬럼 값을 설정할 수 없다.
[PreparedStatement]
- setXxx() 메서드를 호출하여 값을 설정하기 때문에
바이너리 타입의 컬럼 값을 설정할 수 있다.
4) 실행 속도
[Statement]
- executeUpdate()를 실행할 때 SQL 문을 파라미터로 전달한다.
- 호출될 때마다 SQL 문법을 분석하기 때문에 반복 실행하는 경우
SQL 문법도 반복 분석하므로 실행 속도가 느리다.
[PreparedStatement]
- 미리 SQL 문을 작성한 다음 DBMS 프로토콜에 맞게 파싱해 놓은 후,
executeUpdate() 호출한다.
- 따라서 executeUpdate()를 호출할 때 마다 SQL 문법을
분석하기 않으므로 반복해서 실행하는 경우,
Statement 보다 실행 속도가 빠르다.
insert 한 후 auto increment PK 값 리턴 받기
1) 사용자로부터 제목, 내용을 입력 받는다.
2) 입력 후 PK 값을 리턴 받고 싶다면,
PreparedStatement 객체를 얻을 때 다음과 같은 옵션을 지정하라!
- prepareStatement(sql, 자동생성된 PK 값 리턴 여부)
PreparedStatement stmt = con.prepareStatement(
"insert into x_board(title,contents) values(?,?)",
Statement.RETURN_GENERATED_KEYS);) {
stmt.setString(1, title);
stmt.setString(2, contents);
int count = stmt.executeUpdate();
System.out.printf("%d 개 입력 성공!\n", count);
// insert 수행 후 자동 생성된 PK 값은 따로 요구해야 한다.
try (ResultSet rs = stmt.getGeneratedKeys()) {
// insert를 한 개만 했기 때문에 PK도 한 개만 생성되었다.
// 따라서 ResultSet에 대해 여러 번 반복을 할 필요가 없다.
rs.next();
// 자동 생성된 PK 값을 꺼낼 때는 컬럼 이름이나 PK 컬럼의 인덱스로 꺼낸다.
int no = rs.getInt("board_id");
int no2 = rs.getInt(1);
System.out.printf("입력된 게시글 번호: %d,%d\n", no, no2);
'DB' 카테고리의 다른 글
Mybatis - useGeneratedKeys (0) | 2021.10.22 |
---|---|
mybatis - Data Persistence Framework, SqlSession 사용법, SQL 문에 삽입할 파라미터 전달하기 (0) | 2021.10.21 |
데이터 관리를 DBMS에게 맡기기 : JDBC API 사용 (0) | 2021.10.19 |
Join, 서브쿼리, 그룹으로 묶기 (0) | 2021.10.11 |
FK(Foreign Key) (0) | 2021.10.11 |