Экземпляр PreparedStatement имеет возможность использовать потоки ввода/вывода для передачи данных. Это даёт нам возможность размещать целые файлы в столбцах баз данных (далее – БД), что позволяет хранить большие значения, например, такие типы данных, как CLOB, BLOB.
Для использования потоков испольузются такие методы:
- setAsciiStream()
Этот метод поддерживает большие занчения ASCII. - setCharacterStream()
Этот метод используется для поддержки больших значений UNICODE. - setBinaryStream()
Этот метод используется для поддержки больших бинарных значений.
Методы формата setXXXStream() кроме других параметров, требуют дополнительный параметр – размер файла. Этот параметр сообщает драйверу какое количество данных должно быть отправлено в БД с помощью потока.
Допустим, мы хотим загрузить XML файл Proselyte_Developer.xml в таблицу нашей БД.
Вот этот файл:
<?xml version = "1.0"?>
<Developer>
<id>1</id>
<name>Proselyte</name>
<specialty>Java</specialty>
<salary>3000</salary>
</Developer>
Мы создадим приложение, которое создаст в нашей БД таблицу с названием Developer, а затем, содержимое нашего файла будет загружено в созданную таблицу.
Пример:
import java.io.*;
import java.sql.*;
public class StreamingDataDemo {
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DATABASE_URL = "jdbc:mysql://localhost/PROSELYTE_TUTORIALS";
static final String USER = "ВАШЕ_ИМЯ_ПОЛЬЗОВАТЕЛЯ";
static final String PASSWORD = "ВАШ_ПАРОЛЬ";
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DATABASE_URL, USER, PASSWORD);
stmt = conn.createStatement();
createXMLTable(stmt);
File f = new File("ProselyteDeveloper.xml");
long fileLength = f.length();
FileInputStream fis = new FileInputStream(f);
String SQL = "INSERT INTO XML_Developer VALUES (?,?)";
pstmt = conn.prepareStatement(SQL);
pstmt.setInt(1, 1);
pstmt.setAsciiStream(2, fis, (int) fileLength);
pstmt.execute();
fis.close();
SQL = "SELECT Data FROM XML_Developer WHERE id=1";
rs = stmt.executeQuery(SQL);
if (rs.next()) {
InputStream xmlInputStream = rs.getAsciiStream(1);
int c;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((c = xmlInputStream.read()) != -1)
bos.write(c);
System.out.println(bos.toString());
}
rs.close();
stmt.close();
pstmt.close();
conn.close();
} catch (SQLException se) {
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (stmt != null)
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (pstmt != null)
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null)
conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
System.out.println("Thank You!");
}
public static void createXMLTable(Statement statement) throws SQLException {
System.out.println("Creating XML_Developer table...");
String SQL = "CREATE TABLE XML_Developer " +
"(id INTEGER, Data LONG)";
try {
statement.executeUpdate("DROP TABLE XML_Developer");
} catch (SQLException e) {
e.printStackTrace();
}
statement.executeUpdate(SQL);
}
}
В результате работы программы мы получим следующий результат:
Connecting to database...
Creating XML_Developer table...
<?xml version = "1.0"?>
<Developer>
<id>1</id>
<name>Proselyte</name>
<specialty>Java</specialty>
<salary>3000</salary>
</Developer>
Thank You!
Вот так будет выглядеть наша таблица в БД:
+------+------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | Data |
+------+------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | <?xml version = "1.0"?>
<Developer>
<id>1</id>
<name>Proselyte</name>
<specialty>Java</specialty>
<salary>3000</salary>
</Developer> |
+------+------------------------------------------------------------------------------------------------------------------------------------------------------+
В этом примере мы изучили основы потоковых данных и рассмотрели пример простого приложения с их использованием.