Руководство по JDBC. Работа с потоками.

Экземпляр 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> |
+------+------------------------------------------------------------------------------------------------------------------------------------------------------+

В этом примере мы изучили основы потоковых данных и рассмотрели пример простого приложения с их использованием.