|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Важная функция 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();
Метод 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 Объекты 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();