[JDBC] PreparedStatement 개념 및 예제
- JDBC
- 2019. 4. 21. 17:30
Statement 클래스
- SQL 구문을 실행하는 역할
- 스스로는 SQL 구문 이해 못함(구문해석 X) -> 전달역할
- SQL 관리 O + 연결 정보 X
PreparedStatement 클래스
- Statement 클래스의 기능 향상
- 인자와 관련된 작업이 특화(매개변수)
- 코드 안정성 높음. 가독성 높음.
- 코드량이 증가 -> 매개변수를 set해줘야하기 때문에..
- 텍스트 SQL 호출
Statement 클래스의 sql
String name = "홍길동";
String memo = "메모 테스트 입니다. 홍길동's 메모장";
String priority = "1";
String sql = String.format("insert into tblMemo values(memoSeq.nextval,'%s','%s',default,%s)", name, memo, priority);
-> 이런식으로 매개변수를 줘야함.
PreparedStatement 클래스의 sql
sql = "insert into tblMemo values(memoSeq.nextval,?,?,default,?)";
pstat = conn.prepareStatement(sql);
//매개변수 값 대입 + 매개변수 유효화 처리.
pstat.setString(1, name);
pstat.setString(2, memo);
pstat.setString(3, priority);
PrepareStatement 예제
- Connection 객체 가져오는 DBUtil 클래스의 getConnection() 메소드를 사용할 것임.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class DBUtil { public static Connection getConnection() { Connection conn = null; String url = "jdbc:oracle:thin:@localhost:1521:xe"; String id = "hr"; String pw = "java1234"; try { Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection(url, id, pw); return conn; } catch (Exception e) { System.out.println("DBUtil.getConnection() : " + e.toString()); } return null; } } | cs |
1. 정적 쿼리(매개변수가 없거나.. 쿼리 구문이 변화가 없는 쿼리) -> executeUpdate() 메소드 사용.(숫자 반환)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class Example{ private static void m3() { Connection conn = null; PreparedStatement stat = null; ResultSet rs = null; try { conn = DBUtil.getConnection(); String sql = "delete from tblMemo"; stat = conn.prepareStatement(sql); System.out.println(stat.executeUpdate()); stat.close(); conn.close(); } catch (Exception e) { System.out.println("JDBCTest.m2()" + e.toString()); } } } | cs |
2. 단일컬럼 가져올때( count(*) 함수의 결과 가져오는 경우같은 경우)
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 | public class Example{ private static void m() { //식별자(컬럼, 테이블)를 매개변수로 하는 업무 //사용자입력(테이블명) : tblAddressBook //결과 : 행의갯수 출력. String tableName = "zipcode"; Connection conn = null; Statement stat = null; ResultSet rs = null; try { conn = DBUtil.getConnection(); stat = conn.createStatement(); String sql = String.format("select count(*) as cnt from %s",tableName); rs= stat.executeQuery(sql); if(rs.next()) { System.out.println("행의 갯수 : "+rs.getInt("cnt")); } stat.close(); conn.close(); } catch (Exception e) { System.out.println("JDBCTest.m2()" + e.toString()); } } } | cs |
String sql = "select count(*) as cnt from ?"; 이렇게는 사용할 수 없음, table은 값이 dataType을 가지는 존재가 아니기 때문에..
String sql = "select count(*) as cnt from table where city = ?"; -> 매개변수가 서울 인 경우 stat.setString(1,'서울');로 처리할 수가 있음, 하지만 setString()시 테이블명을 넣지는 않음. 엄밀히 말해서 Oracle Object에 해당하는 것은 올 수 없음.
3. 다중 루프 쿼리, 부모 & 자식 테이블의 내용을 동시에 출력하는 경우
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 | public class Example{ private static void m() { //주요정보 출력(유저 명단) Connection conn = null; PreparedStatement stat = null; ResultSet rs = null; try { conn = DBUtil.getConnection(); String sql = "select * from tblUser order by id asc"; stat = conn.prepareStatement(sql); System.out.println("==== 유저목록 ===="); rs= stat.executeQuery(); while(rs.next()) { System.out.printf("%s\t%s\t%s\t\n" ,rs.getString("id") ,rs.getString("name") ,rs.getString("grade")); } rs.close(); stat.close(); conn.close(); } catch (Exception e) { System.out.println("JDBCTest.m2()" + e.toString()); } } } | cs |
'JDBC' 카테고리의 다른 글
[JDBC] Statement 클래스 (2) | 2019.03.30 |
---|---|
[JDBC] JDBC Conncetion 객체 반환 메소드 만들기(오라클 DB 연동) (0) | 2019.03.25 |
[JDBC] 오라클과 JDBC 연결하는 방법 (2) | 2019.03.24 |