JDBC アプリケーションでの XML 列の更新

JDBC アプリケーションでは、Db2 データ・サーバーにある表の XML 列で、XML テキスト・データを使用してデータを更新または挿入することができます。 データサーバーがバイナリXMLデータをサポートしている場合、バイナリXMLデータ (Extensible Dynamic Binary XML DB2® Client/Server Binary XML Formatのデータ )を使用して、テーブルのXMLカラムにデータを更新または挿入することができます。

次の表には、データの XML 列への書き込みに使用できるメソッドと対応する入力データ・タイプがリストされています。

表 1. XML 列の更新用のメソッドとデータ・タイプ
方法 入力データ・タイプ
PreparedStatement.setAsciiStream InputStream
PreparedStatement.setBinaryStream InputStream
PreparedStatement.setBlob Blob
PreparedStatement.setBytes byte[]
PreparedStatement.setCharacterStream Reader
PreparedStatement.setClob Clob
PreparedStatement.setObject byte[]、Blob、Clob、SQLXML、DB2Xml (非推奨)、InputStream、Reader、String
PreparedStatement.setSQLXML1 SQLXML
PreparedStatement.setString ストリング
注:
  1. このメソッドには、JDBC 4.0 以降が必要です。

XML データのエンコード方式は、データ自体から導出する (内部的にエンコードされた データという) か、または外部ソースから導き出される (外部的にエンコードされた データという) ことができます。 データベース・サーバーにバイナリー・データとして送信される XML データは、内部的にエンコードされたデータとして処理されます。 データ・ソースに文字データとして送信される XML データは、外部的にエンコードされたデータとして処理されます。

Javaアプリケーションの外部エンコーディングは常にユニコードエンコーディングです。

外部的にエンコードされたデータに、内部エンコード方式を含めることができます。 つまり、このデータはデータ・ソースに文字データとして送信されますが、このデータにエンコード方式の情報を含めることができます。 データ・ソースにより、以下のように内部エンコード方式と外部エンコード方式の間の非互換性が処理されます。
  • データ ソースが Linux®、UNIX、および Windows システム上の Db2 である場合、外部エンコードと内部エンコードが Unicode でない限り、外部エンコードと内部エンコードに互換性がないと、データベース ソースはエラーを生成します。 外部エンコード方式と内部エンコード方式が Unicode の場合は、データベース・ソースでは内部エンコード方式が無視されます。
  • データベースソースが Db2 for z/OS®、データベースソースは内部エンコーディングを無視します。

XMLカラム内の文字データは、 UTF-8 エンコーディングで保存されます。 データベース・ソースにより、内部エンコード方式または外部エンコード方式から UTF-8 へのデータの変換が処理されます。

例: 以下の例は、データを SQLXML オブジェクトから XML 列へ挿入する方法を示しています。 データがストリング・データであるため、データベース・ソースにより外部的にエンコードされるデータとして処理されます。
  public void insertSQLXML()
  {
	  Connection con = DriverManager.getConnection(url);
    SQLXML info = con.createSQLXML();
                              // Create an SQLXML object
    PreparedStatement insertStmt = null;
    String infoData = 
      "<customerinfo xmlns=""http://posample.org"" " +
      "Cid=""1000"">…</customerinfo>";
    info.setString(infoData);
                              // Populate the SQLXML object
    int cid = 1000;
    try {
      sqls = "INSERT INTO CUSTOMER (CID, INFO) VALUES (?, ?)";
      insertStmt = con.prepareStatement(sqls);
      insertStmt.setInt(1, cid);
      insertStmt.setSQLXML(2, info);
                              // Assign the SQLXML object value 
																 // to an input parameter
      if (insertStmt.executeUpdate() != 1) {
        System.out.println("insertSQLXML: No record inserted.");
      }
    }
    catch (IOException ioe) {
     ioe.printStackTrace();
    }
    catch (SQLException sqle) {
      System.out.println("insertSQLXML: SQL Exception: " +
        sqle.getMessage());
      System.out.println("insertSQLXML: SQL State: " +
        sqle.getSQLState());
      System.out.println("insertSQLXML: SQL Error Code: " +
        sqle.getErrorCode());

    }
  }
例: 以下の例は、データをファイルから XML 列へ挿入する方法を示しています。 データはバイナリー・データとして挿入されるため、データベース・サーバーにより内部エンコード方式が使用されます。
  public void insertBinStream(Connection conn)
  {
    PreparedStatement insertStmt = null;
    String sqls = null;
    int cid = 0;
    Statement stmt=null;
    try {
      sqls = "INSERT INTO CUSTOMER (CID, INFO) VALUES (?, ?)";
      insertStmt = conn.prepareStatement(sqls);
      insertStmt.setInt(1, cid);
      File file = new File(fn);
      insertStmt.setBinaryStream(2, 
        new FileInputStream(file), (int)file.length());
      if (insertStmt.executeUpdate() != 1) {
        System.out.println("insertBinStream: No record inserted.");
      }
    }
    catch (IOException ioe) {
     ioe.printStackTrace();
    }
    catch (SQLException sqle) {
      System.out.println("insertBinStream: SQL Exception: " +
        sqle.getMessage());
      System.out.println("insertBinStream: SQL State: " +
        sqle.getSQLState());
      System.out.println("insertBinStream: SQL Error Code: " +
        sqle.getErrorCode());

    }
  }
例: 以下の例は、バイナリー XML データをファイルから XML 列に挿入する方法を示しています。
…
SQLXML info = conn.createSQLXML();
OutputStream os = info.setBinaryStream ();
FileInputStream fis = new FileInputStream("c7.xml");
int read;
while ((read = fis.read ()) != -1) {
  os.write (read);
}

PreparedStatement insertStmt = null;
String sqls = null;
int cid = 1015;
sqls = "INSERT INTO MyCustomer (Cid, Info) VALUES (?, ?)";
insertStmt = conn.prepareStatement(sqls);
insertStmt.setInt(1, cid);
insertStmt.setSQLXML(2, info);
insertStmt.executeUpdate();