Spec-Zone .ru
спецификации, руководства, описания, API
След: JDBC (ТМ) Доступ к базе данных
Урок: Основы JDBC
Используя Большие Объекты
Домашняя страница > JDBC (ТМ) Доступ к базе данных > Основы JDBC

Используя Большие Объекты

Важная функция Blob, Clob, и NClob Объекты Java состоят в том, что можно управлять ими, не имея необходимость приносить все их данные с сервера базы данных на Ваш клиентский компьютер. Некоторые реализации представляют экземпляр этих типов с локатором (логический указатель) к объекту в базе данных, которую представляет экземпляр. Поскольку a BLOB, CLOB, или NCLOB Объект SQL может быть очень большим, использование локаторов может сделать производительность значительно быстрее. Однако, другие реализации полностью осуществляют большие объекты на клиентском компьютере.

Если Вы хотите принести данные a BLOB, CLOB, или NCLOB Значение SQL к клиентскому компьютеру, используйте методы в Blob, Clob, и NClob Интерфейсы Java, которые обеспечиваются с этой целью. Эти большие объектные объекты типа осуществляют данные объектов, которые они представляют как поток.

Следующие темы затрагиваются:

Добавление Большого Объектного Объекта Типа к Базе данных

Следующая выборка от ClobSample.addRowToCoffeeDescriptions добавляет a CLOB Значение SQL к таблице COFFEE_DESCRIPTIONS. Clob Объект Java myClob содержит содержание файла, определенного fileName.

public void addRowToCoffeeDescriptions(
    String coffeeName, String fileName)
    throws SQLException {

    PreparedStatement pstmt = null;
    try {
        Clob myClob = this.con.createClob();
        Writer clobWriter = myClob.setCharacterStream(1);
        String str = this.readFile(fileName, clobWriter);
        System.out.println("Wrote the following: " +
            clobWriter.toString());

        if (this.settings.dbms.equals("mysql")) {
            System.out.println(
                "MySQL, setting String in Clob " +
                "object with setString method");
            myClob.setString(1, str);
        }
        System.out.println("Length of Clob: " + myClob.length());

        String sql = "INSERT INTO COFFEE_DESCRIPTIONS " +
                     "VALUES(?,?)";

        pstmt = this.con.prepareStatement(sql);
        pstmt.setString(1, coffeeName);
        pstmt.setClob(2, myClob);
        pstmt.executeUpdate();
    } catch (SQLException sqlex) {
        JDBCTutorialUtilities.printSQLException(sqlex);
    } catch (Exception ex) {
      System.out.println("Unexpected exception: " + ex.toString());
    } finally {
        if (pstmt != null)pstmt.close();
    }
}

Следующая строка создает a Clob Объект Java:

Clob myClob = this.con.createClob();

Следующая строка получает поток (в этом случае a Writer объект называют clobWriter) это используется, чтобы записать поток символов к Clob Объект Java myClob. Метод ClobSample.readFile записи этот поток символов; поток от файла, определенного String fileName. Параметр метода 1 указывает что Writer объект начнет писать поток символов в начале Clob значение:

Writer clobWriter = myClob.setCharacterStream(1);

ClobSample.readFile метод читает файл, линию за линией определенный файлом fileName и записи это к Writer объект, определенный writerArg:

private String readFile(String fileName, Writer writerArg)
        throws FileNotFoundException, IOException {

    BufferedReader br = new BufferedReader(new FileReader(fileName));
    String nextLine = "";
    StringBuffer sb = new StringBuffer();
    while ((nextLine = br.readLine()) != null) {
        System.out.println("Writing: " + nextLine);
        writerArg.write(nextLine);
        sb.append(nextLine);
    }
    // Convert the content into to a string
    String clobData = sb.toString();

    // Return the data.
    return clobData;
}

Следующая выборка создает a PreparedStatement объект pstmt это вставляет Clob Объект Java myClob в COFFEE_DESCRIPTIONS:

PreparedStatement pstmt = null;
// ...
String sql = "INSERT INTO COFFEE_DESCRIPTIONS VALUES(?,?)";
pstmt = this.con.prepareStatement(sql);
pstmt.setString(1, coffeeName);
pstmt.setClob(2, myClob);
pstmt.executeUpdate();

Получение Значения CLOB

Метод ClobSample.retrieveExcerpt получает CLOB Значение SQL, сохраненное в COF_DESC столбец COFFEE_DESCRIPTIONS от строки, чье значение столбца COF_NAME равно String значение, определенное coffeeName параметр:

public String retrieveExcerpt(String coffeeName, int numChar)
    throws SQLException {

    String description = null;
    Clob myClob = null;
    PreparedStatement pstmt = null;

    try {
        String sql =
            "select COF_DESC " +
            "from COFFEE_DESCRIPTIONS " +
            "where COF_NAME = ?";

        pstmt = this.con.prepareStatement(sql);
        pstmt.setString(1, coffeeName);
        ResultSet rs = pstmt.executeQuery();

        if (rs.next()) {
            myClob = rs.getClob(1);
            System.out.println("Length of retrieved Clob: " +
                myClob.length());
        }
        description = myClob.getSubString(1, numChar);
    } catch (SQLException sqlex) {
        JDBCTutorialUtilities.printSQLException(sqlex);
    } catch (Exception ex) {
        System.out.println("Unexpected exception: " + ex.toString());
    } finally {
        if (pstmt != null) pstmt.close();
    }
    return description;
}

Следующая строка получает Clob Значение Java от ResultSet объект rs:

myClob = rs.getClob(1);

Следующая строка получает подстроку от myClob объект. Подстрока начинается в первом символе значения myClob и имеет до числа последовательных символов, определенных в numChar, где numChar целое число.

description = myClob.getSubString(1, numChar);

Добавление и Получение Объектов BLOB

Добавление и получение BLOB Объекты SQL подобны добавлению и получению CLOB Объекты SQL. Используйте Blob.setBinaryStream метод, чтобы получить OutputStream возразите, чтобы записать BLOB Значение SQL, что Blob Объект Java (который названный методом) представляет.

Высвобождение Средств, Сохраненных Большими Объектами

Blob, Clob, и NClob Объекты Java остаются допустимыми для, по крайней мере, продолжительности транзакции, в которой они создаются. Это могло потенциально привести к приложению, исчерпывающему ресурсы во время длинной рабочей транзакции. Приложения могут выпустить Blob, Clob, и NClob ресурсы, вызывая их free метод.

В следующей выборке, методе Clob.free вызывается, чтобы высвободить средства, сохраненные на ранее создаваемый Clob объект:

Clob aClob = con.createClob();
int numWritten = aClob.setString(1, val);
aClob.free();

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Используя Усовершенствованные Типы данных
Следующая страница: Используя Объекты SQLXML