

# Java アプリケーションからの Amazon RDS Data API の呼び出し
<a name="data-api.calling.java"></a>

Java アプリケーションから Amazon RDS Data API (Data API) を呼び出すことができます。

以下の例では、AWS SDK for Java を使用します。詳細については、「[AWS SDK for Java デベロッパーガイド](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/welcome.html)」を参照してください。

それぞれの例で、DB クラスターの Amazon リソースネーム (ARN) を Aurora DB クラスターの ARN に置き換えます。また、シークレット ARN を Secrets Manager のシークレットの ARN に置き換え、DB クラスターへのアクセスを許可します。

**Topics**
+ [SQL クエリの実行](#data-api.calling.java.run-query)
+ [SQL トランザクションの実行](#data-api.calling.java.run-transaction)
+ [SQL のバッチオペレーションを実行する](#data-api.calling.java.run-batch)

## SQL クエリの実行
<a name="data-api.calling.java.run-query"></a>

Java アプリケーションを使用して、`SELECT` ステートメントを実行し、結果を取得することができます。

以下の例では、SQL クエリを実行します。

```
package com.amazonaws.rdsdata.examples;
	
	import com.amazonaws.services.rdsdata.AWSRDSData;
	import com.amazonaws.services.rdsdata.AWSRDSDataClient;
	import com.amazonaws.services.rdsdata.model.ExecuteStatementRequest;
	import com.amazonaws.services.rdsdata.model.ExecuteStatementResult;
	import com.amazonaws.services.rdsdata.model.Field;
	
	import java.util.List;
	
	public class FetchResultsExample {
	  public static final String RESOURCE_ARN = "{{arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster}}";
	  public static final String SECRET_ARN = "{{arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret}}";
	
	  public static void main(String[] args) {
	    AWSRDSData rdsData = AWSRDSDataClient.builder().build();
	
	    ExecuteStatementRequest request = new ExecuteStatementRequest()
	            .withResourceArn(RESOURCE_ARN)
	            .withSecretArn(SECRET_ARN)
	            .withDatabase("{{mydb}}")
	            .withSql("{{select * from mytable}}");
	
	    ExecuteStatementResult result = rdsData.executeStatement(request);
	
	    for (List<Field> fields: result.getRecords()) {
	      String stringValue = fields.get(0).getStringValue();
	      long numberValue = fields.get(1).getLongValue();
	
	      System.out.println(String.format("Fetched row: string = %s, number = %d", stringValue, numberValue));
	    }
	  }
	}
```

## SQL トランザクションの実行
<a name="data-api.calling.java.run-transaction"></a>

SQL トランザクションのスタートから、1 つ以上の SQL ステートメントの実行、Java アプリケーションによる変更のコミットまで行うことができます。

**重要**  
3 分以内にトランザクション ID を使用する呼び出しがないと、トランザクションはタイムアウトします。トランザクションがコミットされる前にタイムアウトした場合は、自動的にロールバックされます。  
トランザクション ID を指定しない場合、呼び出しによる変更は自動的にコミットされます。

以下の例では、SQL トランザクションを実行します。

```
package com.amazonaws.rdsdata.examples;
	
	import com.amazonaws.services.rdsdata.AWSRDSData;
	import com.amazonaws.services.rdsdata.AWSRDSDataClient;
	import com.amazonaws.services.rdsdata.model.BeginTransactionRequest;
	import com.amazonaws.services.rdsdata.model.BeginTransactionResult;
	import com.amazonaws.services.rdsdata.model.CommitTransactionRequest;
	import com.amazonaws.services.rdsdata.model.ExecuteStatementRequest;
	
	public class TransactionExample {
	  public static final String RESOURCE_ARN = "{{arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster}}";
	  public static final String SECRET_ARN = "{{arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret}}";
	
	  public static void main(String[] args) {
	    AWSRDSData rdsData = AWSRDSDataClient.builder().build();
	
	    BeginTransactionRequest beginTransactionRequest = new BeginTransactionRequest()
	            .withResourceArn(RESOURCE_ARN)
	            .withSecretArn(SECRET_ARN)
	            .withDatabase("{{mydb}}");
	    BeginTransactionResult beginTransactionResult = rdsData.beginTransaction(beginTransactionRequest);
	    String transactionId = beginTransactionResult.getTransactionId();
	
	    ExecuteStatementRequest executeStatementRequest = new ExecuteStatementRequest()
	            .withTransactionId(transactionId)
	            .withResourceArn(RESOURCE_ARN)
	            .withSecretArn(SECRET_ARN)
	            .withSql("{{INSERT INTO test_table VALUES ('hello world!')}}");
	    rdsData.executeStatement(executeStatementRequest);
	
	    CommitTransactionRequest commitTransactionRequest = new CommitTransactionRequest()
	            .withTransactionId(transactionId)
	            .withResourceArn(RESOURCE_ARN)
	            .withSecretArn(SECRET_ARN);
	    rdsData.commitTransaction(commitTransactionRequest);
	  }
	}
```

**注記**  
データ定義言語 (DDL) ステートメントを実行する場合は、呼び出しがタイムアウトした後もステートメントを実行し続けることをお勧めします。実行が終了する前に DDL ステートメントが終了すると、エラーが発生したり、データ構造が破損したりする恐れがあります。呼び出しが RDS Data API のタイムアウト間隔である 45 秒を超えた後もステートメントの実行を続けるには、`continueAfterTimeout` パラメータを `true` に設定します。

## SQL のバッチオペレーションを実行する
<a name="data-api.calling.java.run-batch"></a>

Java アプリケーションを使用して、データの配列対して、一括挿入および一括更新オペレーションを実行できます。DML ステートメントは、パラメータセットの配列を使用して実行できます。

**重要**  
トランザクション ID を指定しない場合、呼び出しによる変更は自動的にコミットされます。

以下の例では、バッチ挿入オペレーションを実行します。

```
package com.amazonaws.rdsdata.examples;
	
	import com.amazonaws.services.rdsdata.AWSRDSData;
	import com.amazonaws.services.rdsdata.AWSRDSDataClient;
	import com.amazonaws.services.rdsdata.model.BatchExecuteStatementRequest;
	import com.amazonaws.services.rdsdata.model.Field;
	import com.amazonaws.services.rdsdata.model.SqlParameter;
	
	import java.util.Arrays;
	
	public class BatchExecuteExample {
	  public static final String RESOURCE_ARN = "{{arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster}}";
	  public static final String SECRET_ARN = "{{arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret}}";
	
	  public static void main(String[] args) {
	      AWSRDSData rdsData = AWSRDSDataClient.builder().build();
	
	    BatchExecuteStatementRequest request = new BatchExecuteStatementRequest()
	            .withDatabase("test")
	            .withResourceArn(RESOURCE_ARN)
	            .withSecretArn(SECRET_ARN)
	            .withSql("INSERT INTO test_table2 VALUES (:string, :number)")
	            .withParameterSets(Arrays.asList(
	                    Arrays.asList(
	                            new SqlParameter().withName("string").withValue(new Field().withStringValue("Hello")),
	                            new SqlParameter().withName("number").withValue(new Field().withLongValue(1L))
	                    ),
	                    Arrays.asList(
	                            new SqlParameter().withName("string").withValue(new Field().withStringValue("World")),
	                            new SqlParameter().withName("number").withValue(new Field().withLongValue(2L))
	                    )
	            ));
	
	    rdsData.batchExecuteStatement(request);
	  }
	}
```