准备工作
在您开始Tablestore SDK开发前,需确保已开通表格存储服务并且已创建表格存储实例。
您需要提前获取到以下几个参数
开发简介
开发示例中将以订单场景为例,使用Tablestore SDK实现如下几个功能。
- 订单表创建。
- 订单插入。
- 订单号查询。
- 订单搜索。
字段名 |
字段类型 |
字段描述 |
|
order_id |
String |
主键 |
订单号 |
customer_name |
String |
属性列 |
消费者姓名 |
product_name |
String |
属性列 |
产品名 |
product_type |
String |
属性列 |
产品类型 |
order_time |
String |
属性列 |
下单时间 |
pay_time |
String |
属性列 |
支付时间 |
订单表
开发步骤
初始化连接
Tablestore支持Http/Https协议访问服务端,使用Java SDK发起请求前,您需要初始化一个OTSClinet实例,初始化需要获取到服务地址(endpoint)、实例名(instanceName)、密钥(accessKeyId、accessSecret)等信息。代码如下
publicstaticvoidmain(String[] args) { SyncClientsyncClient=newSyncClient( "https://order-instance.cn-beijing.ots.aliyuncs.com",//your endpoint,此处可选择公网地址"",//your accessKeyId"",//your accessSecret"order-instance");//your instance name//operation_method(syncClinet);//operation method}
创建数据表
示例代码中创建了一张订单数据表order。
publicstaticvoidcreateOrderTable(SyncClientsyncClient){ TableOptionstableOptions=newTableOptions(); tableOptions.setMaxVersions(1); tableOptions.setTimeToLive(-1); TableMetatableMeta=newTableMeta("order");//设置表名tableMeta.addPrimaryKeyColumn("order_id",PrimaryKeyType.STRING);//设置主键CreateTableRequestcreateTableRequest=newCreateTableRequest(tableMeta,tableOptions); syncClient.createTable(createTableRequest);//发送创建表请求System.out.println("create order table succeed"); }
写入数据
示例代码中写入了一条订单数据,订单号order_id为“o1”。样例中模拟了一万条订单数据,这里不作展示。
publicstaticvoidputOrder(SyncClientsyncClient){ RowPutChangerowPutChange=newRowPutChange("order");//设置表名rowPutChange.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder() .addPrimaryKeyColumn("order_id",PrimaryKeyValue.fromString("o1"))//设置主键 .build()); rowPutChange.addColumns(Arrays.asList( newColumn("customer_name",ColumnValue.fromString("消十一")),//设置属性列信息newColumn("product_name",ColumnValue.fromString("iphone 6")), newColumn("product_type",ColumnValue.fromString("手机")), newColumn("order_time",ColumnValue.fromString("2021-10-25 09:20:01")), newColumn("pay_time",ColumnValue.fromString("2017-10-25 10:00:01")) )); syncClient.putRow(newPutRowRequest(rowPutChange));//发送插入数据请求System.out.println("put order succeed"); }
查询数据
示例代码中查询订单号order_id为“o1”的记录
publicstaticvoidgetOrder(SyncClientsyncClient){ SingleRowQueryCriteriacriteria=newSingleRowQueryCriteria("order");//设置表名criteria.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder() .addPrimaryKeyColumn("order_id",PrimaryKeyValue.fromString("o1"))//设置主键 .build()); criteria.setMaxVersions(1); GetRowResponseresponse=syncClient.getRow(newGetRowRequest(criteria));//发送读取数据请求System.out.println(response.getRow()); }
创建多元索引
示例代码中创建了一个多元索引order_index。分别设置customer_name字符串类型、order_time字符串类型、pay_time字符串类型、product_name分词类型、product_type字符串类型。关于索引字段类型的介绍请参考多元索引概述。
publicstaticvoidcreateSearchIndex(SyncClientsyncClient){ CreateSearchIndexRequestcreateSearchIndexRequest=newCreateSearchIndexRequest("order","order_index");//设置表名和索引名IndexSchemaindexSchema=newIndexSchema(); indexSchema.setFieldSchemas(Arrays.asList(//设置索引结构newFieldSchema("customer_name",FieldType.KEYWORD), newFieldSchema("order_time",FieldType.KEYWORD), newFieldSchema("pay_time",FieldType.KEYWORD), newFieldSchema("product_name",FieldType.TEXT), newFieldSchema("product_type",FieldType.KEYWORD) )); createSearchIndexRequest.setIndexSchema(indexSchema); syncClient.createSearchIndex(createSearchIndexRequest);//发送创建索引请求System.out.println("create search index succeed"); }
搜索数据
示例代码中查询产品类型为“手机”的订单,并统计了符合条件的行数。
publicstaticvoidsearchQuery1(SyncClientsyncClient){ SearchRequestsearchRequest=SearchRequest.newBuilder() .tableName("order").indexName("order_index")//设置表名、索引名 .searchQuery(SearchQuery.newBuilder() .query(QueryBuilders.term("product_type","手机"))//查询类型为手机的记录 .getTotalCount(true)//获取查询命中的行数 .build()) .returnAllColumns(true) .build(); SearchResponseresponse=syncClient.search(searchRequest); System.out.println("total rows:"+response.getTotalCount()); for(Rowrow : response.getRows()){ System.out.println(row); } }
示例代码中搜索产品名包含“iphone”的订单,并统计了符合条件的行数。
publicstaticvoidsearchQuery2(SyncClientsyncClient){ SearchRequestsearchRequest=SearchRequest.newBuilder() .tableName("order").indexName("order_index")//设置表名、索引名 .searchQuery(SearchQuery.newBuilder() .query(QueryBuilders.match("product_name","iphone"))//搜索产品名中包含iphone的行 .getTotalCount(true)//获取查询命中的行数 .build()) .returnAllColumns(true) .build(); SearchResponseresponse=syncClient.search(searchRequest); System.out.println("total rows:"+response.getTotalCount()); for(Rowrow : response.getRows()){ System.out.println(row); } }
示例代码中查询了消费者姓名为“消十一”并且下单时间在“2021-10-24 00:00:00”之间的订单。并统计了行数。
publicstaticvoidsearchQuery3(SyncClientsyncClient){ SearchRequestsearchRequest=SearchRequest.newBuilder() .tableName("order").indexName("order_index")//设置表名、索引名 .searchQuery(SearchQuery.newBuilder() .query(QueryBuilders.bool() .must(QueryBuilders.term("customer_name","消十一")) .must(QueryBuilders.range("order_time").lessThan("2021-10-24 00:00:00"))) .getTotalCount(true)//获取查询命中的行数 .build()) .returnAllColumns(true) .build(); SearchResponseresponse=syncClient.search(searchRequest); System.out.println("total rows:"+response.getTotalCount()); for(Rowrow : response.getRows()){ System.out.println(row); } }
删除多元索引
示例代码中展示了删除订单表order中的order_index多元索引。
publicstaticvoiddeleteSearchIndex(SyncClientsyncClient){ DeleteSearchIndexRequestdeleteSearchIndexRequest=newDeleteSearchIndexRequest(); deleteSearchIndexRequest.setTableName("order"); deleteSearchIndexRequest.setIndexName("order_index"); syncClient.deleteSearchIndex(deleteSearchIndexRequest); System.out.println("delete search index succeed"); }
删除数据表
示例代码中展示了删除订单表order。删除表之前需确保先删除表中的多元索引。
publicstaticvoiddeleteTable(SyncClientsyncClient){ syncClient.deleteTable(newDeleteTableRequest("order"));//发送删除数据表请求System.out.println("delete table succeed"); }
更多关于Tablestore JAVA SDK的介绍请参考Tablestore JAVA SDK。