본문 바로가기

개발자노트/DBMS

[SQL] JDBC에서 [PreparedStatement=pstmt] 를 이용한 정보맵핑

PreparedStatement 

- 쉽게 stmt 상위호환이다.

- ?에 값을 넣을 수 있도록 함(매핑 느낌)

 

기본 사용 방법

Connection conn; // 커넥션 객체 생성
PreparedStatement pstmt; // pstmt 객체 생성

pstmt=conn.prepareStatement(sql) // 만들 적에 sql문이 들어간다!

 

그렇다면 stmt와의 차이점은 무엇인가?

stmt -> 일단 만들고, 직접 쿼리문(SQL문)을 메서드의 인자로 전달
pstmt -> 만들당시에 쿼리문(SQL문)을 전달하고, 이후에 값을 메서드의 인자로 전달

 

 

CRUD 중 C에 해당되는 Insert에 적용해보기.

내가 가지고 있는 테이블은 atrribute로

SID INT PRIMARY KEY,  -- PK
NAME VARCHAR(20) NOT NULL, -- 이름은 NULL이 될 수 없음
SCORE INT DEFAULT 0 -- 입력값이 없으면 0점으로

를 가지고 있다.

Connection conn; // 먼저 conn 객체 생성
PreparedStatement pstmt; // pstmt 객체 생성
final String sql_insert="INSERT INTO STUDENT VALUES((SELECT NVL(MAX(SID),0)+1 FROM STUDENT),?,?)";
// insert는 수정 할 일이 없으니 final을 사용해주고, SID값은 중복이 없게끔 MAX+1 만약 MAX가 없다면 0으로 취급하는
// 이중쿼리로 설정해줌,
// 이제 ?, ? 에 입력값을 넣어주면 된다.
	try {			
		pstmt=conn.prepareStatement(sql_insert); 
		pstmt.setString(1, vo.getName()); // 인자의 1번 자리에 객체의 이름
		pstmt.setInt(2, vo.getScore()); // 인자의 2번자리에 객체의 점수
		int res=pstmt.executeUpdate();
		System.out.println("	로그: insertStudent() 완료"); // 학생추가가 성공했을 때 로그
		if(res==0) { // 학생에 올바른 정보가 들어오지 않으면
			return false; // false
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		} finally {
			JDBCUtil.disconnect(pstmt, conn); // 사용을 했으니 닫아준다.
		}

		return true;
	}

이렇게 [PreparedStatement =pstmt] 를 사용하여

특정한 값을 데이터베이스에 추가할 때 매핑해서 저장을 할 수 있게 되었다.