2011년 6월 9일 목요일

JDBC 2.0 사용법

2. JDBC 2.0
Scrollable ResultSet 에서 커서 움직이기
ResultSet을 스크롤 가능하게 만들어 커서를 원하는 레코드로 옮길 수 있으며 갱신도 가능합니다. 다음과 같이 생성합니다.
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet srs = stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");

  • TYPE_SCROLL_SENSITIVE : 스크롤 가능하며 업데이트가 발생하면 바로 반영됩니다.
  • TYPE_SCROLL_INSENSITIVE : 스크롤 가능하며 업데이트가 발생해도 반영되지 않습니다.
  • TYPE_FORWARD_ONLY : 스크롤이 되지 않으며 다음 Row 만 진행합니다.
  • CONCUR_READ_ONLY : ResultSet 을 갱신할수 없으며 읽기만 가능.
  • CONCUR_UPDATABLE : ResultSet 을 갱신 할수 있음.
    /**
    Scroll기능을 사용하기 않습니다.
    */
    Statement stmt =
    con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_READ_ONLY);
    ResultSet srs =
    stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");
    while (srs.next()) {
    String name = srs.getString("COF_NAME");
    float price = srs.getFloat("PRICE");
    System.out.println(name + " " + price);
    }


     
    /**
    다음은 Scroll 기능을 사용한 경우입니다.
    */
    Statement stmt =
    con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY);
    ResultSet srs =
    stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");
    srs.afterLast();
    while (srs.previous()) {
    String name = srs.getString("COF_NAME");
    float price = srs.getFloat("PRICE");
    System.out.println(name + " " + price);
    }


    위의 두 코드는 유사하지만 자세히 보면 아래의 코드는 srs.afterLast(); 이 추가되어 있습니다. 즉, 커서를 마지막 레코드 다음으로 이동하여 반대로 결과를 출력하게 됩니다.
    <Method>
    .first() - 처음 레코드로 이동
    .last() - 마지막 레코드로 이동
    .beforeFirst() - 처음 레코드 전으로 이동
    .afterLast() - 마지막 레코드 다음으로 이동
    .absolute(양수 혹은 음수) - 수만큼 앞(양수) 뒤(음수)로 이동
    .relative(양수 혹은 음수) - 현 위치에서 수만큼 앞(양수) 뒤(음수)로 이동

    ResultSet 과 DB 를 메소드를 이용해 Update, Insert, Delete 하기
    Update
    uprs.last();
    uprs.updateFloat("PRICE", 10.99f); //ResultSet update
    uprs.updateRow(); //DB Table update

    ResultSet uprs 에서 마지막 레코드로 이동 후 PRICE 필드를 10.99로 update 합니다. updateRow()는 실제 데이타 베이스 테이블을 update 합니다.

    Insert
    Statement stmt =
    con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_UPDATABLE);
    ResultSet uprs =
    stmt.executeQuery("SELECT * FROM COFFEES");
    uprs.moveToInsertRow();
    uprs.updateString("COF_NAME", "Kona");
    uprs.updateInt("SUP_ID", 150);
    uprs.updateFloat("PRICE", 10.99);
    uprs.updateInt("SALES", 0);
    uprs.updateInt("TOTAL", 0);
    uprs.insertRow();

    moveToInsertRow() 는 삽입 위치로 커서를 옮깁니다.
    insertRow() 에서 하나의 레코드가 insert 됩니다.

    Delete
    uprs.absolute(4);
    uprs.deleteRow();

    네번째 레코드로 이동하여 delete 합니다.
     
    Batch Update
    Transaction 처럼 update를 일련의 단위로 처리 합니다.
    con.setAutoCommit(false);
    stmt = con.createStatement();
    stmt.addBatch("INSERT INTO COFFEES " +
    "VALUES('Amaretto', 49, 9.99, 0, 0)");
    stmt.addBatch("INSERT INTO COFFEES " +
    "VALUES('Hazelnut', 49, 9.99, 0, 0)");
    stmt.addBatch("INSERT INTO COFFEES " +
    "VALUES('Amaretto_decaf', 49, 10.99, 0, 0)");
    stmt.addBatch("INSERT INTO COFFEES " +
    "VALUES('Hazelnut_decaf', 49, 10.99, 0, 0)");
    int [] updateCounts = stmt.executeBatch();
    con.commit();
    con.setAutoCommit(true);

    addBatch()로 statement를 추가 후 executeBatch()로 수행된다.

    JDBC 2.0 옵션 패키지 API 로 도입된 javax.sql 기능
    접속을 확립하기 위한 수단으로서의DataSource 인터페이스. Java Naming and Directory InterfaceTM (JNDI)는 DataSource 오브젝트를 네임 서비스에 등록해, 그것을 취득하는데 사용한다.

    풀 접속 -- 접속의 사용과 재이용을 가능하게 한다.
    분산 트랜잭션(transaction) -- 다양한 DBMS 서버에 이르는 트랜잭션(transaction)를 가능하게 한다.
    RowSet 테크놀러지 -- 데이터를 처리해 건네주는 편리한 수단을 제공한다.

    UDT 의 커스텀 매핑
    SQL로 정의한 유저 정의형 (UDT)을 Java 프로그램 언어의 클래스에 매핑할 수가 있습니다. SQL 구조화형 또는 SQL DISTINCT 형이, 커스텀 매핑 할 수 있는 UDT 입니다. 다음의 3 단계로, 커스텀 매핑을 설정합니다.
    • SQL 구조화형 또는 SQL DISTINCT 형을 SQL로 정의합니다.
    • SQL UDT를 매핑 하는 Java 프로그램 언어의 클래스를 정의합니다.
    • 이 클래스는 SQLData 인터페이스를 구현하고 있을 필요가 있습니다.

    다음의 2 항목을 포함한 Connection 오브젝트의 형태 맵에 엔트리를 작성합니다.
    • UDT 의 완전 지정된 SQL 명
    • SQLData 인터페이스를 구현하는 클래스의 Class 오브젝트

    이것들이 UDT 의 해당 위치에 있으면(자), 메소드 ResultSet.getObject 또는 메소드 CallableStatement.getObject 를 호출했을 경우에 UDT 는 자동적으로 UDT 에의 커스텀 매핑을 취득합니다. 또,PreparedStatement.setObject 는 오브젝트를 그 SQL 형에 자동적으로 매핑 해 데이터 소스에 오브젝트를 격납합니다.

    JDBC 2.1 코어 API 로 도입된 java.sql 기능
    • 스크롤 가능한 결과 세트 -- 현재 위치에 관련하는 특정의 행 또는 위치에의 커서의 이동을 가능하게 하는,ResultSet 인터페이스의 새로운 메소드를 사용
    • 배치 갱신
    • 프로그램의 갱신 -- ResultSet 갱신용 메소드를 사용
    • 새로운 데이터형 -- SQL3 데이터형을 매핑 하는 인터페이스
    • 유저 정의형 (UDT)의 커스텀 매핑
    • 그 외의 기능으로서 퍼포먼스의 힌트, 문자 Stream의 사용,java.math.BigDecimal 치의 전정밀도, 추가 시큐러티, 날, 시간, 및 타임 스탬프의 각 치에서의 타임 존의 서포트 등

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...