

# 从 Java 应用程序调用 Amazon RDS 数据 API
<a name="data-api.calling.java"></a>

您可以从 Java 应用程序调用 Amazon RDS 数据 API（数据 API）。

以下示例使用适用于 Java 的 AWS 开发工具包。有关更多信息，请参阅 [适用于 Java 的 AWS SDK 开发人员指南](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/welcome.html)。

在每个示例中，将数据库集群的 Amazon 资源名称（ARN）替换为您的 Aurora 数据库集群的 ARN。另外，将密钥 ARN 替换为 Secrets Manager 中允许访问该数据库集群的密钥的 ARN。

**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>

您可以运行 `SELECT` 语句并使用 Java 应用程序提取结果。

以下示例运行 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>

您可以通过 Java 应用程序开始 SQL 事务、运行一个或多个 SQL 语句，然后提交更改。

**重要**  
如果三分钟之内没有任何调用使用其事务 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 数据 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);
	  }
	}
```