- xrath.com 에서 번역됨

# Blob

## 8.1 Blob 의 개요

`Blob` 객체란, SQL 의 `BLOB` (2 진라지 객체)를 Java 프로그램 언어에 매핑 한 표현 형식입니다. SQL 의 `BLOB` 는, 2 진라지 객체를 데이타베이스 테이블의 은행내에 열의 값으로 해서 포함하는 편입의 형태입니다. 프로그래머는,`ResultSet`,`CallableStatement`, 및 `PreparedStatement` 인터페이스내의 메소드를 사용해, SQL92 의 편입형에 액세스 하는 것과 같이 SQL3 형 `BLOB` 에 액세스 할 수 있습니다. 즉, JDBC 2.0 API 를 사용하는 어플리케이션에서는,`BLOB` 치에 대한 `getBlob` 및 `setBlob` 등의 메소드가,`INTEGER` 치에 대한 `getInt` 및 `setInt`,`CHAR` 치 또는 `VARCHAR` 치에 대한 `getString` 및 `setString` 와 같이 사용됩니다.

표준적인 구현의 경우, JDBC 드라이버는, 뒤에서 SQL 의 `LOCATOR(BLOB)` 형을 사용해 `Blob` 인터페이스를 구현합니다. `LOCATOR(BLOB)` 에 의해 데이터 베이스 서버-위의 SQL 의 `BLOB` 치가 지정되어 locator상의 조작에 의해 얻을 수 있는 결과는,`BLOB` 치 자체에서의 조작과 같습니다. 즉, 클라이언트 머신상에서 `BLOB` 데이터를 생성하지 않아도 `Blob` 인스턴스상에서 조작이 가능해서, 클라이언트 머신의 퍼포먼스가 현저하게 향상합니다. `LOCATOR(BLOB)` 는, 드라이버에 의해 뒤에서 사용되기 (위해)때문에, 프로그래머는 JDBC 드라이버를 완전하게 투과적으로 사용합니다.

`Blob` 인스턴스의 표준적인 동작은, 이 인스턴스가 작성된 트랜잭션(transaction)가, 확정 또는 원래대로 돌아갈 때까지 유효합니다.

`Blob` 인터페이스에는, SQL 의 `BLOB` 치의 길이를 취득하는 메소드나, 클라이언트상에서 `BLOB` 치를 생성하는 메소드, 및 `BLOB` 치내의 바이트의 패턴의 위치를 판단하는 메소드가 준비되어 있습니다.

### 8.1. 1 Blob 객체의 생성

다음의 코드는,`Blob` 객체의 작성 방법을 나타내고 있습니다. `stmt` 는,`Statement` 객체입니다.

>     ResultSet rs = stmt.executeQuery("SELECT DATA FROM TABLE1");
>     rs.first();
>     Blob data = rs.getBlob("DATA");

변수 `blob` 에는,`BLOB` 치에의 논리 포인터가 포함됩니다. 이 `BLOB` 치는, 결과 세트 `rs` 의 최초의 행의 `DATA` 열에 포함됩니다. `BLOB` 치에는 데이터가 포함되지 않습니다만, JDBC 메소드에 관해서는, 포함되어 있도록(듯이) 조작됩니다.

### 8.1. 2 Blob 데이터의 구체화

프로그래머는,`Blob` 객체상에서, 그 객체로 지정한 SQL `BLOB` 상에서 조작하고 있는것 같이, JDBC API 내의 메소드를 호출할 수가 있습니다. 다만,`Blob` 객체를 Java 프로그램 언어내의 객체와 같이 조작하는 경우는, 먼저 클라이언트상에서 구체화할 필요가 있습니다. `Blob` 인터페이스에는,`Blob` 객체를 구체화하는 2 개의 메소드가 있습니다. 입력 스트림로서 `BLOB` 치를 구체화하는 `getBinaryStream` 와`BLOB` 치의 모두 또는 일부를 바이트 배열로서 구체화하는 `getBytes` 입니다. 다음의 코드에서는,`blob` 로 지정한 `BLOB` 치의 모든 데이터를 입력 스트림로서 구체화합니다.

>     java.io.InputStream in = blob.getBinaryStream();
>     byte b;
>     while ((in.read()) > -1) {
>     	b = in.read();
>     	System.out.println(b);
>     }
>     // prints out all the bytes in the BLOB value that blob designates

다음의 코드도 `blob` 로 지정한 `BLOB` 치의 모든 데이터를 구체화합니다만, 입력 스트림이 아니고, 바이트 배열로서 구체화합니다.

>     long len = blob.length();
>     byte [] data = blob.getBytes(1, len);
>     for (int i = 0; i < len; i++) {
>     	byte b = data[i];
>     	System.out.println(b);
>     }
>     // prints out all the bytes in the BLOB value that blob designates

`data` 변수에는,`blob` 가 지정한 `BLOB` 치내의 모든 바이트의 카피가 포함됩니다. 이것은,`getBytes` 메소드에게 건네진 인수가 `BLOB` 치 전체를 지정하기 (위해)때문에입니다. 최초의 인수는 최초의 바이트로 시작되는 바이트를 돌려주는 것을 지정해, 2 번째의 인수는,`BLOB` 치의 길이의 바이트수를 돌려주는 것을 지정합니다. 다음의 코드행에서는, 256 번째의 바이트로부터 시작되는 1024 바이트가 구체화됩니다.

>     byte [] data = blob.getBytes(256, 1024);
>     byte b = data[0];
>     // data contains bytes 256 through 1280 in the BLOB value that blob
>     // designates; b contains the 256th byte

여기서 유의할 필요가 있는 중요한 점은, SQL 와 Java 프로그램 언어의 상위에 의해, SQL 에서는 `BLOB` 치의 최초의 바이트가 포지션 `1` 에 있는데 대해, Java 프로그램 언어에서는 배열의 최초의 요소가 첨자 `0` 에 있는 것입니다.

### 8.1. 3 Blob 객체의 포함

`Blob` 객체를 데이타베이스에 포함하려면 ,`Blob` 객체를,`PreparedStatement` 메소드의 `setBlob` 에 파라미터로서 건네줍니다. 예를 들어 다음의 코드예에서는,`PreparedStatement` 객체의 `pstmt` 에의 최초의 입력 파라미터로서 건네주는 것으로,`Blob` 객체의 `stats` 가 포함됩니다.

>     Blob stats = rs.getBlob("STATS");
>     PreparedStatement pstmt = con.prepareStatement(
>     	"UPDATE SIGHTINGS SET MEAS = ?  WHERE AREA = 'NE'");
>     pstmt.setBlob(1, stats);
>     pstmt.executeUpdate();

`stats` 가 지정하는 `BLOB` 치는,`SIGHTINGS` 테이블내에서,`AREA` 열에 `NE` 가 포함되어 있는 행의 `MEAS` 열에 포함됩니다.

## 8.2 Blob 인터페이스의 정의

>     package java.sql;
>     public interface Blob {
>     	long length() throws SQLException;
>     	InputStream getBinaryStream() throws SQLException;
>     	byte[] getBytes(long pos, int length) throws SQLException;
>     	long position(byte [] pattern, long start) throws SQLException;
>     	long position(Blob pattern, long start) throws SQLException;
>     }

## 8.3 Blob 의 메소드

    InputStream getBinaryStream() throws SQLException

> 이 `Blob` 객체에 의해 해석되어 있지 않은 바이트의 스트림로서 지정되는 `BLOB` 치를 구체화합니다.

> 반환값:

> 이 `Blob` 객체에 의해 지정되는 `BLOB` 치의 데이터가 포함된 `InputStream` 객체

> 례:

>     InputStream in = blob.getBinaryStream();
>     // in has the data in the BLOB value that blob designates

#### getBytes

    byte[] getBytes(long pos, int length) throws SQLException

> 이 `Blob` 객체가 바이트의 배열로서 지정하는 `BLOB` 치의 일부 또는 모든 것을 구체화합니다. 바이트 배열에는,`pos` 의 위치로부터 시작되는 최대 `length` 가 연속한 바이트가 포함됩니다.

> 파라미터:

> pos |  | 추출되는 최초의 `byte` 의 `BLOB` 치의 번호 붙이고 된 위치에서, 최초의 `byte` 는 `1` 의 위치
> length |  | 카피되는 연속한 바이트수

> 반환값:

> 이 `Blob` 객체에 의해 나타나는 `BLOB` 치의 `pos` 의 위치에 있는 바이트로부터 시작해, 최대 `length` 까지가 연속한 바이트로 구성되는 바이트 배열

> 례:

> >     byte [] part = blob.getBytes(5, 100);
> >     // part contains the fifth through 104th bytes, inclusive, as an
> >     // array of bytes

#### length

    long length() throws SQLException

> 이 `Blob` 객체에 의해 지정되는 `BLOB` 치내에 있는 바이트의 수를 돌려줍니다.

> 반환값:

> 이 `Blob` 객체에 의해 지정되는 `BLOB` 치의 길이의 바이트

> 례:

> >     Blob blob = rs.getBlob(2);
> >     long len = blob.length();
> >     // len contains the number of bytes in the BLOB value designated by
> >     // blob (the BLOB value in the second column of the current row of the
> >     // ResultSet object rs)

#### position

    long position(byte [] pattern, long start) throws SQLException

> 이 `Blob` 객체에 의해 지정되는 `BLOB` 치내에서,`byte` 배열의 `pattern` 가 시작되는 위치를 결정합니다. `pattern` 의 검색은 `start` 의 위치로부터 시작됩니다.

> 파라미터:

> pattern |  | 검색 대상의 `byte` 의 배열
> start |  | `BLOB` 치내에서 검색을 시작하는 위치. 최초의 `byte` 의 위치는 1

> 반환값:

> `byte` 배열의 `pattern` 가 시작되는 `BLOB` 치내의 위치. `start` 의 위치에서 검색을 시작해 성공했을 경우는 `start` 이상의 값, 그 이외의 경우는 -1 이 돌려주어집니다.

> 례:

> >     byte [] part = blob.getBytes(5, 100);
> >     long beginning = blob.position(part, 1024);
> >     // if part is contained in the BLOB value that blob designates, from
> >     // position 1024 on, beginning will contain the position at which
> >     // part begins

#### position

    long position(Blob pattern, long start) throws SQLException

> 이 `Blob` 객체에 의해 지정되는 `BLOB` 치내에서 `pattern` 가 시작되는 `byte` 의 위치를 결정합니다. 검색은,`start` 의 위치로부터 시작됩니다.

> 파라미터:

> pattern |  | 검색 대상의 `BLOB` 치를 지정하는 `Blob` 객체
> start |  | `BLOB` 치내에서 검색을 시작하는 위치. 최초의 `byte` 의 위치는 1

> 반환값:

> `Blob` 객체의 `pattern` 가 시작되는 위치. `start` 의 위치에서 검색을 시작해 성공했을 경우는 `start` 이상의 값, 그 이외의 경우는 -1 이 돌려주어집니다.

> 례:

> >     Blob blob2 = rs.getBlob(4);
> >     long beginning = blob1.position(blob2, 512);
> >     // if the BLOB value designated by blob2 is contained in the BLOB
> >     // value designated by blob1, starting at position 512 or later,
> >     // beginning will contain the position at which the BLOB value
> >     // designated by blob2 begins

Copyright © 2000, Sun Microsystems, Inc. All rights reserved.