TableStore:单行操作
说明:
首先需要添加TableStore的依赖
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>tablestore</artifactId> <version>4.10.2</version> </dependency>
运行项目时可能会出现SLF4J相关的红字提示:
该提示不影响使用,如果觉得不爽的话,可以添加下面依赖去除:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.26</version> </dependency>
TableStore的主键含自增类型,该类型为Interger,但是值很大,不能通过这中自增主键查询数据,因此下面的SDK查询操作都是不允许有自增主键的。
另外。表中的数据操作,对Column或者说属性是有版本号这个概念的,该版本号以时间戳为准。当然,如果属性需要存储多个版本号的数据,在建表的时候要注意最大版本号这么一项,需要设置大于1
1、根据主键查询数据
package com.example.demo; import com.alicloud.openservices.tablestore.SyncClient; import com.alicloud.openservices.tablestore.model.Column; import com.alicloud.openservices.tablestore.model.GetRowRequest; import com.alicloud.openservices.tablestore.model.GetRowResponse; import com.alicloud.openservices.tablestore.model.PrimaryKey; import com.alicloud.openservices.tablestore.model.PrimaryKeyBuilder; import com.alicloud.openservices.tablestore.model.PrimaryKeyValue; import com.alicloud.openservices.tablestore.model.Row; import com.alicloud.openservices.tablestore.model.SingleRowQueryCriteria; public class Query { public static void main(String[] args) { final String endPoint = "实例访问地址"; final String accessKeyId = "accessKeyId"; final String accessKeySecret = "accessKeySecret"; // 实例名 final String instanceName = "owlforest"; SyncClient client = new SyncClient(endPoint, accessKeyId, accessKeySecret, instanceName); // 构造主键 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(1)); PrimaryKey primaryKey = primaryKeyBuilder.build(); SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("note", primaryKey); // 设置读取最新版本 criteria.setMaxVersions(1); // 读取所有数据 GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria)); Row row = getRowResponse.getRow(); // 遍历所有列 Column[] columns = row.getColumns(); for (Column column : columns) { System.out.println("Name:" + column.getName() + " Value:" + column.getValue()); } } }
如果只需要读取指定列,可以这样设置:
// 设置读取某些列 String[] a = { "author" }; criteria.addColumnsToGet(a); GetRowResponse getRowResponse2 = client.getRow(new GetRowRequest(criteria)); Row row2 = getRowResponse2.getRow(); Column[] columns2 = row2.getColumns(); for (Column column : columns2) { System.out.println("Name:" + column.getName() + " Value:" + column.getValue()); }
经测试,criteria.addColumnsToGet("author");这么设置运行也不会报错,不过仍然会读出所有属性。
2、根据主键查询数据-设置过滤器
可以表示的列与值的比较关系包括:EQUAL(=), NOT_EQUAL(!=), GREATER_THAN(>), GREATER_EQUAL(>=), LESS_THAN(<)以及LESS_EQUAL(<=)。
SyncClient client = new SyncClient(endPoint, accessKeyId, accessKeySecret, instanceName); // 构造主键 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(1)); PrimaryKey primaryKey = primaryKeyBuilder.build(); // 读一行 SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("note", primaryKey); // 设置读取最新版本 criteria.setMaxVersions(1); //设置过滤器 SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter( "author", CompareOperator.EQUAL, ColumnValue.fromString("I am zhangsan")); //如果不存在此列,也不返回 singleColumnValueFilter.setPassIfMissing(false); criteria.setFilter(singleColumnValueFilter); GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria)); Row row = getRowResponse.getRow(); if(row != null) { Column[] columns = row.getColumns(); for(Column column : columns) { System.out.println("Name:" + column.getName() + " Value:" + column.getValue() + "\n"); } }else { System.out.println("Row为空"); }
3、根据主键修改一行数据
修改前
SyncClient client = new SyncClient(endPoint, accessKeyId, accessKeySecret, instanceName); // 构造主键 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(1)); PrimaryKey primaryKey = primaryKeyBuilder.build(); RowUpdateChange rowUpdateChange = new RowUpdateChange("note", primaryKey); //修改author属性 rowUpdateChange.put(new Column("author", ColumnValue.fromString("我叫张三"))); //新增属性阅读量view rowUpdateChange.put(new Column("view", ColumnValue.fromLong(10)));//删除title属性rowUpdateChange.deleteColumns("title");// 删除某列的某一版本//rowUpdateChange.deleteColumn(属性名, 版本号);
UpdateRowResponse response = client.updateRow(new UpdateRowRequest(rowUpdateChange));
修改后
4、新增一行数据
SyncClient client = new SyncClient(endPoint, accessKeyId, accessKeySecret, instanceName); // 构造主键 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(1)); PrimaryKey primaryKey = primaryKeyBuilder.build(); RowPutChange rowPutChange = new RowPutChange("note", primaryKey); long ts = System.currentTimeMillis(); rowPutChange.addColumn(new Column("year", ColumnValue.fromLong(2019), ts)); rowPutChange.addColumn(new Column("month", ColumnValue.fromLong(3), ts)); rowPutChange.addColumn(new Column("day", ColumnValue.fromString("天"), ts + 1)); rowPutChange.addColumn(new Column("day", ColumnValue.fromString("日"), ts + 2)); client.putRow(new PutRowRequest(rowPutChange));
note表当中原先就有一条noteid为1的数据,执行PutRow之后,发现原数据被新数据直接覆盖了。
5、期望原行不存在时写入
经测试:当主键1存在时,添加条件RowExistenceExpectation.EXPECT_NOT_EXIST,执行PutRow会出现异常Failed RetriedCount:0 [ErrorCode]:OTSConditionCheckFail, [Message]:Condition check failed.
如果构造的主键不存在于数据库,则可以正常插入。这个条件的使用场景比较让人费解,先记下,兴许后续会用上。
SyncClient client = new SyncClient(endPoint, accessKeyId, accessKeySecret, instanceName); // 构造主键 try { PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(1)); PrimaryKey primaryKey = primaryKeyBuilder.build(); RowPutChange rowPutChange = new RowPutChange("note", primaryKey); rowPutChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_NOT_EXIST)); rowPutChange.addColumn(new Column("attr", ColumnValue.fromString("主键为1,看不到我"),System.currentTimeMillis())); client.putRow(new PutRowRequest(rowPutChange)); } catch (Exception e) { System.out.println(e.getMessage()); }
6、期望存在并某属性满足某条件时,覆盖写入行
同上,满足条件是覆盖该主键的数据,否则出错
SyncClient client = new SyncClient(endPoint, accessKeyId, accessKeySecret, instanceName); PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(2)); PrimaryKey primaryKey = primaryKeyBuilder.build(); RowPutChange rowPutChange = new RowPutChange("note", primaryKey); try { // 期望原行存在,且属性year=2019时插入 Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST); condition.setColumnCondition( new SingleColumnValueCondition("year", CompareOperator.EQUAL, ColumnValue.fromLong(2019))); rowPutChange.setCondition(condition); rowPutChange.addColumn(new Column("attr", ColumnValue.fromString("2019年"))); client.putRow(new PutRowRequest(rowPutChange)); } catch (Exception e) { System.out.println(e.getMessage()); }
7、删除一行数据
SyncClient client = new SyncClient(endPoint, accessKeyId, accessKeySecret, instanceName); // 构造主键 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(10)); PrimaryKey primaryKey = primaryKeyBuilder.build(); RowDeleteChange rowDeleteChange = new RowDeleteChange("note", primaryKey); client.deleteRow(new DeleteRowRequest(rowDeleteChange));
8、根据条件删除数据
SyncClient client = new SyncClient(endPoint, accessKeyId, accessKeySecret, instanceName); // 构造主键 try { PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(1)); PrimaryKey primaryKey = primaryKeyBuilder.build(); RowDeleteChange rowDeleteChange = new RowDeleteChange("note", primaryKey); Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST); condition.setColumnCondition(new SingleColumnValueCondition("year", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(2019))); rowDeleteChange.setCondition(condition); client.deleteRow(new DeleteRowRequest(rowDeleteChange)); } catch (Exception e) { System.out.println(e.getMessage()); }
TableStore:单行操作的更多相关文章
- aliyun TableStore相关操作汇总
总结:这个东西本身可能技术还不成熟,使用的人少,有问题很验证解决 遇到的问题:(1)没有一个GUI工具,使用门槛高(2)查询的GetRange不方便,把查询出来的数据使用System.out.prin ...
- hive支持事务及单行操作 update delete
测试环境 Hive 1.2.1000.2.6.0.3-8 set hive.support.concurrency=true; set hive.exec.dynamic.partition.mod ...
- python 全栈开发,Day124(MongoDB初识,增删改查操作,数据类型,$关键字以及$修改器,"$"的奇妙用法,Array Object 的特殊操作,选取跳过排序,客户端操作)
一.MongoDB初识 什么是MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介 ...
- hbase简单操作
hbase有hbase shell以及hbase 客户端api两种方式进行hbase数据库操作: 首先,hbase shell是在linux命令行进行操作,输入hbase shell命令,进入shel ...
- SQLAlchemy常用操作
Models 只是配置和使用比较简单,因为他是Django自带的ORM框架,也正是因为是Django原生的,所以兼容性远远不如SQLAlchemy 真正算得上全面的ORM框架必然是我们的SQLAlch ...
- MySQL之基础操作
一.安装 Mysql是最流行的关系型数据库管理系统之一,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数 ...
- python工业互联网应用实战5—Django Admin 编辑界面和操作
1.1. 编辑界面 默认任务的编辑界面,对于model属性包含"choices"会自动显示下来列表供选择,"datetime"数据类型也默认提供时间选择组件,如 ...
- Visual Studio Code 配置指南
Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器.在我看来它是「一款完美的编辑器」. 本文是有关 VS Code 的特性介绍与配置指 ...
- 2、C#面向对象:封装、继承、多态、String、集合、文件(上)
面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...
随机推荐
- thinkphp5 怎么获取当前的模块,控制器和方法名
//当前模块url地址 $request= Request::instance(); $module_name=$request->module(); $controller_name=$req ...
- Scrapy 爬取BOSS直聘关于Python招聘岗位
年前的时候想看下招聘Python的岗位有多少,当时考虑目前比较流行的招聘网站就属于boss直聘,所以使用Scrapy来爬取下boss直聘的Python岗位. 1.首先我们创建一个Scrapy 工程 s ...
- spring-整合Struts2
1. Spring 如何在 WEB 应用中使用 ? 1). 需要额外加入的 jar 包: spring-web-4.0.0.RELEASE.jarspring-webmvc-4.0.0.RELEASE ...
- API - .after
.after() Insert content, specified by the parameter, after each element in the set of matched elemen ...
- ML: 降维算法-概述
机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中.降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达, y是数据点映射后的低维向量 ...
- DataGridView之DataError
解决思路一: private void dgvChargeList_DataError(object sender, DataGridViewDataErrorEventArgs e) { bool ...
- WPF Demo20 模板
<Window x:Class="控件模板.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/x ...
- 解决Delphi 2010启动时卡死并报“displayNotification: 堆栈溢出”错误
1. 清理IE的历史记录,删除浏览器缓存(不需要清cookie) 2. 禁用startpage 2.1 从 Delphi 2010 启动菜单上点右键 -> 查看属性->快捷方式->目 ...
- maven(一 基本操作 命令 标签)
原来一直没有使用maven 小公司,只是听说过这个东西,我没事就喜欢 去学习一些新东西.maven学了几次,但是 没有用上 所以 最后还是忘记了,或者说不知道怎么使用maven,一年半以前公司 改革 ...
- 观察者模式之一:java实现观察者模式
<观察者模式之一:java实现观察者模式> <观察者模式之二:JDK自带的观察者模式> 1.初步认识 观察者模式的定义: 在对象之间定义了一对多的依赖,这样一来,当一个对象改变 ...