Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.2.1 |  CUBRID 8.3.0 |  CUBRID 8.3.1 |  CUBRID 8.4.0 |  CUBRID 8.4.1 |  CUBRID 8.4.3 |  CUBRID 9.0.0 | 

JDBC 프로그래밍

연결 설정

DriverManager는 JDBC 드라이버를 관리하기 위한 기본적인 인터페이스이며, 데이터베이스 드라이버를 선택하고 새로운 데이터베이스 연결을 생성하는 기능을 한다. CUBRID JDBC 드라이버가 등록되어 있다면 DriverManager.getConnection(db-url, user-id, password) 메서드를 호출하여 데이터베이스에 접속한다. getConnection 메서드는 Connection 객체를 반환한다. 그리고 그것은 질의 실행과 명령문 실행 그리고 트랜잭션의 커밋 또는 롤백에 사용된다. 연결 설정을 위한 db-url 인자의 구성은 다음과 같다.

jdbc:cubrid:<host>:<port>:<db-name>:[user-id]:[password]:[?<property> [& <property>]]

 

<host> ::=

hostname | ip_address

 

<property> ::= althosts=<alternative_hosts>

             | rctime=<second>

             | connectTimeout=<second>

             | queryTimeout=<second>

             | charset=<character_set>

             | zeroDateTimeBehavior=<behavior_type>

             | logFile=<file_name>

             | logOnException=<bool_type>

             | logSlowQueries=<bool_type>&slowQueryThresholdMillis=<millisecond>

 

<alternative_hosts> ::=

<standby_broker1_host>:<port> [,<standby_broker2_host>:<port>]

<behavior_type> ::= exception | round | convertToNull

<bool_type> ::= true | false

  • <host> : CUBRID 브로커가 동작하고 있는 서버의 IP 주소 또는 호스트 이름
  • <port> : CUBRID 브로커의 포트 번호(기본값: 33000)
  • <db-name> : 접속할 데이터베이스 이름
  • [user-id] : 데이터베이스에 접속할 사용자 ID이다. 기본적으로 데이터베이스에는 dbapublic 두 개의 사용자가 존재한다. 빈 문자열("")을 입력하면 public 사용자로 데이터베이스에 접속한다.
  • [password] : 데이터베이스에 접속할 사용자의 암호이다. 해당 사용자에 암호가 설정되어 있지 않으면, 빈 문자열("")을 입력한다.
  • althosts : HA 환경에서 장애 시 fail-over할 하나 이상의 standby 브로커의 호스트 IP와 접속 포트이다.
  • rctime : HA 환경에서 장애 복구 시 active 브로커로 연결을 시도하는 주기를 초 단위로 입력한다. 이에 관한 상세한 설명은 "관리자 안내서 > CUBRID HA > 환경 설정 > JDBC 설정" 및 아래 예제를 참고한다.
  • connectTimeout : 데이터베이스 접속에 대한 타임아웃 시간을 초 단위로 설정한다(기본값: 0). DriverManger.setLoginTimeout() 메서드로 설정할 수도 있으나, 연결 URL에 이 값을 설정하면 메서드로 설정한 값은 무시된다.
  • queryTimeout : 질의 수행에 대한 타임아웃 시간을 초 단위로 설정한다(기본값: 0, 무제한). 이 값은 DriverManger.setQueryTimeout() 메서드에 의해 변경될 수 있다.
  • charset : 접속하고자 하는 DB의 문자셋(charset)이다.
  • zeroDateTimeBehavior : JDBC에서는 java.sql.Date 형 객체에 날짜와 시간 값이 모두 0인 값을 허용하지 않으므로 이 값을 출력해야 할 때 어떻게 처리할 것인지를 정하는 속성. 기본 동작은 exception이다. 설정값에 따른 동작은 다음과 같다.
    • exception : 기본 동작. SQLException 예외로 처리한다.
    • round : 반환할 타입의 최소값으로 변환한다.
    • convertToNull : NULL로 변환한다.
    날짜와 시간 값이 모두 0인 값에 대한 설명은 "CUBRID SQL 설명서 > 데이터 타입 > 날짜/시간 데이터 타입 > 정의와 특성"을 참고한다.
  • logFile : 디버깅용 로그 파일 이름(기본값: cubrid_jdbc.log). 별도의 경로 설정이 없으면 응용 프로그램을 실행하는 위치에 저장된다.
  • logOnException : 디버깅용 예외 처리 로깅 여부(기본값: false)
  • logSlowQueries : 디버깅용 슬로우 쿼리 로깅 여부(기본값: false)
  • slowQueryThresholdMillis : 디버깅용 슬로우 쿼리 로깅 시 슬로우 쿼리 제한 시간(기본값: 60000). 단위는 밀리 초이다.
예제 1

--connection URL string when user name and password omitted

 

URL=jdbc:CUBRID:192.168.0.1:33000:db1:::

 

--connection URL string when zeroDateTimeBehavior property specified

URL=jdbc:CUBRID:127.0.0.1:31000:db1:::?zeroDateTimeBehavior=convertToNull

 

--connection URL string when charset property specified

 

URL=jdbc:CUBRID:192.168.0.1:33000:db1:::?charset=utf-8

 

--connection URL string when queryTimeout and charset property specified

 

URL=jdbc:CUBRID:127.0.0.1:31000:db1:::?queryTimeout=1&charset=utf-8

 

--connection URL string when a property(althosts) specified for HA

URL=jdbc:CUBRID:192.168.0.1:33000:db1:::?althosts=192.168.0.2:33000,192.168.0.3:33000

 

--connection URL string when properties(althosts,rctime, connectTimeout) specified for HA

URL=jdbc:CUBRID:192.168.0.1:33000:db1:::?althosts=192.168.0.2:33000,192.168.0.3:33000&rctime=600&connectTimeout=5

 

--connection URL string when properties(althosts,rctime, charset) specified for HA

URL=jdbc:CUBRID:192.168.0.1:33000:db1:::?althosts=192.168.0.2:33000,192.168.0.3:33000&rctime=600&charset=utf-8

예제 2

String url = "jdbc:cubrid:192.168.0.1:33000:demodb:::";

String userid = "";

String password = "";

 

try {

   Connection conn =

           DriverManager.getConnection(url,userid,password);

   // Do something with the Connection

 

   ...

 

   } catch (SQLException e) {

       System.out.println("SQLException:" + e.getMessage());

       System.out.println("SQLState: " + e.getSQLState());

   }

   ...

주의 사항
  • URL 문자열에서 콜론(:)과 물음표(?)는 구분자로 사용되므로, URL 문자열에 암호를 포함하는 경우 암호의 일부에 콜론이나 물음표를 사용할 수 없다. 암호에 콜론이나 물음표를 사용하려면 getConnection 함수에서 사용자 이름(user-id)과 암호(password)를 별도의 인자로 지정해야 한다.
  • 스레드 기반 프로그램에서 데이터베이스 연결은 각 스레드마다 독립적으로 사용해야 한다.

참고 트랜잭션 롤백을 요청하는 rollback 메서드는 서버가 롤백 작업을 완료한 후 종료된다.

외래 키 정보 확인
설명

DatabaseMetaData 인터페이스에서 제공되는 getImportedKeys, getExportedKeys, getCrossReference 메서드를 사용하여 외래 키 정보를 확인할 수 있다. 각 메서드의 사용법 및 예제는 다음과 같다.

구문

getImportedKeys(String catalog, String schema, String table)

getExportedKeys
(String catalog, String schema, String table)

getCrossReference
(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable)

  • getImportedKeys 메서드 : 인자로 주어진 테이블의 외래 키 칼럼들이 참조하고 있는 기본 키 칼럼들의 정보를 조회한다. 결과는 PKTABLE_NAMEKEY_SEQ 순서로 정렬되어 반환된다.
  • getExportedKeys 메서드 : 주어진 테이블의 기본 키 칼럼들을 참조하는 모든 외래 키 칼럼들의 정보를 조회하며, 결과는 FKTABLE_NAMEKEY_SEQ 순서로 정렬된다.
  • getCrossReference 메서드 : 인자로 주어진 테이블의 외래 키 칼럼들이 참조하고 있는 기본 키 칼럼들의 정보를 조회한다. 결과는 PKTABLE_NAMEKEY_SEQ 순서로 정렬되어 반환된다.
반환 값

위 메서드를 호출하면 아래와 같이 14개의 칼럼으로 구성된 ResultSet을 반환한다.

name

type

비고

PKTABLE_CAT

String

항상 null

PKTABLE_SCHEM

String

항상 null

PKTABLE_NAME

String

기본 키 테이블 이름

PKCOLUMN_NAME

String

기본 키 칼럼 이름

FKTABLE_CAT

String

항상 null

FKTABLE_SCHEM

String

항상 null

FKTABLE_NAME

String

외래 키 테이블 이름

FKCOLUMN_NAME

String

외래 키 칼럼 이름

KEY_SEQ

short

외래 키 또는 기본 키 칼럼들의 순서(1부터 시작)

UPDATE_RULE

short

기본 키가 업데이트될 때 외래 키에 대해 정의된 참조 동작에 대응되는 값
Cascade=0, Restrict=2, No action=3, Set null=4

DELETE_RULE

short

기본 키가 삭제될 때 외래 키에 대해 정의된 참조 동작에 대응되는 값
Cascade=0, Restrict=2, No action=3, Set null=4

FK_NAME

String

외래 키 이름

PK_NAME

String

기본 키 이름

DEFERRABILITY

short

항상 6 (DatabaseMetaData.importedKeyInitiallyImmediate)

예제

ResultSet rs = null;

 

                DatabaseMetaData dbmd = conn.getMetaData();

 

                System.out.println(" ===== Test getImportedKeys");

                System.out.println("=====");

                rs = dbmd.getImportedKeys(null, null, "pk_table");

                Test.printFkInfo(rs);

                rs.close();

 

                System.out.println(" ===== Test getExportedKeys");

                System.out.println("=====");

                rs = dbmd.getExportedKeys(null, null, "fk_table");

                Test.printFkInfo(rs);

                rs.close();

 

                System.out.println(" ===== Test getCrossReference");

                System.out.println("=====");

                rs = dbmd.getCrossReference(null, null, "pk_table", null, null, "fk_table");

                Test.printFkInfo(rs);

                rs.close();

OID와 컬렉션 사용

JDBC 스펙에 정의된 메서드 이외에 CUBRID JDBC 드라이버에서 추가로 OID, 컬렉션 타입(SET, MULTISET, LIST) 등을 다루는 메서드를 제공한다.

이 메서드의 사용을 위해서는 기본적으로 import하는 CUBRID JDBC 드라이버 클래스 이외에 cubrid.sql.*;를 import해야 한다. 또한 표준 JDBC API에서 제공하는 ResultSet 클래스가 아닌 CUBRIDResultSet 클래스로 변환하여 결과를 받아야 한다.

import cubrid.jdbc.driver.* ;
import cubrid.sql.* ;
...
CUBRIDResultSet urs = (CUBRIDResultSet) stmt.executeQuery(
"SELECT city FROM location");

주의 CUBRID의 확장 API를 사용하면, AUTOCOMMIT을 TRUE로 설정하였더라도 자동으로 커밋되지 않는다. 따라서 항상 open한 연결에 대해 명시적으로 커밋을 해야 한다. CUBRID 확장 API는 OID, 컬렉션 등을 다루는 메서드이다.

OID 사용

OID를 사용할 때 다음의 규칙을 지켜야 한다.

  • CUBRIDOID를 사용하기 위해서는 반드시 cubrid.sql.*를 import 해야 한다. (a)
  • SELECT 문에 클래스명을 주어 OID를 가져올 수 있다. 물론 다른 속성과 혼용해서 사용할 수도 있다. (b)
  • 질의에 대한 ResultSet은 반드시 CUBRIDResultSet으로 받아야 한다. (c)
  • CUBRIDResultSet에서 OID를 가져오는 메서드는 getOID()이다. (d)
  • OID에서 값을 가져오기 위해서는 getValues() 메서드를 통해 가져올 수 있다. 그 결과는 ResultSet이다. (e)
  • OID에 값을 대입하기 위해서는 setValues() 메서드를 통해서 적용할 수 있다. (f)
  • 확장 API 사용시에는 연결에 대해 항상 commit()을 해주어야 한다. (g)

예제

import java.sql.*;
import cubrid.sql.*; //a
import cubrid.jdbc.driver.*;

/*
CREATE TABLE oid_test(
   id INTEGER,
   name VARCHAR(10),
   age INTEGER
);

INSERT INTO oid_test VALUES(1, 'Laura', 32);
INSERT INTO oid_test VALUES(2, 'Daniel', 39);
INSERT INTO oid_test VALUES(3, 'Stephen', 38);
*/

class OID_Sample
{
   public static void main (String args [])
   {
      // Making a connection
      String url= "jdbc:cubrid:localhost:33000:demodb:::";
      String user = "dba";
      String passwd = "";

      // SQL statement to get OID values
      String sql = "SELECT oid_test from oid_test"; //b
      // columns of the table
      String[] attr = { "id", "name", "age" } ;


      // Declaring variables for Connection and Statement
      Connection con = null;
      Statement stmt = null;
      CUBRIDResultSet rs = null;
      ResultSetMetaData rsmd = null;

      try {
         Class.forName("cubrid.jdbc.driver.CUBRIDDriver");
      } catch (ClassNotFoundException e) {
         throw new IllegalStateException("Unable to load Cubrid driver", e);
      }

      try {
         con = DriverManager.getConnection(url, user, passwd);
         stmt = con.createStatement();
         rs = (CUBRIDResultSet)stmt.executeQuery(sql); //c
         rsmd = rs.getMetaData();

         // Printing columns
         int numOfColumn = rsmd.getColumnCount();
         for (int i = 1; i <= numOfColumn; i++ ) {
            String ColumnName = rsmd.getColumnName(i);
            String JdbcType = rsmd.getColumnTypeName(i);
            System.out.print(ColumnName );
            System.out.print("("+ JdbcType + ")");
            System.out.print(" | ");
         }
         System.out.print(" ");

         // Printing rows
         CUBRIDResultSet rsoid = null;
         int k = 1;

         while (rs.next()) {
            CUBRIDOID oid = rs.getOID(1); //d
            System.out.print("OID");
            System.out.print(" | ");
            rsoid = (CUBRIDResultSet)oid.getValues(attr); //e

            while (rsoid.next()) {
               for( int j=1; j <= attr.length; j++ ) {
                  System.out.print(rsoid.getObject(j));
                  System.out.print(" | ");
               }
            }
            System.out.print(" ");

            // New values of the first row
            Object[] value = { 4, "Yu-ri", 19 };
            if (k == 1) oid.setValues(attr, value); //f

            k = 0;
         }
         con.commit(); //g

      } catch(CUBRIDException e) {
         e.printStackTrace();

      } catch(SQLException ex) {
         ex.printStackTrace();

      } finally {
         if(rs != null) try { rs.close(); } catch(SQLException e) {}
         if(stmt != null) try { stmt.close(); } catch(SQLException e) {}
         if(con != null) try { con.close(); } catch(SQLException e) {}
      }
   }
}

컬렉션 사용

아래 예제 1의 'a'에 해당하는 부분이 CUBRIDResultSet으로부터 컬렉션 타입(SET, MULTISET, LIST)의 데이터를 가져오는 부분으로 그 결과는 배열 형태로 반환한다. 단, 컬렉션 타입 내에 정의된 원소들의 데이터 타입이 모두 같은 경우에만 사용할 수 있다.

예제 1

import java.sql.*;
import java.lang.*;
import cubrid.sql.*;
import cubrid.jdbc.driver.*;
 
// create class collection_test(
// settest set(integer),
// multisettest multiset(integer),
// listtest list(Integer)
// );
//
 
// insert into collection_test values({1,2,3},{1,2,3},{1,2,3});
// insert into collection_test values({2,3,4},{2,3,4},{2,3,4});
// insert into collection_test values({3,4,5},{3,4,5},{3,4,5});
 
class Collection_Sample
{
   public static void main (String args [])
   {
       String url= "jdbc:cubrid:127.0.0.1:33000:demodb:::";
       String user = "";
       String passwd = "";
       String sql = "select settest,multisettest,listtest from collection_test";
       try {
           Class.forName("cubrid.jdbc.driver.CUBRIDDriver");
       } catch(Exception e){
           e.printStackTrace();
       }
       try {
           Connection con = DriverManager.getConnection(url,user,passwd);
           Statement stmt = con.createStatement();
           CUBRIDResultSet rs = (CUBRIDResultSet) stmt.executeQuery(sql);
           CUBRIDResultSetMetaData rsmd = (CUBRIDResultSetMetaData) rs.getMeta Data();
           int numbOfColumn = rsmd.getColumnCount();
           while (rs.next ()) {
               for (int j=1; j<=numbOfColumn; j++ ) {
                   Object[] reset = (Object[]) rs.getCollection(j); //a
                   for (int m=0 ; m < reset.length ; m++)
                       System.out.print(reset[m] +",");
                   System.out.print(" | ");
               }
               System.out.print(" ");
           }
           rs.close();
           stmt.close();
           con.close();
       } catch(SQLException e) {
           e.printStackTrace();
       }
   }
}

예제 2

import java.sql.*;
import java.io.*;
import java.lang.*;
import cubrid.sql.*;
import cubrid.jdbc.driver.*;
 
// create class collection_test(
// settest set(integer),
// multisettest multiset(integer),
// listtest list(Integer)
// );
//
// insert into collection_test values({1,2,3},{1,2,3},{1,2,3});
// insert into collection_test values({2,3,4},{2,3,4},{2,3,4});
// insert into collection_test values({3,4,5},{3,4,5},{3,4,5});
 
class SetOP_Sample
{
   public static void main (String args [])
   {
       String url = "jdbc:cubrid:127.0.0.1:33000:demodb:::";
       String user = "";
       String passwd = "";
       String sql = "select collection_test from collection_test";
       try {
           Class.forName("cubrid.jdbc.driver.CUBRIDDriver");
       } catch(Exception e){
           e.printStackTrace();
       }
       try {
           CUBRIDConnection con =(CUBRIDConnection)
           DriverManager.getConnection(url,user,passwd);
           Statement stmt = con.createStatement();
           CUBRIDResultSet rs = (CUBRIDResultSet)stmt.executeQuery(sql);
           while (rs.next ()) {
               CUBRIDOID oid = rs.getOID(1);
               oid.addToSet("settest",new Integer(10));
               oid.addToSet("multisettest",new Integer(20));
               oid.addToSequence("listtest",1,new Integer(30));
               oid.addToSequence("listtest",100,new Integer(100));
               oid.putIntoSequence("listtest",99,new Integer(99));
               oid.removeFromSet("settest",new Integer(1));
               oid.removeFromSet("multisettest",new Integer(2));
               oid.removeFromSequence("listtest",99);
               oid.removeFromSequence("listtest",1);
           }
           con.commit();
           rs.close();
           stmt.close();
           con.close();
       } catch(SQLException e) {
           e.printStackTrace();
       }
   }
}

자동 증가 특성의 칼럼 값 검색
자동 증가 특성

자동 증가 특성(AUTO_INCREMENT)은 자동으로 각 행의 숫자 값을 증가 생성하는 칼럼에 대한 특성으로서, 보다 자세한 사항은 "CUBRID SQL 설명서 > 테이블 정의 > CREATE TABLE > 칼럼 정의"를 참고한다. 수치형 도메인(SMALLINT, INTEGER, DECIMAL(p, 0), NUMERIC(p, 0))에 대해서만 정의할 수 있다.

자동 증가 특성은 JDBC 프로그램에서 자동 생성된 키로 인식되고, 이 키의 검색을 사용하려면 자동 생성된 키 값을 검색할 행을 삽입할 시기를 표시해야 한다. 이를 수행하기 위하여 Connection.prepareStatementStatement.execute 메서드를 호출하여 플래그를 설정해야 한다. 이때, 실행된 명령문은 INSERT 문 또는 INSERT within SELECT 문이어야 하며, 다른 명령문의 경우 JDBC 드라이버가 플래그를 설정하는 매개변수를 무시한다.

수행 단계
  1. 다음 방법 중 하나를 사용하여 자동 생성된 키를 반환하려는지 표시한다. 자동 증가 특성 칼럼을 지원하는 데이터베이스 서버의 테이블에 대해 다음의 양식을 사용하며, 각 양식은 단일 행 INSERT 문에 대해서만 적용 가능하다.
    • 아래와 같이 PreparedStatement 오브젝트를 작성한다.
    • Connection.prepareStatement(sql statement, Statement.RETURN_GENERATED_KEYS);
    • Statement.execute 메서드를 사용하여 행을 삽입할 경우, 아래와 같이 Statement.execute 메서드를 사용한다.
    • Statement.execute(sql statement, Statement.RETURN_GENERATED_KEYS);
  2. PreparedStatement.getGeneratedKeys 메서드 또는 Statement.getGeneratedKeys 메서드를 호출하여 자동 생성된 키 값이 포함된 ResultSet 오브젝트를 검색한다. ResultSet에서 자동 생성된 키의 데이터 유형은 해당 도메인의 데이터 유형에 상관 없이 DECIMAL이다.
예제

다음 예제는 자동 증가 특성이 있는 테이블을 생성하고, 데이터를 테이블에 입력하여, 자동 증가 특성 칼럼에 자동 생성된 키 값이 입력되고 해당 키값이 Statement.getGeneratedKeys() 메서드를 통해 정상적으로 검색되는지를 점검하는 예제이다. 앞서 설명한 단계에 해당하는 명령문의 코멘트에 각 단계를 표시하였다.

import java.sql.*;
import java.math.*;
import cubrid.jdbc.driver.*;
 
Connection con;
Statement stmt;
ResultSet rs;
java.math.BigDecimal iDColVar;
...
stmt = con.createStatement();     // Create a Statement object
 
stmt.executeUpdate(
"CREATE TABLE EMP_PHONE (EMPNO CHAR(6), PHONENO CHAR(4), "
+   "IDENTCOL INTEGER AUTO_INCREMENT)"); // Create table with identity column
                                    
stmt.execute(
"INSERT INTO EMP_PHONE (EMPNO, PHONENO) "
+   "VALUES ('000010', '5555')", 
         // Insert a row  <Step 1>
Statement.RETURN_GENERATED_KEYS);            // Indicate you want automatically
                                     
 
rs = stmt.getGeneratedKeys();    // generated keys
                                       // Retrieve the automatically  <Step 2>
                                       // generated key value in a ResultSet.
                                       // Only one row is returned.
                                       // Create ResultSet for query
while (rs.next()) {
  java.math.BigDecimal idColVar = rs.getBigDecimal(1);    
                                       // Get automatically generated key
                                       // value
  System.out.println("automatically generated key value = " + idColVar);
}
rs.close();                          // Close ResultSet
stmt.close();                        // Close Statement

BLOB/CLOB 사용

JDBC에서 LOB 데이터를 처리하는 인터페이스는 JDBC 4.0 스펙을 기반으로 구현되었으며, 다음과 같은 제약 사항을 가진다.

  • BLOB, CLOB 객체를 생성할 때에는 순차 쓰기만을 지원한다. 임의 위치에 대한 쓰기는 지원하지 않는다.
  • ResultSet에서 얻어온 BLOB, CLOB 객체의 메서드를 호출하여 BLOB, CLOB 데이터를 변경할 수 없다.
  • Blob.truncate, Clob.truncate, Blob.position, Clob.position 메서드는 지원하지 않는다.
  • BLOB/CLOB 타입 칼럼에 대해 PreparedStatement.setAsciiStream, PreparedStatement.setBinaryStream, PreparedStatement.setCharacterStream 메서드를 호출하여 LOB 데이터를 바인딩할 수 없다.
  • JDBC 4.0을 지원하지 않는 환경(예: JDK 1.5 이하)에서 BLOB/CLOB 타입을 사용하기 위해서는 conn 객체를 CUBRIDConnection로 명시적 타입 변환하여 사용하여야 한다. 아래 예제를 참고한다.

// JDK 1.6 이상

import java.sql.*;

Connection conn = DriverManager.getConnection(url, id, passwd);

Blob blob = conn.createBlob();

// JDK 1.6 미만

import java.sql.*;

import cubrid.jdbc.driver.*;

Connection conn = DriverManager.getConnection(url, id, passwd);

Blob blob = ((CUBRIDConnection)conn).createBlob();

LOB 데이터 저장

LOB 타입 데이터를 바인딩하는 방법은 다음과 같다. 예제를 참고한다.

  • java.sql.Blob 또는 java.sql.Clob 객체를 생성하고 그 객체에 파일 내용을 저장한 다음, PreparedStatement의 setBlob() 혹은 setClob()을 사용한다. (예제 1)
  • 질의를 한 다음, 그 ResultSet 객체에서 java.sql.Blob 혹은 java.sql.Clob 객체를 얻고, 그 객체를 PreparedStatement에서 바인딩한다. (예제 2)

예제 1

Class.forName("cubrid.jdbc.driver.CUBRIDDriver");

Connection conn = DriverManager.getConnection ("jdbc:cubrid:localhost:33000:image_db:::", "", "");

PreparedStatement pstmt1 = conn.prepareStatement("INSERT INTO doc(image_id, doc_id, image) VALUES (?,?,?)");

pstmt1.setString(1, "image-21");

pstmt1.setString(2, "doc-21");

 

//Creating an empty file in the file system

Blob bImage = conn.createBlob();

byte[] bArray = new byte[256];

 

//Inserting data into the external file. Position is start with 1.

bImage.setBytes(1, bArray);

//Appending data into the external file

bImage.setBytes(257, bArray);

pstmt1.setBlob(3, bImage);

pstmt1.executeUpdate();

예제 2

Class.forName("cubrid.jdbc.driver.CUBRIDDriver");

Connection conn = DriverManager.getConnection ("jdbc:cubrid:localhost:33000:image_db:::", "", "");

conn.setAutoCommit(false);

PreparedStatement pstmt1 = conn.prepareStatement("SELECT image FROM doc WHERE image_id = ? ");

pstmt1.setString(1, "image-21");

ResultSet rs = pstmt1.executeQuery();

 

while (rs.next())

{

Blob bImage = rs.getBlob(1);

PreparedStatement pstmt2 = conn.prepareStatement("INSERT INTO doc(image_id, doc_id, image) VALUES (?,?,?)");

pstmt2.setString(1, "image-22")

pstmt2.setString(2, "doc-22")

pstmt2.setBlob(3, bImage);

pstmt2.executeUpdate();

pstmt2.close();

}

pstmt1.close();

conn.commit();

conn.setAutoCommit(true);

conn.close();

LOB 데이터 조회

LOB 타입 데이터를 조회하는 방법은 다음과 같다.

  • ResultSet에서 getBytes() 혹은 getString() 메서드를 사용하여 데이터를 바로 인출한다. (예제 1)
  • ResultSet에서 getBlob() 혹은 getClob() 메서드를 호출하여 java.sql.Blob 혹은 java.sql.Clob 객체를 얻은 다음, 이 객체에 대해 getBytes() 혹은 getSubString() 메서드를 사용하여 데이터를 인출한다. (예제 2)

예제 1

Connection conn = DriverManager.getConnection ("jdbc:cubrid:localhost:33000:image_db:::", "", "");

 

// ResetSet에서 직접 데이터 인출

PrepareStatement pstmt1 = conn.prepareStatement("SELECT content FROM doc_t WHERE doc_id = ? ");

pstmt2.setString(1, "doc-10");

ResultSet rs = pstmt1.executeQuery();

while (rs.next())

{

String sContent = rs.getString(1);

System.out.println("doc.content= "+sContent.);

}

예제 2

Connection conn = DriverManager.getConnection ("jdbc:cubrid:localhost:33000:image_db:::", "", "");

 

//ResultSet에서 Blob 객체를 얻고 Blob 객체로부터 데이터 인출

PrepareStatement pstmt2 = conn.prepareStatement(“SELECT image FROM image_t WHERE image_id = ?”);

pstmt2.setString(1,”image-20”);

ResultSet rs = pstmt2.executeQuery();

while (rs.next())

{

Blob bImage = rs.getBlob(1);

Bytes[] bArray = bImange.getBytes(1, (int)bImage.length());

}

참고 칼럼에서 정의한 크기보다 큰 문자열을 INSERT/UPDATE하면 문자열이 잘려서 입력된다.

참고 JDBC 드라이버에 대한 최신 정보를 확인하려면 http://www.cubrid.org/wiki_apis/entry/cubrid-jdbc-driver에 접속한다.