クライアントインターフェイスガイド > JDBC経由でのTDVサーバーへの接続 > > JDBC経由でのデータへのアクセス例
 
JDBC経由でのデータへのアクセスの例
TDV JDBCドライバーは、次のステートメントタイプをサポートします。
ステートメントを使用してJDBCを介してデータにアクセスする例
プリペアドステートメントを使用してJDBCを介してデータにアクセスする例
TDV環境でこれらの例を使用するには
1. 次の値を指定します。
TDVサーバーにアクセスするためのログイン資格情報
データソースにアクセスするためのログインクレデンシャル
SELECTステートメント
2. CLASSPATHをcsjdbc.jarに設定します。csjdbc.jarにはTDVJDBCドライバーが含まれています。
3. コードをコンパイルして実行します。
ステートメントを使用したJDBC経由でのデータへのアクセスの例
このセクションには、パススルーログインクレデンシャルのステートメントと仕様の使用法を説明するための例が含まれています。
例1:JDBCドライバーを使用してSelectステートメントを送信する
例2:パススルーデータソースを使用するようにデータソースクレデンシャルを設定する
例3:パススルーデータソースで使用するための資格情報の設定
例4:パススルーデータソースを使用するようにTDVサーバーの資格情報を設定する
例1:JDBCドライバーを使用したSelectステートメントの送信
この例は、SELECTステートメントをTDVJDBCドライバーに送信する方法を示しています。
この例では、データソースはパススルーログイン資格情報を必要としません。代わりに、ログイン資格情報はcompUserとcompPasswordです。
import java.util.*;
import java.sql.*;
 
public class SelectExample {
public static void main(String[] arg) throws Exception {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
String url = "jdbc:compositesw:dbapi@localhost:9401?" +"domain=composite&dataSource=cds";
String user = "compUser";
String pass = "compPassword";
// Load driver
Class.forName("cs.jdbc.driver.CompositeDriver");
// Create connection
conn = DriverManager.getConnection(url, user, pass);
// Create statement
stmt = conn.createStatement();
// Execute statement
rs = stmt.executeQuery("SELECT * FROM catalog.schema.table");
// Get column count
ResultSetMetaData rsmd = rs.getMetaData();
int columns = rsmd.getColumnCount();
// Get results
while(rs.next()) {
for (int i=0; i<columns; i++) {
Object o = rs.getObject(i+1);
if (o == null) {
System.out.print("[NULL]");
} else {
System.out.print(o.toString());
}
System.out.print(" ");
}
System.out.println();
}
} finally {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
}
}
例2:パススルーデータソースを使用するためのデータソース資格情報の設定
この例は、パススルー資格情報(dsUser、dsPassword)を必要とするデータソースにSELECTステートメントを送信する方法を示しています。これらのデータソースのログイン資格情報は、TDVサーバーへのアクセスに使用される資格情報(compUser、compPassword)とは異なります。
import java.util.*;
import java.sql.*;
 
public class multiPassThruWithTDVLogInCred {
public static void main(String[] arg) throws Exception {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
String url = "jdbc:compositesw:dbapi@localhost:9401?"
+"domain=composite&dataSource=cdspt";
String user = "compUser";
String pass = "compPassword";
// Load driver
Class.forName("cs.jdbc.driver.CompositeDriver");
// Create connection
conn = DriverManager.getConnection(url, user, pass);
            ((cs.jdbc.driver.CompositeConnection)conn)
               .setDataSourceCredentials("/shared/sources/dsPassThru",       "dsUser", "dsPassword");
// Create statement
stmt = conn.createStatement();
// Execute statement
rs = stmt.executeQuery("SELECT * FROM catalog.schema.table");
// Get column count
ResultSetMetaData rsmd = rs.getMetaData();
int columns = rsmd.getColumnCount();
// Get results
while(rs.next()) {
for (int i=0; i<columns; i++) {
Object o = rs.getObject(i+1);
if (o == null) {
System.out.print("[NULL]");
} else {
System.out.print(o.toString());
}
System.out.print(" ");
}
System.out.println();
}
} finally {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
}
}
例3:パススルーデータソースで使用するためのクレデンシャルの設定
この例では、データソースへのパスはNULLとして指定されています。リソースパスとしてNULLが指定されている場合、資格情報はセッションのユーザーの一般的な資格情報のリストに追加されます。
プログラムは、ユーザーに対して異なる資格情報を使用してデータソースに接続しようとしますが、指定されたユーザー名とパスワードを持つデータソースにのみ接続します。リソースパスを指定する必要がないため、クライアントはデータソースの名前空間を認識できませんが、接続を成功させるためにさまざまなログイン資格情報を試す必要があります。
import java.util.*;
import java.sql.*;
 
public class multiPassThruWithNull {
public static void main(String[] arg) throws Exception {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
String url = "jdbc:compositesw:dbapi@localhost:9401?"
+"domain=composite&dataSource=cdspt";
String user = "compUser";
String pass = "compPassword";
// Load driver
Class.forName("cs.jdbc.driver.CompositeDriver");
// Create connection
conn = DriverManager.getConnection(url, user, pass);
            ((cs.jdbc.driver.CompositeConnection)conn)
              .setDataSourceCredentials(NULL, "dsUser", "dsPassword");
// Create statement
stmt = conn.createStatement();
// Execute statement
rs = stmt.executeQuery("SELECT * FROM catalog.schema.table");
// Get column count
ResultSetMetaData rsmd = rs.getMetaData();
int columns = rsmd.getColumnCount();
// Get results
while(rs.next()) {
for (int i=0; i<columns; i++) {
Object o = rs.getObject(i+1);
if (o == null) {
System.out.print("[NULL]");
} else {
System.out.print(o.toString());
}
System.out.print(" ");
}
System.out.println();
}
} finally {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
}
}
例4:パススルーデータソースを使用するためのTDVサーバーの資格情報の設定
この例は、例2:パススルーデータソースを使用するようにデータソースクレデンシャルを設定するに似ています。 TDVサーバーにアクセスするためのログイン資格情報は、データソースにアクセスするためのログイン資格情報と同じです。
import java.util.*;
import java.sql.*;
 
public class multiPassThruWithTDVLogInCred {
public static void main(String[] arg) throws Exception {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
String url = "jdbc:compositesw:dbapi@localhost:9401?"
+"domain=composite&dataSource=cdspt";
String user = "dsUser";
String pass = "dsPassword";
// Load driver
Class.forName("cs.jdbc.driver.CompositeDriver");
// Create connection
conn = DriverManager.getConnection(url, user, pass);
            ((cs.jdbc.driver.CompositeConnection)conn)
               .setDataSourceCredentials("/shared/sources/dsPassThru"    "dsUser", "dsPassword");
// Create statement
stmt = conn.createStatement();
// Execute statement
rs = stmt.executeQuery("SELECT * FROM catalog.schema.table");
// Get column count
ResultSetMetaData rsmd = rs.getMetaData();
int columns = rsmd.getColumnCount();
// Get results
while(rs.next()) {
for (int i=0; i<columns; i++) {
Object o = rs.getObject(i+1);
if (o == null) {
System.out.print("[NULL]");
} else {
System.out.print(o.toString());
}
System.out.print(" ");
}
System.out.println();
}
} finally {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
}
}
プリペアドステートメントを使用したJDBC経由でのデータへのアクセスの例
プリペアドステートメントは、SQLステートメントを含むオブジェクトであり、入力パラメータが変化する可能性があり、複数回実行できます。 SQLステートメント内のパラメーターのプレースホルダーとして疑問符(?)を使用します。すべてのプレースホルダーパラメータが設定された後、クエリが実行されます。
プリペアドステートメントの詳細については、JDBC APIのリファレンス、およびJDBC(http://www.oracle.com/technetwork/java/javase/jdbc/index.html)で提供されている情報を参照してください。
プリペアドステートメントを使用する場合の制限
プリペアドステートメントの例
プリペアドステートメントを使用する場合の制限
サーバーにアクセスするためにプリペアドステートメントをTDVJDBCドライバーに送信する場合は、次のルールが適用されます。
サーバーへの1つの接続で、複数のプリペアドステートメントを作成して使用できます。
サーバーはプリペアドステートメントのキャッシュを維持します。その一部は複数の接続にまたがって存在するため、すでにキャッシュにあるプリペアドステートメントを作成すると、サーバーはクエリプランを再作成する必要はありません。キャッシュサイズは構成可能であり、アクセスはManagerを介して行われます。詳細については、TDV管理ガイドを参照してください。
クエリパラメータのプレースホルダーは、リテラルを使用できる場所であればどこでも使用できます。
プレースホルダーパラメーター()を使用したプリペアドステートメントは、SQLをデータソースに送信する前にすべての変数を解決する必要があるため、Netezzaデータシップでは使用できません。データベース固有のネイティブ関数を使用するフェデレーションクエリは、SQLをデータソースに直接プッシュできる必要があります。そうしないと、クエリは失敗します。
DatabaseMetaData.getMetaData()メソッドはサポートされていません。ただし、ResultSet.getMetaData()を使用してResultSetMetaDataを取得できます。
プリペアドステートメントの例
次の例は、TDVサーバーでプリペアドステートメントを使用する方法を示しています。
例1:SELECTステートメント
例2:INSERTステートメント
例3:UPDATEステートメント
例4:DELETEステートメント
例1:SELECTステートメント
次のサンプルコードは、SELECTステートメントを含むプリペアドステートメントの使用方法を示しています。この例では、SELECTステートメントはcustomersテーブルを照会し、特定の条件下で必要なデータを取得します。この条件では、最初にプレースホルダーパラメーター?を使用します。この例では、forループを使用して、プリペアドステートメントのパラメーターの値を設定します。
 
import java.sql.*;
 
public class PreparedStatementSample
{
private static final String COMPOSITE_URL =
"jdbc:compositesw:dbapi@localhost:9401?domain=composite&dataSource=cdbs";
 
private static final String COMPOSITE_DRIVER =
"cs.jdbc.driver.CompositeDriver";
 
private static final String COMPOSITE_USER = "admin";
private static final String COMPOSITE_PASSWORD = "admin";
 
public static void main(String[] args) {
try {
Class.forName(COMPOSITE_DRIVER);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
return;
}
 
try {
execute();
} catch (SQLException ex) {
ex.printStackTrace();
return;
}
}
 
private static void execute()
throws SQLException
{
Connection conn = DriverManager.getConnection(
COMPOSITE_URL, COMPOSITE_USER, COMPOSITE_PASSWORD);
 
PreparedStatement stmt = conn.prepareStatement(
"SELECT * FROM products WHERE ProductID = ?”);
    for (int i = 1; i <= 5 ; i++) {
stmt.setInt(1, i);
ResultSet rs = stmt.executeQuery();
System.out.println("Row " + i);
printResultSet(rs);
rs.close();
}
stmt.close();
conn.close();
  }
 
private static void printResultSet(ResultSet rs)
throws SQLException
{
ResultSetMetaData metaData = rs.getMetaData();
 
while (rs.next()) {
for (int i=1; i<=metaData.getColumnCount(); i++) {
System.out.println(" Column " + i + " " + metaData.getColumnName(i) +
" " + rs.getString(i));
}
}
}
}
例2:INSERTステートメント
次のサンプルコードは、INSERTステートメントを含むプリペアドステートメントの使用法を示しています。この例は、例1:SELECTステートメントと同様に機能しますが、ここでは、executeQuery()の代わりにexecuteUpdate()を使用してSQLを実行し、結果セットは次の数になります。挿入操作の影響を受ける行。
import java.sql.*;
import java.math.BigDecimal;
 
public class PreparedStatementInsert
{
private static final String COMPOSITE_URL =
"jdbc:compositesw:dbapi@localhost:9401?domain=composite&dataSource=tutorial";
 
private static final String COMPOSITE_DRIVER =
"cs.jdbc.driver.CompositeDriver";
 
private static final String COMPOSITE_USER = "admin";
private static final String COMPOSITE_PASSWORD = "admin";
 
 
public static void main(String[] args) {
try {
Class.forName(COMPOSITE_DRIVER);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
return;
}
 
try {
execute();
} catch (SQLException ex) {
ex.printStackTrace();
return;
}
}
 
private static void execute()
throws SQLException
{
Connection conn = DriverManager.getConnection(
COMPOSITE_URL, COMPOSITE_USER, COMPOSITE_PASSWORD);
 
PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO products (ProductID, ProductName, UnitPrice)" +
"VALUES (?, ?, ?)");
stmt.setInt(1, 50);
stmt.setString(2, "new");
stmt.setBigDecimal(3, new BigDecimal(50.00));
 
int rowsInserted = stmt.executeUpdate();
System.out.println("Rows inserted " + rowsInserted);
 
stmt.close();
conn.close();
}
 
private static void printResultSet(ResultSet rs)
throws SQLException
{
ResultSetMetaData metaData = rs.getMetaData();
int rowIndex = 0;
while (rs.next()) {
System.out.println("Row " + rowIndex++);
for (int i=1; i<=metaData.getColumnCount(); i++) {
System.out.println(" Column " + i + " " + metaData.getColumnName(i) +
" " + rs.getString(i));
}
}
}
}
例3:UPDATEステートメント
次のサンプルコードは、UPDATEステートメントを含むプリペアドステートメントの使用法を示しています。この例は、例2:INSERTステートメントと同様に機能します。ここで、結果セットは、更新操作の影響を受ける行数です。
import java.sql.*;
import java.math.BigDecimal;
 
public class PreparedStatementUpdate
{
private static final String COMPOSITE_URL =
"jdbc:compositesw:dbapi@localhost:9401?domain=composite&dataSource=tutorial";
 
private static final String COMPOSITE_DRIVER =
"cs.jdbc.driver.CompositeDriver";
 
private static final String COMPOSITE_USER = "admin";
private static final String COMPOSITE_PASSWORD = "admin";
 
public static void main(String[] args) {
try {
Class.forName(COMPOSITE_DRIVER);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
return;
}
 
try {
execute();
} catch (SQLException ex) {
ex.printStackTrace();
return;
}
}
 
private static void execute()
throws SQLException
{
Connection conn = DriverManager.getConnection(
COMPOSITE_URL, COMPOSITE_USER, COMPOSITE_PASSWORD);
 
PreparedStatement stmt = conn.prepareStatement(
"UPDATE products SET ProductName = ? WHERE ProductID = ?");
 
stmt.setString(1, "newProduct");
stmt.setBigDecimal(2, new BigDecimal(50.00));
 
int rowsUpdated = stmt.executeUpdate();
System.out.println("Rows updated " + rowsUpdated);
 
stmt.close();
conn.close();
}
 
private static void printResultSet(ResultSet rs)
throws SQLException
{
ResultSetMetaData metaData = rs.getMetaData();
int rowIndex = 0;
while (rs.next()) {
System.out.println("Row " + rowIndex++);
for (int i=1; i<=metaData.getColumnCount(); i++) {
System.out.println(" Column " + i + " " + metaData.getColumnName(i) +
" " + rs.getString(i));
}
}
}
}
例4:DELETEステートメント
次のサンプルコードは、DELETEステートメントを含むプリペアドステートメントの使用法を示しています。この例は、例2:INSERTステートメントと同様に機能します。ここで、結果セットは、削除操作の影響を受ける行数です。
import java.sql.*;
import java.math.BigDecimal;
 
public class PreparedStatementDelete
{
private static final String COMPOSITE_URL =
"jdbc:compositesw:dbapi@localhost:9401?domain=composite&dataSource=tutorial";
 
private static final String COMPOSITE_DRIVER =
"cs.jdbc.driver.CompositeDriver";
 
private static final String COMPOSITE_USER = "admin";
private static final String COMPOSITE_PASSWORD = "admin";
 
public static void main(String[] args) {
try {
Class.forName(COMPOSITE_DRIVER);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
return;
}
 
try {
execute();
} catch (SQLException ex) {
ex.printStackTrace();
return;
}
}
 
private static void execute()
throws SQLException
{
Connection conn = DriverManager.getConnection(
COMPOSITE_URL, COMPOSITE_USER, COMPOSITE_PASSWORD);
 
PreparedStatement stmt = conn.prepareStatement(
"DELETE FROM products WHERE ProductID = ?");
stmt.setInt(1, 50);
int rowsDeleted = stmt.executeUpdate();
System.out.println("Rows deleted " + rowsDeleted);
 
stmt.close();
conn.close();
}