English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JDBC アスキーやバイナリデータストリーム

PreparedStatement オブジェクトは、入出力ストリームを使用してパラメータデータを提供できます。これにより、CLOB または BLOB データ型などの大値を保存できるデータベースの列に整个ファイルを保存することができます。

以下の方法を使用して、ストリームデータを取得できます。-

  • setAsciiStream(): このメソッドは、大きなASCII値を提供するために使用されます。

  • setCharacterStream(): このメソッドは、大きなUNICODE値を提供するために使用されます。

  • setBinaryStream(): このメソッドは、大きなバイナリ値を提供するために使用されます。

setXXXStream () メソッドは、パラメータの占位符に加えて、追加のパラメータが必要です。それは、ドライバーがデータベースに送信するべきデータの量を教えるファイルサイズです。

オンラインサンプル

例えば、XMLファイルXML_Data.xmlをデータベーステーブルにアップロードしたい場合、これはこのXMLファイルの内容です-

<?xml version="1.0"?>
<Employee>
<id>100</id>
<first>Zara</first>
<last>Ali</last>
<Salary>10000</Salary>
<Dob>18-08-1978</Dob>
<Employee>

このXMLファイルを、このサンプルを実行するディレクトリに配置してください。

このサンプルでは、データベーステーブルXML_Dataを作成し、ファイルXML_Data.xmlをそのテーブルにアップロードします。

以下の例をJDBCExample.javaにコピーして貼り付け、以下のようにコンパイルして実行してください:

// 必要なソフトウェアパッケージをインポートする
import java.sql.*;
import java.io.*;
import java.util.*;
public class JDBCExample {
   // JDBCドライバ名とデータベースURL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/EMP";
   //  データベースの認証情報
   static final String USER = "username";
   static final String PASS = "password";
   
   public static void main(String[] args) {
   Connection conn = null;
   PreparedStatement pstmt = null;
   Statement stmt = null;
   ResultSet rs = null;
   try{
      // JDBCドライバーを登録する
      Class.forName("com.mysql.jdbc.Driver");
      // 接続を開く
      System.out.println("データベースに接続中...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);
      //Statementオブジェクトを生成し、テーブルを構築する
      stmt = conn.createStatement();
      createXMLTable(stmt);
      //FileInputStreamを開く
      File f = new File("XML_Data.xml");
      long fileLength = f.length();
      FileInputStream fis = new FileInputStream(f);
      //PreparedStatementを作成しデータをストリーミングで転送
      String SQL = "INSERT INTO XML_Data VALUES (?,?)";
      pstmt = conn.prepareStatement(SQL);
      pstmt.setInt(1,100);
      pstmt.setAsciiStream(2,fis,(int)fileLength);
      pstmt.execute();
      //入力ストリームを閉じる
      fis.close();
      // 行を取得するためのクエリを実行
      SQL = "SELECT Data FROM XML_Data WHERE id=10"0";
      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){
      //JDBCエラーを処理
      se.printStackTrace();
   }catch(Exception e){
      //Class.forNameのエラーを処理
      e.printStackTrace();
   }finally{
      //リソースを閉じるための
      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2{
      }// 我々は何もできません
      try{
         if(pstmt!=null)
            pstmt.close();
      }catch(SQLException se2{
      }// 我々は何もできません
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }
   }//tryブロックの終了
   System.out.println("Goodbye!");
}//main関数の終了
public static void createXMLTable(Statement stmt) 
   SQLException{
   System.out.println("Creating XML_Data table..." );
   //SQL文の作成
   String streamingDataSql = "CREATE TABLE XML_Data " +
                             "(id INTEGER, Data LONG)";
   //存在する場合、まずテーブルを削除してください。
   try{
      stmt.executeUpdate("DROP TABLE XML_Data");
   }catch(SQLException se){
   }// 何もしない
   //テーブルを作成
   stmt.executeUpdate(streamingDataSql);
}//createXMLTableを終了
}//JDBCExampleを終了

次に、上記の例を以下のようにコンパイルしましょう:

C:\>javac JDBCExample.java
C:\>

実行時JDBCExample、それにより以下の結果が得られます-

C:\>java JDBCExample
Connecting to database...
Creating XML_Data table...
<?xml version="1.0"?>
<Employee>
<id>100</id>
<first>Zara</first>
<last>Ali</last>
<Salary>10000</Salary>
<Dob>18-08-1978</Dob>
<Employee>
さようなら!
C:\>