좌선
좌선의 개발일지
좌선
전체 방문자
오늘
어제
  • 분류 전체보기 (79)
    • 개발환경 (3)
    • 알고리즘 (10)
      • 코딩테스트 (9)
      • 알고리즘 (1)
    • Java (54)
      • JPA (6)
      • Spring (5)
      • SpringBoot (15)
    • Network (2)
    • Database (1)
    • Git (2)
    • & (1)
    • Exception (3)
    • Study (0)
      • RealMySQL (0)
    • 회고 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자바웹을다루는기술
  • 더티체킹
  • 자바 웹을 다루는 기술
  • AWS
  • Spring Data JPA
  • TDD 실천법과 도구
  • programmers
  • 쿼리로그
  • Mustache
  • 머스테치
  • dirtychecking
  • 프로그래머스
  • 테스트주도개발
  • SpringBoot
  • 스프링부트와 AWS로 혼자 구현하는 웹 서비스
  • 다트게임
  • 스프링부트
  • 코드로배우는스프링웹프로젝트
  • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스
  • Spring

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
좌선

좌선의 개발일지

Java

JDBC PreparedStatement

2021. 3. 31. 20:28

PreparedStatement

미리 SQL문이 셋팅된 Statement가 DB에 전송되어져서 컴파일 되어지고

SQL문의 '?'만 나중에 추가 세팅해서 실행되어지는 준비된 statement

 

장점

1. statement에 비해 반복적인 SQL문을 사용할 경우에 더 빠르다. ex. 검색문

2. DB컬럼타입과 상관없이 ? 하나로 표시하면 되므로 개발자가 헷갈리지 않고 쉽다. ex. insert문

   -> ?를 제외한 SQL문이 DB에서 미리 컴파일되어져서 대기

 

단점

SQL문마다 PreparedStatement 객체를 각각 생성해야 하므로 재사용불가

 -> statement 객체는 SQL 문이 달라지더라도 한 개만 생성해서 재사용이 가능

 

특징

Statement stmt = conn.createStatement(); //생성.. stmt.execute(sql)실행

PreparedStatement pstmt = conn.prepareStatement(sql) //생성.. pstmt.execute()

 

주의

DB 객체들(table..)의 뼈대(테이블명 or컬럼명 or시퀀스명 등의 객체나 속성명)은 '?'로 표시할 수 없다

data 자리에만 ?로 표시할 수 있음

 

Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	
	try{
		conn = SingletonHelper.getConnection("oracle");
		String sql = "select empno, ename from emp where deptno=?";
		
		//where empno=? deptno=? and sal > ?
		//pstmt.setInt(1, 7788);
		//pstmt.setString(2, 30);
		//pstmt.setInt(3, 1000);
		
		//stmt = conn.createStatement();
		pstmt = conn.prepareStatement(sql); //명령객체 생성시 oracle 쿼리 미리 보내서 컴파일
		
		pstmt.setInt(1, 30); //? > parameter 설정
		
		//rs = stmt.executeQuery(sql);
		rs = pstmt.executeQuery(); //여기서 실행시 oracle parameter 값만
		
		if(rs.next()){
	do{
		System.out.println(rs.getInt("empno") + "/" + rs.getString("ename"));
	}while(rs.next());
		}else {
	System.out.println("조회된 데이터가 없습니다.");
		}
	}catch(Exception e){
		
	}finally{
		SingletonHelper.close(pstmt);
		SingletonHelper.close(rs);
		//SingletonHelper.close(conn) 공유객체 (singleton)안돼요...
	}
try{
		conn = SingletonHelper.getConnection("oracle");
		String sql = "update dmlemp set ename=?, sal=?, deptno=?, job=? where empno=?";
		pstmt = conn.prepareStatement(sql); //미리 쿼리문 컴파일
		
		//parameter 설정
		pstmt.setString(1, "방가");
		pstmt.setInt(2, 20000);
		pstmt.setInt(3, 20);
		pstmt.setString(4, "IT");
		pstmt.setInt(5, 7499);
		
		//실행
		int row = pstmt.executeUpdate();
		if(row > 0){
	out.print("<b>update row count </b>" + row);
		}else {
	out.print("<b>row count :</b>"+row);
		}
	}catch(Exception e){
		
	}finally{
		SingletonHelper.close(pstmt);
	}
    'Java' 카테고리의 다른 글
    • Servlet 애너테이션을 이용한 서블릿 매핑
    • Servlet
    • JDBC SingletonHelper
    • JDBC DML(insert, update, delete)
    좌선
    좌선
    얼렁뚱땅 천방지축 굴러가는 개발자의 삶

    티스토리툴바