レベル: 中級 Khurram Faraaz, Staff Software Engineer, IBM Ronny Bartsch, Software Developer, IBM Susan Malaika, Senior Technical Staff Member, IBM
2009年 01月 15日 IBM® DB2® 9 および 9.5 には pureXML™ フィーチャーを生かした多数の XML 機能が導入されています。この記事を読んで、XML メタデータを管理するなどの管理機能、そして XML を操作および保管するなどのアプリケーション開発機能を、JDBC を使用して実行する方法を学んでください。
はじめに
Java™ 技術と JDBC は、保管されたデータへのアクセス、そしてそのデータの操作に広く利用されている技術ですが、DB2 9 に XML データ型が導入されたことにより、新たな Java プログラミング手法が必要となってきました。最新の JDBC ドライバーである JDBC 4.0 は、XML データ型をサポートします。この記事では、JDBC 4.0 ドライバーを使用して DB2 に XML スキーマを登録する例、そして DB2 を対象に XML データの保管、取得、照会、変換、除去などの操作を実行する例を紹介します。
この記事で説明するのは、JDBC を使用して DB2 9.5 の XML データを操作する方法です。管理タスクを行う方法とアプリケーション開発タスクを行う方法を学んでください。
この記事では、GPX (GPS Exchange Format) という XML 表記を使用します。GPX は、GPS (Global Positioning Systems) データを表すために設計されたフォーマットです。
管理タスクの概要
この記事では、XML データを保管し、操作するために必要な成果物を作成します。さらに、DB2 が提供するユーティリティーを使用して、データベース表に XML データを取り込みます。ここで説明するタスクは、以下のとおりです。
- スクリプトを使用したタスク:
- リレーショナル列と XML 列の両方で構成された「GPX」表を作成します。
- DB2 コマンド・プロンプトから「GPX」表に対してクエリーを実行するストアード・プロシージャーを作成します。このストアード・プロシージャーを、後から Java プログラムで呼び出します。
- Java プログラムを使用したタスク:
- 「GPX」表内の XML 列に XML 索引を作成します。
- CLP で登録済みの XML スキーマを破棄してから、GPX XML スキーマを XML スキーマ・リポジトリーに登録し、XML インスタンスをインポートしてその後のステップで妥当性検査を行えるようにします。
- DB2 が提供するストアード・プロシージャーと DB2 の
IMPORT ユーティリティーを使用して、XML データをファイルから「GPX」表にインポートします。
- DB2 が提供するストアード・プロシージャーと DB2 の
EXPORT ユーティリティーを使用して、「GPX」表のデータ (XML データとリレーショナル・データの両方) を外部ファイルにエクスポートします。
アプリケーション開発タスクの概要
この記事ではまた、Java プログラムから JDBC API を使用して XML を挿入、取得、変更、変換します。具体的には、以下のタスクを行います。
insert ステートメントと外部 XML ファイルを使用して、データを「GPX」表のリレーショナル列と XML 列の両方に挿入します。
- 登録されている GPX XML スキーマに対して妥当性検査を行った XML データを (XML データ・ストリングを使用して) 「GPX」表に挿入します。
- 「GPX」表のリレーショナル列および XML 列からデータを取得します (この記事では、SQL ステートメントを実行する例と XQuery ステートメントを実行する例の両方を説明します)。
- DB2 に登録されているストアード・プロシージャーを呼び出して実行します。
- 指定の XML スキーマに対して妥当性検査を行った XML データを挿入します。
- XQuery を使用して GPX データを取得して変換します。この変換としては、XML 文書への要素の挿入、XML 文書内の既存の XML 要素の値の変更、そして XML 要素の削除を行います。
- 保管された GPX データを XSLT で取得して変換し、HTML を生成します。
前提条件
ご使用の Windows システムに以下のソフトウェアがインストールされている必要があります。
記事に付属の JDBC サンプル (「ダウンロード」を参照) を実行する前に、次のセクションで説明する方法に従ってデータ・ソースとの接続を確立してください。スクリプトおよびこの記事では、すべての作業を C: ドライブ直下で行うことを前提とします。
JDBC DriverManager によるデータ・ソースとの接続の確立
JDBC アプリケーションでは、java.sql パッケージに含まれる JDBC DriverManager インターフェースを使用してデータ・ソースとの接続を確立することができます。
Java アプリケーションはまず、JDBC ドライバーをロードするために、Class.forName メソッドを呼び出します。このドライバーをロードした後、アプリケーションは DriverManager.getConnection メソッドを呼び出してデータベース・サーバーに接続します。
IBM DB2 Driver for JDBC and SQLJ の場合は、引数に com.ibm.db2.jcc.DB2Driver を設定して Class.forName メソッドを呼び出してください。
IBM DB2 Driver for JDBC and SQLJ のロード
IBM DB2 Driver for JDBC を使用してデータベースとの接続を作成するには、以下の 3 つのパラメーターを指定します。
- ユーザー ID
- 対応するユーザー・パスワード
- データベースのロケーションを定義する URL
この URL は、それぞれ以下の意味を持つ 4 つの部分で構成されます。
- jdbc:db2: 接続先が DB2 for z/OS サーバーまたは DB2 for Linux, UNIX, and Windows サーバーであることを示します。
- サーバー: ホスト名またはデータベース・サーバーの IP アドレスです。
- ポート: データベース・サーバーに割り当てられた TCP/IP サーバー・ポート番号です (この番号は 0 から 65535 の整数で、デフォルトは 50000 となります)。
- データベース名: データベースの作成時に定義されたデータベースの名前です (この記事の例では、「gpx」とします)。
IBM DB2 Driver for JDBC and SQLJ をロードするコードをリスト 1 に記載します。
リスト 1. IBM DB2 Driver for JDBC and SQLJ のロード
try {
// Load the IBM DB2 Driver for JDBC and SQLJ with DriverManager
Class.forName("com.ibm.db2.jcc.DB2Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try
{
Connection con = null;
String url ="jdbc:db2://localhost:50000/gpx";
String userid = "db2admin";
String passwd = "db2admin";
con = DriverManager.getConnection(url, userid, passwd); |
catch ブロックは、ドライバーが見つからない場合にエラーを出力するために使用しています。
管理タスク
環境の構成
このセクションでは、記事で使用する Java プログラムに必要な環境をセットアップします。記事に付属のサンプル・プログラム (「ダウンロード」を参照) を実行する前に、DB2 コマンド・プロンプトから以下のコマンドを使ってスクリプト GPX_configure_environment.db2 (「ダウンロード」を参照) を実行してください。
C:\>db2cmd
C:\>db2 –td@ -vf GPX_configure_environment.db2
GPX_configure_environment.db2 スクリプト・ファイルには、リスト 2 に記載するステートメントが含まれています。
リスト 2. 環境の構成
-- Create a database in UTF-8 codeset and territory US.
CREATE DATABASE GPX USING CODESET UTF-8 TERRITORY US
-- Connect to the GPX database.
CONNECT TO GPX
-- Create schema GPXADMIN.
-- Create table GPXADMIN.GPX
create table GPXADMIN.GPX(ID int not null primary key,
COMMENT varchar(1000) not null, DOCUMENT xml)
-- Register the XML Schema GPX.xsd in DB2's XSR as GPXADMIN.GPX
-- Complete the registered XML Schema.
-- Import data into the GPX table using the IMPORT utility.
IMPORT FROM ./GPX_BaseSampledata.del OF DEL XML FROM ./sampledata
XMLVALIDATE USING XDS INSERT INTO GPXADMIN.GPX
-- Set the current schema as GPXADMIN.
-- Create procedure GPXADMIN.QUERY1 with this definition,
CREATE PROCEDURE GPXADMIN.QUERY1(IN sym_param VARCHAR(10))
SPECIFIC QUERY1
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE SQLCODE INTEGER;
DECLARE stmt_text VARCHAR (4096);
DECLARE stmt STATEMENT;
DECLARE cur1 CURSOR WITH RETURN FOR stmt;
SET stmt_text='XQuery declare default element namespace
"http://www.topografix.com/GPX/1/1" ; for $y in
db2-fn:xmlcolumn("GPXADMIN.GPX.DOCUMENT")/gpx/wpt[sym="'||sym_param||'"]
return <type>{$y}</type>';
PREPARE stmt FROM stmt_text;
OPEN cur1;
END@ |
データベース・オブジェクト (表、XML 索引) の作成
このセクションでは、記事で使用する Java プログラムに必要なリレーショナル列と XML 列の両方で構成される表を作成します。
このセクションで使用するファイルは、付属のダウンロードに含まれる CreateDBObjects.java です。
この Java ファイルを実行するには、以下の 2 つのコマンドを実行します。
C:\>javac CreateDBObjects.java
C:\>java CreateDBObjects
リスト 3 に、上記の Java プログラムで実行される内容を記載します。
リスト 3. データベース・オブジェクト (表、XML 索引) の作成
// 1. Load the DB2 JDBC Type 4 Driver with DriverManager.
Class.forName("com.ibm.db2.jcc.DB2Driver");
// 2. Create a Connection object to establish a connection to DB2
// using the getConnection method.
Connection con = null;
String url ="jdbc:db2://localhost:50000/gpx";
String userid = "db2admin";
String passwd = "db2admin";
con = DriverManager.getConnection(url, userid, passwd);
// 3. Prepare a set schema statement.
String setSchema = "SET CURRENT SCHEMA GPXADMIN";
PreparedStatement setSchStmt = con.prepareStatement(setSchema);
// 4. Execute the prepared statement.
setSchStmt.execute();
// 5. Prepare and execute create index statements.
String crtXMLidx01 = "create index GPXADMIN.xmlIndex1 on GPXADMIN.GPX(DOCUMENT)
GENERATE KEYS USING XMLPATTERN \'declare default element namespace
\"http://www.topografix.com/GPX/1/1\" ; /gpx/wpt/sym\' as sql varchar(40)";
PreparedStatement crtIdxstmt01 = con.prepareStatement(crtXMLidx01);
crtIdxstmt01.execute();
String crtXMLidx02 = "create index GPXADMIN.xmlIndex2 on GPXADMIN.GPX(DOCUMENT)
GENERATE KEYS USING XMLPATTERN \'declare default element namespace
\"http://www.topografix.com/GPX/1/1\" ; /gpx/wpt/type\' as sql varchar(40)";
PreparedStatement crtIdxstmt02 = con.prepareStatement(crtXMLidx02);
crtIdxstmt02.execute();
String crtXMLidx03 = "create index GPXADMIN.xmlIndex3 on GPXADMIN.GPX(DOCUMENT)
generate key using xmlpattern \'declare default element namespace
\"http://www.topografix.com/GPX/1/1\" ; /gpx/wpt/@lon\' as sql DOUBLE";
PreparedStatement crtIdxstmt03 = con.prepareStatement(crtXMLidx03);
crtIdxstmt03.execute();
String crtXMLidx04 = "create index GPXADMIN.xmlIndex4 on GPXADMIN.GPX(DOCUMENT)
generate key using xmlpattern \'declare default element namespace
\"http://www.topografix.com/GPX/1/1\" ; /gpx/wpt/@lat\' as sql DOUBLE";
PreparedStatement crtIdxstmt04 = con.prepareStatement(crtXMLidx04);
crtIdxstmt04.execute(); |
XML スキーマの登録とデータのインポート
このセクションでは登録済の XML スキーマを破棄し、Java プログラムから DB2 の XSR (XML Schema Repository) に XML スキーマ文書を登録します。これで、XML スキーマの登録プロセスは完了することになります。CLP を使用して以前に登録されたスキーマを除去するために、RegisterXMLSchema.java プログラムの開始時に drop コマンドが実行されることに注目してください。また、DB2 の IMPORT ユーティリティーを使用してデータを表にインポートする方法も注目に値します。このユーティリティーは、ADMIN_CMD ストアード・プロシージャーから実行されます。ただし、必要なデータは GPX_configure_environment.db2 スクリプトによってすでに表にインポートされているので、このステップはオプションとなります。
このセクションで使用するファイルは、付属のダウンロードに含まれる RegisterXMLSchema.java です。
この Java ファイルを実行するには、以下の 2 つのコマンドを実行します。
C:\>javac RegisterXMLSchema.java
C:\>java RegisterXMLSchema
リスト 4. XML スキーマの登録、ADMIN_CMD ストアード・プロシージャーによるインポート
// 1. Load the DB2 JDBC Type 4 Driver with DriverManager.
Class.forName("com.ibm.db2.jcc.DB2Driver");
// 2. Create a Connection object to establish a connection to DB2
// using the getConnection method.
Connection con = null;
String url ="jdbc:db2://localhost:50000/gpx";
String userid = "db2admin";
String passwd = "db2admin";
con = DriverManager.getConnection(url, userid, passwd);
// 3. Set the current schema to GPXADMIN using the prepareStatement method.
String setSchema = "SET CURRENT SCHEMA GPXADMIN";
PreparedStatement setSchStmt = con.prepareStatement(setSchema);
setSchStmt.execute();
// 4. REGISTER XML Schema in the XML Schema repository,
// using the SYSPROC.XSR_REGISTER stored procedure.
CallableStatement cstmt = con.prepareCall(
"CALL SYSPROC.XSR_REGISTER (?, ?, ?, ?, ?)");
String xsrObjectName = "gpx";
String xmlSchemaLocation = "gpx.xsd";
File schemaDoc = new File("./schemas/gpx.xsd");
InputStream inputStrm = new FileInputStream(schemaDoc);
long length = schemaDoc.length();
cstmt.setString(1,"GPXADMIN");
cstmt.setString(2, xsrObjectName);
cstmt.setString(3, xmlSchemaLocation);
cstmt.setBinaryStream(4, inputStrm,(int)length);
cstmt.setNull(5, java.sql.Types.BLOB);
cstmt.registerOutParameter(1, java.sql.Types.VARCHAR);
cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);
cstmt.execute();
// 5. Complete the XML Schema using the SYSPROC.XSR_COMPLETE stored procedure.
CallableStatement completeXSRstmt =
con.prepareCall("CALL SYSPROC.XSR_COMPLETE (?, ?, ?, ?)");
completeXSRstmt.setString(1,"GPXADMIN");
completeXSRstmt.setString(2,"GPX");
completeXSRstmt.setNull(3,java.sql.Types.VARCHAR);
completeXSRstmt.setInt(4,0);
completeXSRstmt.execute();
completeXSRstmt.close();
// 6. Verify that the XML Schema is registered and completed successfully in the XSR.
String selFromXSR = "select * from sysibm.sysxsrobjects where XSROBJECTNAME='GPX'";
PreparedStatement pstmt = con.prepareStatement(selFromXSR);
pstmt.execute();
ResultSet res = pstmt.executeQuery();
while (res.next())
{
String data = res.getString("XSROBJECTNAME");
System.out.println(data);
}
// 7. This demonstrates how to import data into a table from a java program using the
// SYSPROC.ADMIN_CMD stored procedure which in turn uses the DB2 import utility.
// This is optional; following lines of code are commented in RegisterXMLSchema.java,
// as the import command is executed from GPX_configure_environment.db2.
String importStmt = "IMPORT FROM \"C:/sampledata/GPX_BaseSampledata.del\"
OF DEL XML FROM \"C:/sampledata\" XMLVALIDATE USING XDS INSERT INTO GPXADMIN.GPX";
CallableStatement impStmt = con.prepareCall(
"call SYSPROC.ADMIN_CMD(?)");
impStmt.setString(1,importStmt);
impStmt.execute();
// 8. To drop an xsrobject from the XSR, this will drop GPXADMIN.GPX from the XSR;
// you will have to register the XML Schema again if required.
String dropXSR = "DROP XSROBJECT GPXADMIN.GPX";
PreparedStatement dropStmt = con.prepareStatement(dropXSR);
dropStmt.execute(); |
EXPORT コマンドによる外部ファイルへのデータのエクスポート
このセクションでは、表のデータを外部ファイルにエクスポートします。エクスポートによる出力にはルート要素はなく、XML 処理命令が散在していることから、この出力は整形式 XML ではないことに注意してください。データは 2 つのファイルにエクスポートされます。一方のファイルは XML データが含まれる C:\data.001.xml です。もう一方のファイルは、この data.001.xml に保管されている全 XML データにアクセスするためのリファレンスとオフセットが含まれる C:\data (ファイル拡張子なし) で、デリミターで区切られた形式の ASCII ファイルです。
このセクションで使用するファイルは、付属のダウンロードに含まれる ExportXMLData.java です。
この Java ファイルを実行するには、以下の 2 つのコマンドを実行します。
C:\>javac ExportXMLData.java
C:\>java ExportXMLData
リスト 5. EXPORT コマンドによる外部ファイルへのデータのエクスポート
// 1. Follow the steps mentioned in any of the previous steps to load DB2
// JDBC Type 4 Driver and establish a connection to DB2.
// 2. Create a statement object using the connection object.
Statement stmt = con.createStatement();
// 3. Exports data from a database to one of several external file formats.
// The user specifies the data to be exported by supplying an SQL SELECT
// statement, or by providing hierarchical information for typed tables.
// The data is exported to the server only.
CallableStatement cstmt = con.prepareCall("CALL SYSPROC.ADMIN_CMD (?)");
String exportCMD = "export to c:\\data of DEL select * from GPXADMIN.GPX";
cstmt.setString(1,exportCMD);
cstmt.execute(); |
アプリケーション開発タスク
データベース表への XML データの挿入
このセクションでは XML データを表内の XML 列に挿入します。DB2Xml 型のオブジェクトから getDB2XmlString() メソッドを使用して挿入済み XML データを取得する方法に注目してください。
このセクションで使用するファイルは、付属のダウンロードに含まれる InsertXML.java です。
この Java ファイルを実行するには、以下の 2 つのコマンドを実行します。
C:\>javac InsertXML.java
C:\>java InsertXML
リスト 6. 表への XML データの挿入
1. import com.ibm.db2.jcc.DB2Xml;
// 2. Load the DB2 JDBC Type 4 Driver with DriverManager.
Class.forName("com.ibm.db2.jcc.DB2Driver");
/*
3. Create a Connection object to establish a connection to DB2
using the getConnection method.
*/
Connection con = null;
String url ="jdbc:db2://localhost:50000/gpx";
String userid = "db2admin";
String passwd = "db2admin";
con = DriverManager.getConnection(url, userid,passwd);
// 4. Create a statement object.
Statement stmt = con.createStatement();
/*
5. Prepare and execute an insert statement.
Insert XML data from a file input as binary data
*/
String insrtStmt = "insert into GPXADMIN.GPX values(?,?,?)";
PreparedStatement pstmt = con.prepareStatement(insrtStmt);
pstmt.setInt(1,5000);
pstmt.setString(2,"Bangalore");
File binFile = new File("Bangalore.xml");
InputStream inBin = new FileInputStream(binFile);
pstmt.setBinaryStream(3,inBin,(int)binFile.length());
pstmt.execute();
// 6. Retrieve data (XML and Relational) using resultset.getXXX methods.
String sql2 = "select * from GPXADMIN.GPX where id = ?";
PreparedStatement pstmt2 = con.prepareStatement(sql2);
pstmt2.setInt(1,5000);
ResultSet rs2 = pstmt2.executeQuery();
while (rs2.next())
{
com.ibm.db2.jcc.DB2Xml data = (com.ibm.db2.jcc.DB2Xml) rs2.getObject("DOCUMENT");
System.out.println(rs2.getString("id")+" "+data.getDB2XmlString());
} |
指定した XML スキーマに対して妥当性検査が行われた XML データの挿入
今度は、DB2 の XSR に登録されている特定の XML スキーマに対して XML データの妥当性検査を行った上で、そのデータを挿入します。
このセクションで使用するファイルは、付属のダウンロードに含まれる InsertXMLWithValidation.java です。
この Java ファイルを実行するには、以下の 2 つのコマンドを実行します。
C:\>javac InsertXMLWithValidation.java
C:\>java InsertXMLWithValidation
リスト 7. 指定の XML スキーマに対して妥当性検査が行われた XML データの挿入
/*
1. Follow the steps mentioned in any of the previous steps to load
DB2 JDBC Type 4 Driver and establish a connection to DB2.
*/
// 2. Create a statement object using the connection object.
Statement stmt = con.createStatement();
// 3. Prepare an insert statement with validation and execute it.
//To insert XML Document into XML column with validation against a given XML Schema.
String insrtStmt = "insert into GPXADMIN.GPX values(?,?,XMLVALIDATE(
XMLPARSE(DOCUMENT(CAST(? as VARCHAR(10000))) strip whitespace)
according to xmlschema id gpxadmin.gpx))";
PreparedStatement pstmt = con.prepareStatement(insrtStmt);
/*
Please make sure that the value passed to parameter one is different each time
you execute this program, as there is a primary key defined on the ID column.
*/
pstmt.setInt(1,12345);
pstmt.setString(2,"Germany");
// XML data is assigned to string variable insrtstr.
String insrtStr = "
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<gpx xmlns=\"http://www.topografix.com/GPX/1/1\" creator=\"byHand\" version=\"1.1\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 ..\\schemas\\gpx.xsd\\\">
<wpt lat=\"32.921055008\" lon=\"3.014223107\">
<ele>11.862281</ele>
<time>2006-05-16T11:49:06Z</time>
<name>XYZ Location</name>
<sym>City</sym>
</wpt>
</gpx> ";
pstmt.setString(3,insrtStr);
pstmt.execute(); |
XML 列からの XML データの取得
さまざまな API を使用して、表から XML データを取得します。
このセクションで使用するファイルは、付属のダウンロードに含まれる RetrieveXML.java です。
この Java ファイルを実行するには、以下の 2 つのコマンドを実行します。
C:\>javac RetrieveXML.java
C:\>java RetrieveXML
リスト 8. XML 列からの XML データの取得
1. import com.ibm.db2.jcc.DB2Xml;
// 2. Load the DB2 JDBC Type 4 Driver with DriverManager.
Class.forName("com.ibm.db2.jcc.DB2Driver");
/*
3. Create a Connection object to establish a connection to DB2
using the getConnection method.
*/
Connection con = null;
String url ="jdbc:db2://localhost:50000/gpx";
String userid = "db2admin";
String passwd = "db2admin";
con = DriverManager.getConnection(url, userid,passwd);
// 4. Prepare and execute a select statement.
String selStmt = "SELECT ID, DOCUMENT from GPXADMIN.GPX where ID = ?";
PreparedStatement pstmt = con.prepareStatement(selStmt);
pstmt.setInt(1,4);
/*
5. One way to retrieve data is, to execute the above prepared statement using the
executeQuery method, and then use the resultSet.getString(column-name) method.
*/
ResultSet resultSet = pstmt.executeQuery();
while(resultSet.next())
{
System.out.println(resultSet.getString("DOCUMENT"));
}
/*
6. Another way would be to stream an XML value and use the
getBinrarySteam(String columnName) method, is like this.
*/
resultSet.next();
InputStream inputStream = resultSet.getBinaryStream("DOCUMENT");
int c;
System.out.println(" The following data is retrieved using
resultSet.getBinaryStream(DOCUMENT) ");
while((c=inputStream.read())!= -1)
{
System.out.print((char)c);
}
// 7. Another way to retrieve data is to use an object of type DB2Xml.
ResultSet res = pstmt.executeQuery();
res.next();
DB2Xml db2xml = (DB2Xml) res.getObject("DOCUMENT");
System.out.println(db2xml.getDB2XmlString());
// 8. You can also use a Reader object to retrieve data.
ResultSet resultSet = pstmt.executeQuery();
Reader reader = resultSet.getCharacterStream("DOCUMENT");
do{
System.out.print((char)reader.read());
}
while(reader.read()!=-1); |
XQuery ステートメントの実行
このセクションでは Java プログラムから XQuery を実行します。このクエリーによって、GPX 文書からは、「gpx/wpt/sym」要素に「Dam」が含まれるウェイポイントが返されます。
このセクションで使用するファイルは、付属のダウンロードに含まれる ExecXQuery.java です。
この Java ファイルを実行するには、以下の 2 つのコマンドを実行します。
C:\>javac ExecXQuery.java
C:\>java ExecXQuery
リスト 9. XQuery ステートメントの実行
// 1. Load the DB2 JDBC Type 4 Driver with DriverManager.
Class.forName("com.ibm.db2.jcc.DB2Driver");
/*
2. Create a Connection object to establish a connection to DB2
using the getConnection method.
*/
Connection con = null;
String url ="jdbc:db2://localhost:50000/gpx";
String userid = "db2admin";
String passwd = "db2admin";
con = DriverManager.getConnection(url, userid, passwd);
// 3. Prepare and execute an XQuery statement.
String xQuery = "xquery declare default element namespace
\"http://www.topografix.com/GPX/1/1\" ; for $y in db2-fn:xmlcolumn" +
"('GPXADMIN.GPX.DOCUMENT')/gpx/wpt[sym=\"Dam\"] " +
"return <type> { $y } </type>";
PreparedStatement selectStmt = con.prepareStatement(xQuery);
ResultSet rs = selectStmt.executeQuery();
// Print the results of the XQuery using the result set object.
while(rs.next() )
{
System.out.println(rs.getString(1));
} |
Java プログラムからのストアード・プロシージャーの呼び出し
このセクションでは、Java プログラムからストアード・プロシージャーを呼び出します。「環境の構成」セクションでインストールしたこのストアード・プロシージャーは、前のセクションと同様のクエリーを実行します。
このセクションで使用するファイルは、付属のダウンロードに含まれる StoredProcedureCall.java です。
この Java ファイルを実行するには、以下の 2 つのコマンドを実行します。
C:\>javac StoredProcedureCall.java
C:\>java StoredProcedureCall
リスト 10. Java プログラムからのストアード・プロシージャーの呼び出し
// 1. Load the DB2 JDBC Type 4 Driver with DriverManager.
Class.forName("com.ibm.db2.jcc.DB2Driver");
/*
2. Create a Connection object to establish a connection to DB2
using the getConnection() method.
*/
Connection con = null;
String url ="jdbc:db2://localhost:50000/gpx";
String userid = "db2admin";
String passwd = "db2admin";
con = DriverManager.getConnection(url, userid, passwd);
/*
3. This is to demonstrate how to call a stored procedure.
Stored procedure GPXADMIN.QUERY1 is registered in DB2 from the CLP using a
script file GPX_configure_environment.db2.
*/
CallableStatement clstmt = con.prepareCall("call GPXADMIN.QUERY1(?)");
clstmt.setString(1, "Dam");
clstmt.execute();
// 4. To retrieve results returned by the procedure GPXADMIN.QUERY1
ResultSet rs = clstmt.getResultSet();
// Print the results of the XQuery using the result set object.
while(rs.next())
{
System.out.println(rs.getString(1));
} |
XML 文書に対する XML 要素の挿入、更新および削除
このセクションでは、表の XML 列に保管された XML 文書に対して、XML 要素の挿入、更新、削除を行います。CalaSantVicenc の GPX データを今度は ID 21 で挿入するので、ID 6 で保管された元のデータとの違いを比較することができます。
このセクションで使用するファイルは、付属のダウンロードに含まれる InsUpdDelXMLElement.java です。
この Java ファイルを実行するには、以下の 2 つのコマンドを実行します。
C:\>javac InsUpdDelXMLElement.java
C:\>java InsUpdDelXMLElement
リスト 11. XML 要素の挿入、更新、削除
// 1. Follow the steps mentioned in any of the previous steps to load DB2
JDBC Type 4 Driver and establish a connection to DB2.
// 2. Set the current schema to GPXADMIN.
/*
3. Insert an XML Document into an XML column from an external file.
*/
String insrtStmt = "insert into GPXADMIN.GPX values(?,?,?)";
PreparedStatement pstmt2 = con.prepareStatement(insrtStmt);
pstmt2.setInt(1,21);
pstmt2.setString(2,"CalaSantVicenc_insupddel");
File binFile = new File("./sampledata/CalaSantVicenc.xml");
InputStream inBin = new FileInputStream(binFile);
pstmt2.setBinaryStream(3,inBin,(int)binFile.length());
pstmt2.execute();
inBin.close();
/*
6. INSERT an element in an XML document using the transform expression
in an XQuery statement.
*/
String insEleStmt = "update GPXADMIN.GPX
SET DOCUMENT = XMLQUERY('transform copy $i := $DOCUMENT modify ( do insert
<climate> Hot </climate> after $i/*:gpx/*:wpt/*:ele) return $i') where id=21";
System.out.println("\nXQuery to INSERT an element into a XML document :\n");
System.out.println(insEleStmt);
stmt.executeUpdate(insEleStmt);
System.out.println("\n<climate> element inserted successfully\n");
ResultSet rsInsEle = stmt.executeQuery
("SELECT DOCUMENT FROM GPXADMIN.GPX where ID=21");
while (rsInsEle.next()) {
com.ibm.db2.jcc.DB2Xml data=(com.ibm.db2.jcc.DB2Xml) rsInsEle.getObject(1);
System.out.println(data.getDB2XmlString());
}
/*
7. UPDATE the value of an existing element in an XML document using the
transform expression in an XQuery statement.
*/
String replaceStmt = "UPDATE GPXADMIN.GPX SET DOCUMENT =
XMLQUERY('transform copy $j := $DOCUMENT modify (
do replace value of $j/*:gpx/*:wpt/*:sym/text() with \"Town\")
return $j') where id = 21";
System.out.println("\nXQuery to UPDATE an element's value from XML document :\n");
System.out.println(replaceStmt);
stmt.executeUpdate(replaceStmt);
System.out.println("\nValue of <sym> element replaced successfully\n");
ResultSet rsRplc = stmt.executeQuery
("SELECT DOCUMENT FROM GPXADMIN.GPX where ID=21");
while (rsRplc.next()) {
com.ibm.db2.jcc.DB2Xml data=(com.ibm.db2.jcc.DB2Xml) rsRplc.getObject(1);
System.out.println(data.getDB2XmlString());
}
/*
8. DELETE an element from an XML document using the
transform expression in an X statement.
*/
String delStmt2 = "UPDATE GPXADMIN.GPX SET DOCUMENT =
XMLQUERY('transform copy $k := $DOCUMENT modify
(do delete $k/*:gpx/*:wpt/*:ele)
return $k') where id = 21";
System.out.println("\nXQuery to DELETE an element from XML document :\n");
System.out.println(delStmt2);
stmt.executeUpdate(delStmt2);
ResultSet rs = stmt.executeQuery
("SELECT DOCUMENT FROM GPXADMIN.GPX where ID=21");
System.out.println("\nElement <ele> deleted successfully\n");
while (rs.next()) {
com.ibm.db2.jcc.DB2Xml data=(com.ibm.db2.jcc.DB2Xml) rs.getObject(1);
System.out.println(data.getDB2XmlString());
} |
XSLTRANSFORM 関数による XML の変換
ここでは XSLTRANSFORM スカラー関数を使用して、保管された XML を変換します。
このセクションで使用するファイルは、付属のダウンロードに含まれる XslTransform.java です。
この Java ファイルを実行するには、以下の 2 つのコマンドを実行します。
C:\>javac XslTransform.java
C:\>java XslTransform
リスト 12. XSLTRANSFORM 関数による XML の変換
// 1. Follow steps mentioned in any of the above listings to load DB2 JDBC Type 4
// Driver and establish a connection to DB2.
// 2. Create table to store XML data and related XSL stylesheet data
// in two different XML columns.
create table GPXADMIN.TRNSFRM(ID INT, XMLDOC XML, XSLDOC XML)
/*
3. Prepare and execute an insert statement to insert an GPX XML document and an XSL
stylesheet, pass the contents of the XML document and the XSL stylesheet as string
parameters to the con.prepareStatement method.
*/
// 4. Execute the select statement that uses the XSLTRANSFORM scalar function.
String sql2 =
"SELECT XSLTRANSFORM (xmlDOC USING xslDOC AS CLOB (10M)) FROM GPXADMIN.TRNSFRM";
PreparedStatement pstmt2 = con.prepareStatement(sql2);
ResultSet rs2 = pstmt2.executeQuery();
while (rs2.next())
{System.out.println(rs2.getString(1));}
System.out.println("XSLTRANSFORM Function executed successfully");
// 5. Use ResultSet object to retrieve result of the XSLTRANSFORMATION scalar function. |
リスト 13. XSLTRANSFORM 関数を使用した select ステートメントの実行による出力例
<html xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xdt="http://www.w3.org/2005/xpath-datatypes"
xmlns:n1="http://www.topografix.com/GPX/1/1"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body><br>
<h1><span style="font-weight:bold; ">GPX - GPS Data</span></h1>
<h2><span>Waypoints:</span></h2><br><br><br>
<h3><span style="font-style:italic; font-weight:bold; ">
Cala Sant Vicenå×­ Mallorca</span></h3>
<span>Latitude : </span>
<span>39.921055008</span><br>
<span>Longitude: </span>
<span>3.054223107</span><br><br><br>
<span> </span><br>
</body>
</html> |
まとめ
この記事では、Java JDBC 4.0 ドライバーを使用して XML を操作および管理するさまざまな例を、管理タスクとアプリケーション開発タスクという 2 つのカテゴリー別に記載しました。さらに、ストアード・プロシージャーとパラメーター・マーカーの使用方法や、XQuery、SQL/XML、XSLT、XML スキーマ登録、XML 文書の妥当性検査などの XML 固有の機能についても説明しました。これらの方法がわかれば、Java 開発者は早速、pureXML アプリケーションの作成に取り掛かることができます。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Sample files and Java programs for this article | Work_with_XML_DB2_95_using_JDBC.zip | 79KB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | 
|  | Khurram Faraaz は、DB2 9 for Linux, UNIX, and Windows の IBM 認定のデータベース管理者です。2006年に IBM に入社して以来、DB2 for Linux, UNIX, and Windows XML FVT チームのメンバーとして日常の FVT タスクの他、XML 業界別バンドルの開発にも携わってきました。また、XML スキーマの進化に関する記事の共著者でもあります。 |
 | 
|  | Ronny Bartsch は IBM の Information Management Group (IBM software Group の一部) に勤務するソフトウェア開発者です。彼は XML と DB2 pureXML を使用した業界標準に関連する業種別バンドルとデモの開発に従事しています。 |
 | 
|  | Susan Malaika は IBM の Information Management Group で働いています。彼女の専門はグリッド・コンピューティングを含む XML と Web 技術です。彼女は Web に関する何本かの記事を発表しており、また共著の本もあります。彼女は IBM Academy of Technology のメンバーです。 |
記事の評価
|