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