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