2024.03.04

김무영·2024년 3월 7일

PreparedStatement

  • 쿼리문을 미리 만들어두고, bind변수를 사용하여 값만 나중에 넣어서 실행하는 객체
  • 사용법
    1. 드라이버로딩
    2. 커넥션얻기
    3. 쿼리문 생성객체(PreparedStatement) 얻기 ( 바인드변수 사용 )
      String insert=“insert into dept(deptno,dname,loc) values(?, ?, ?);
      PreparedStatement pstmt=con.prepareStatement( insert );
    4. 바인드변수에 값 설정
      • 정수값 : pstmt.setInt( 인덱스, 정수값 );
      • 실수값 : pstmt.setDouble( 인덱스, 실수값 );
      • 문자열 : pstmt.setString(인덱스, 문자열값);
      • 날짜 : pstmt.setDate( 인덱스. java.sql.Date)
    5. 쿼리문 수행 후 결과 얻기 ( 부모(Statement)의 method (executeXxx())를 사용하지 않도록 주의 )
      • create, drop, alter, grant, revoke => pstmt.execute()
      • insert, update, delete => pstmt.executeUpdate();
      • select => pstmt.executeQuery()
    6. 연결끊기

PreparedStatement

  • 바인드 변수

PreparedStatement pstmt = con.prepareStatement(sql);
// 바인드 변수는 %와 함께 사용하면 인식을 못함.

  • 바인드 변수에 값 설정
    pstmt.setString(1,값)
  • // 해결 : %를 Oracle 일반 문자열로 만들어 바인드변수와 붙임(||).

Singleton Pattern

  • 실행중인 JVM에서 하나의 instance만 생성하고 사용하는 design pattern.

  • 장점 : 속도가 빠르다, 메모리 사용량이 적다.

  • 단점 : singleton pattern은 사용중에 객체가 소멸되면 다시 살아나지 못한다.
    -객체가 소멸되었을 때 다시 생성하는 코드를 작성해야한다.

  • 값은 저장하지 않고, 업무를 수행해야하는 상황에서 사용.

  • 작성법)

    1. 클래스외부에서 직접 객체화 할 수 없도록 막는다.
      생성자의 접근 지정자를 private으로 설정
      public class Test{
      private static Test t;
      private Test(){
      }
    2. instance를 반환하는 method작성
      public static Test getInstance(){
      // 외부에서 클래스명.mehtod명으로 호출 가능.
      // 사용)
      // Test t=Test.getInstance();
    3. 객체를 하나로 유지하고, 반환하는 코드 작성
      if( t == null ){
        t=new Test();
      }//end if
      return t;
        }
      }

ResultSetMetaData

  • DD를 사용하지 않고 select쿼리에서 사용하는 테이블의 스키마 정보를 얻는 객체.
  • ResultSet으로 부터 얻어진다.
  • 사용법)
    1. ResultSet에서 ResultSetMetaData를 얻는다.
      ResultSetMetaData rsmd = rs.getMetaData();
    2. method를 사용하여 테이블 schema 정보를 얻는다. (desc 테이블명 을 했을 때의 정보가 나온다.)
    • 컬럼의 개수 : int columnCnt = rsmd.getColumnCount();
    • 컬럼의 이름 얻기 : String columnName = rsmd.getColumnName(인덱스);
    • 컬럼의 데이터 형 명 얻기 : String columnLabel = rsmd.getColumnTypeName(인덱 스);
    • 컬럼의 데이터 형 크기 : int size = rsmd.precision(인덱스);
    • 널 허용 여부 : int flag = rsmd.isNullable(인덱스);

CLOB(Character Large Object)얻기

  • 4000Byte이상의 문자열을 저장해야 하는 경우.
  • rs.getString() 사용하여 컬럼 값을 얻을 수 있긴 하나, 별도의 Stream을 연결하여 사용하는 것을 권장한다.
  • 사용법 )
    1. rs에서 clob를 얻는다.
    Clob clob = rs.getClob();
    1. 스트림 얻기
    Reader r = clob.getCharacterStream();
    1. 줄단위로 읽을 수 있는 Stream과 연결
    BufferedReader br = new BufferedReader(r);
    • 한번에 작성하기
      BufferedReader br = new BufferedReader(clob.getCharacterStream());
    1. Stream을 사용해서 DBMS Table 컬럼의 문자열 읽기
    STring str="";
    while((str = br.readLine)!=null){
    str
    }

  • insert => pstmt.executeUpdate() 실행 1 또는 예외가 발생
  • update, delete => pstmt.executeUpdate() 실행 0~n 또는 예외가 발생

0개의 댓글