OceanBase logo

OceanBase

A unified distributed database ready for your transactional, analytical, and AI workloads.

DEPLOY YOUR WAY

OceanBase Cloud

The best way to deploy and scale OceanBase

OceanBase Enterprise

Run and manage OceanBase on your infra

TRY OPEN SOURCE

OceanBase Community Edition

The free, open-source distributed database

OceanBase seekdb

Open source AI native search database

Customer Stories

Real-world success stories from enterprises across diverse industries.

View All
BY USE CASES

Mission-Critical Transactions

Global & Multicloud Application

Elastic Scaling for Peak Traffic

Real-time Analytics

Active Geo-redundancy

Database Consolidation

Resources

Comprehensive knowledge hub for OceanBase.

Blog

Live Demos

Training & Certification

Documentation

Official technical guides, tutorials, API references, and manuals for all OceanBase products.

View All
PRODUCTS

OceanBase Cloud

OceanBase Database

Tools

Connectors and Middleware

QUICK START

OceanBase Cloud

OceanBase Database

BEST PRACTICES

Practical guides for utilizing OceanBase more effectively and conveniently

Company

Learn more about OceanBase – our company, partnerships, and trust and security initiatives.

About OceanBase

Partner

Trust Center

Contact Us

International - English
中国站 - 简体中文
日本 - 日本語
Sign In
Start on Cloud

A unified distributed database ready for your transactional, analytical, and AI workloads.

DEPLOY YOUR WAY

OceanBase Cloud

The best way to deploy and scale OceanBase

OceanBase Enterprise

Run and manage OceanBase on your infra

TRY OPEN SOURCE

OceanBase Community Edition

The free, open-source distributed database

OceanBase seekdb

Open source AI native search database

Customer Stories

Real-world success stories from enterprises across diverse industries.

View All
BY USE CASES

Mission-Critical Transactions

Global & Multicloud Application

Elastic Scaling for Peak Traffic

Real-time Analytics

Active Geo-redundancy

Database Consolidation

Comprehensive knowledge hub for OceanBase.

Blog

Live Demos

Training & Certification

Documentation

Official technical guides, tutorials, API references, and manuals for all OceanBase products.

View All
PRODUCTS
OceanBase CloudOceanBase Database
ToolsConnectors and Middleware
QUICK START
OceanBase CloudOceanBase Database
BEST PRACTICES

Practical guides for utilizing OceanBase more effectively and conveniently

Learn more about OceanBase – our company, partnerships, and trust and security initiatives.

About OceanBase

Partner

Trust Center

Contact Us

Start on Cloud
编组
All Products
    • Databases
    • iconOceanBase Database
    • iconOceanBase Cloud
    • iconOceanBase Tugraph
    • iconInteractive Tutorials
    • iconOceanBase Best Practices
    • Tools
    • iconOceanBase Cloud Platform
    • iconOceanBase Migration Service
    • iconOceanBase Developer Center
    • iconOceanBase Migration Assessment
    • iconOceanBase Admin Tool
    • iconOceanBase Loader and Dumper
    • iconOceanBase Deployer
    • iconKubernetes operator for OceanBase
    • iconOceanBase Diagnostic Tool
    • iconOceanBase Binlog Service
    • Connectors and Middleware
    • iconOceanBase Database Proxy
    • iconEmbedded SQL in C for OceanBase
    • iconOceanBase Call Interface
    • iconOceanBase Connector/C
    • iconOceanBase Connector/J
    • iconOceanBase Connector/ODBC
    • iconOceanBase Connector/NET
icon

OceanBase Database

KV - V4.3.5

  • OBKV overview
  • Architecture
  • OBKV-Table
    • Introduction to OBKV-Table
      • Overview
      • OBKV-Table operation types
      • Core features of OBKV-Table
      • Differences between replace and insert_or_update
      • Supported value types
      • OBKV-Table data models
    • Use the OBKV-Table Java client
      • Java development guide for OBKV-Table
      • Prepare for development with OBKV-Table
      • Use the OBKV-Table Java client to connect to a cluster
      • Set client parameters
      • Supported client interfaces
      • Use the OBKV-Table Java client
    • Use the OBKV-Table GO client
      • Use the OBKV-Table Go client to connect to a cluster
      • Overview of the Go client
      • Individual API operations
      • Batch operations
      • About queries
      • Aggregation API
      • Filters
    • FAQ
  • OBKV-HBase
    • Overview
    • OBKV-HBase core features
    • Compatibility with HBase
    • Deployment
    • Application development with OBKV-HBase
      • Overview of OBKV-HBase application development
      • Data model
      • Data model design
      • Connect to a cluster using the OBKV-HBase client
      • Migrate HBase business code to OBKV-HBase
      • Data operation examples
      • Delete expired data
    • OBKV-HBase migration guide
    • OBKV-HBase management
      • Overview
      • High availability
      • Security and permissions
      • Monitoring metrics
    • Performance test
    • OBKV-HBase integrations
      • Flink
        • Synchronize data to OBKV-HBase by using Flink
    • Views
    • FAQ

Download PDF

OBKV overview Architecture Overview OBKV-Table operation types Core features of OBKV-Table Differences between replace and insert_or_update Supported value types OBKV-Table data models Java development guide for OBKV-Table Prepare for development with OBKV-Table Use the OBKV-Table Java client to connect to a cluster Set client parameters Supported client interfaces Use the OBKV-Table Java client Use the OBKV-Table Go client to connect to a cluster Overview of the Go client Individual API operations Batch operations About queries Aggregation API Filters FAQ Overview OBKV-HBase core features Compatibility with HBase Deployment Overview of OBKV-HBase application development Data model Data model design Connect to a cluster using the OBKV-HBase client Migrate HBase business code to OBKV-HBase Data operation examples Delete expired data OBKV-HBase migration guide Overview High availability Security and permissions Monitoring metrics Performance test Views FAQ
OceanBase logo

The Unified Distributed Database for the AI Era.

Follow Us
Products
OceanBase CloudOceanBase EnterpriseOceanBase Community EditionOceanBase seekdb
Resources
DocsBlogLive DemosTraining & Certification
Company
About OceanBaseTrust CenterLegalPartnerContact Us
Follow Us

© OceanBase 2026. All rights reserved

Cloud Service AgreementPrivacy PolicySecurity
Contact Us
Document Feedback
  1. Documentation Center
  2. OceanBase Database
  3. KV
  4. V4.3.5
iconOceanBase Database
KV - V 4.3.5
SQL
KV
  • V 4.3.5

Data operation examples

Last Updated:2025-09-08 11:41:13  Updated
share
What is on this page
Preparations
Considerations
Put
Get
Scan
Increment Column Value
Increment
Append
Delete
Exists
Check And Put
Check And Delete
Get Configuration

folded

share

This topic provides examples to describe how to process data on the OBKV-HBase client.

Note

For the list of APIs supported by the OBKV-HBase client, see "Compatibility with HBase".

Preparations

Before you perform data operations on the client, make sure that the following conditions are met:

  • You have deployed an OceanBase cluster. For more information about the supported deployment solutions, deployment methods, and deployment procedure, see Deployment.

  • You have created a MySQL tenant. For more information, see Create a tenant.

  • You have created a database. For more information, see Create a database.

  • You have created an OBKV-HBase data table. For more information, see Data model design.

    The table used by examples in this topic is htable1$family. You can create the table by referring to the following statements:

    CREATE TABLEGROUP htable1;
    
    CREATE TABLE htable1$family (
      K varbinary(1024),
      Q varbinary(256),
      T bigint,
      V varbinary(1048576) NOT NULL,
      PRIMARY KEY(K, Q, T))
      TABLEGROUP =  htable1 ;
    
  • You have deployed and configured the OBKV-HBase client and connected to the cluster by using an OHTable. For more information, see Connect to a cluster by using the OBKV-HBase client.

Considerations

  • The execution results in the following examples depend on the operation sequence. To reproduce the execution results, follow the operation sequence.
  • To vividly observe the operation results in the database, the examples use the MySQL client to connect to OBKV-HBase and query status of the htable1$family table by using SQL statements.

Put

Function description:

  • You can call this function to insert data.

Function prototype:

  • void put(Put put)
  • void put(List puts)

Parameters:

  • put: a Put object, which means to insert a single record.
  • puts: a list of Put objects, which means to insert multiple records at a time.

Example:

// Insert a single record.
String key = "testKey0";
String family = "family";
String column = "column";
String value = "putValue";
Put put = new Put(key.getBytes());
put.add(family.getBytes(), column.getBytes(), value.getBytes());
hTable.put(put);

// Insert multiple records.
Put put1 = new Put(Bytes.toBytes("testKey1"));
put1.add(toBytes(family), toBytes(column), toBytes(value));
//put1.add(toBytes(family), toBytes(column), System.currentTimeMillis(), toBytes(value));

Put put2 = new Put(Bytes.toBytes("testKey2"));
put2.add(toBytes(family), toBytes(column), toBytes(value));
//put2.add(toBytes(family), toBytes(column), System.currentTimeMillis(), toBytes(value));
List<Put> puts = new ArrayList<Put>();
puts.add(put1);
puts.add(put2);
hTable.put(puts);
MySQL [test]> select * from htable1$family;
+----------+--------+----------------+----------+
| K        | Q      | T              | V        |
+----------+--------+----------------+----------+
| testKey0 | column | -1715961035391 | putValue |
| testKey1 | column | -1715961035471 | putValue |
| testKey2 | column | -1715961035471 | putValue |
+----------+--------+----------------+----------+

Remarks:

  • In the preceding example, three cells are inserted into the database.

Get

Function description:

  • You can call this function to obtain the data of the specified row.

Function prototype:

  • Result get(final Get get)
  • Result[] get(List gets)

Parameters:

  • get: a Get object, which is specified by using the addColumn or addFamily function.
  • gets: a list of Get objects.

Example:

// Obtain one family.
String key = "testKey0";
String family = "family";
int maxVersion = 1;
Get get = new Get(key.getBytes());
get.addFamily(family.getBytes());
get.setMaxVersions(maxVersion);
Result result = hTable.get(get);
if (result.list() != null) {
    System.out.printf("Get Demo: get cnt:%d%n", result.list().size());
}
String key = "testKey0";
Get get = new Get(key.getBytes());
Result result = hTable.get(get);
if (result.list() != null) {
    System.out.printf("Get Demo: get cnt:%d%n", result.list().size());
}
MySQL [test]> select * from htable1$family where k = "testKey0";
+----------+--------+----------------+----------+
| K        | Q      | T              | V        |
+----------+--------+----------------+----------+
| testKey0 | column | -1715961561057 | putValue |
+----------+--------+----------------+----------+

Remarks:

  • In the example, the semantics of Get are equivalent to those of the preceding SQL statement when only one data version exists in HBase.
  • The get operation is performed following the put operation. Therefore, the database has a cell whose primary key is testKey0.

Scan

Function description:

  • You can call this function to scan a table based on the specified conditions (scan/family/qualifier).

Function prototype:

  • ResultScanner getScanner(byte[] family, byte[] qualifier)
  • ResultScanner getScanner(final byte[] family)
  • ResultScanner getScanner(final Scan scan)

Parameters:

  • family: the target column family for filtering.
  • qualifier: the target column name for filtering.
  • scan: a Scan object, which is specified by using the addFamily or addColumn function.

Example:

String startKey = "testKey";
String endKey = "testKey9";
String family = "family";
String column = "column";
int maxVersion = 1;
Scan scan = new Scan();
scan.addColumn(family.getBytes(), column.getBytes());
scan.setMaxVersions(maxVersion);
scan.setStartRow(startKey.getBytes());
scan.setStopRow(endKey.getBytes());
ResultScanner scanner = hTable.getScanner(scan);
for (Result r : scanner) {
    for (KeyValue kv : r.list()) {
        System.out.printf("Scan Demo: Rowkey: %s, Column Family: %s, Column Qualifier: %s, Value: %s, Timestamp: %d%n",
                Bytes.toString(r.getRow()),
                Bytes.toString(kv.getFamily()),
                Bytes.toString(kv.getQualifier()),
                Bytes.toString(kv.getValue()),
                kv.getTimestamp());
    }
}
MySQL [test]> select * from htable1$family where k >= "testKey" && k < "testKey9";
+----------+--------+----------------+----------+
| K        | Q      | T              | V        |
+----------+--------+----------------+----------+
| testKey0 | column | -1715961561057 | putValue |
| testKey1 | column | -1715961561132 | putValue |
| testKey2 | column | -1715961561132 | putValue |
+----------+--------+----------------+----------+

Remarks:

  • In the example, the semantics of Scan are equivalent to those of the preceding SQL statement when only one data version exists in HBase.
  • In HBase 0.94, the range defined by startKey and endKey is left-closed and right-open. In other words, data of endKey cannot be scanned.
  • The scan operation is performed following the put operation. Therefore, the database has three cells that meet the conditions.

Increment Column Value

Function description:

  • You can call this function to increment a single column in the specified row. If the function is successfully executed, the new value of the column is returned. The cell of the column must be of the long type, which is used to store a 64-bit integer.

Function prototype:

  • long incrementColumnValue(byte[] row, byte[] family, byte[] qualifier, long amount, boolean writeToWAL)

Parameters:

  • row: the row key.
  • family: the target column family, which is specified when the table is created.
  • qualifier: the name of the target column.
  • amount: the increment step, which can be negative.
  • writeToWAL: specifies whether to pre-write logs. This parameter is not required in OBKV-HBase.

Example:

// Increment a single column by 1.
String column = "incrementColumn";
String key = "incrementKey";
String family = "family";
long increment_value = 1L;
long ret = hTable.incrementColumnValue(
        key.getBytes(),
        family.getBytes(),
        column.getBytes(),
        increment_value);
System.out.printf("Increment Column Demo: ret: %b%n", ret);
MySQL [test]> select *,hex(v) from htable1$family where k = "incrementKey";
+--------------+-----------------+----------------+----------+------------------+
| K            | Q               | T              | V        | hex(v)           |
+--------------+-----------------+----------------+----------+------------------+
| incrementKey | incrementColumn | -1715961669857 |          | 0000000000000001 |
+--------------+-----------------+----------------+----------+------------------+

Remarks:

  • If you use the MySQL client to view an HBase table, you may notice that no value is displayed in the V column of a cell. In this case, the value that should have been displayed in the V column can be displayed in the hex(v) column.
  • If the Increment Column Value function fails to query a cell that meets the conditions from the database, it will generate a cell where the default value is 0 and proceed with the increment.

Increment

Function description:

  • You can call this function to increment one or more columns in the specified row. The cell of the column or columns must be of the long type, which is used to store a 64-bit integer.

Function prototype:

  • Result increment(Increment increment)

Parameters:

  • increment: an Increment object, whose attributes are specified by using the addColumn function.

Example:

// Increment a single column by 1.
String column = "incrementColumn";
String key = "incrementKey";
String family = "family";
long increment_value = 1L;
Increment increment = new Increment(key.getBytes());
increment.addColumn(family.getBytes(), column.getBytes(), increment_value);
Result r = hTable.increment(increment);

for (KeyValue kv : r.list()) {
    System.out.printf("Increment Demo: Rowkey: %s, Value:%s%n",
            Bytes.toString(r.getRow()),
            Bytes.toLong(kv.getValue()));
}
MySQL [test]> select *,hex(v) from htable1$family where k = "incrementKey";
+--------------+-----------------+----------------+----------+------------------+
| K            | Q               | T              | V        | hex(v)           |
+--------------+-----------------+----------------+----------+------------------+
| incrementKey | incrementColumn | -1715961734681 |          | 0000000000000002 |
| incrementKey | incrementColumn | -1715961669857 |          | 0000000000000001 |
+--------------+-----------------+----------------+----------+------------------+

Remarks:

  • Calling the Increment function on a cell multiple times will generate cells of multiple versions. The semantics of the update operation are not supported in HBase. Therefore, a modification of a cell will generate a cell of a new version. You can specify the version for query.

Append

Function description:

  • You can call this function to append data to one or more columns of a character type, such as byte or string, in the specified row.

Function prototype:

  • Result append(Append append)

Parameters:

  • append: an Append object, whose attributes are specified by using the add function.

Example:

String column = "appendColumn";
String key = "appendKey";
String family = "family";
Append append = new Append(key.getBytes());
append.add(family.getBytes(), column.getBytes(), toBytes("_append"));
Result r = hTable.append(append);
for (KeyValue kv : r.list()) {
    System.out.printf("Appand Demo: Rowkey: %s, Append Value:%s%n",
            Bytes.toString(r.getRow()),
            Bytes.toString(kv.getValue()));
}
MySQL [test]> select * from htable1$family where k = "appendKey";
+-----------+--------------+----------------+---------+
| K         | Q            | T              | V       |
+-----------+--------------+----------------+---------+
| appendKey | appendColumn | -1715961265748 | _append |
+-----------+--------------+----------------+---------+

Remarks:

  • If the Append function fails to query a cell that meets the conditions from the database, it will insert a corresponding cell where the default value is an empty string and append data to the cell.

Delete

Function description:

  • You can call this function to delete the specified cells or rows.

Function prototype:

  • void delete(Delete delete)
  • void delete(List deletes)

Parameters:

  • deletes: a Delete object, which refers to the cells or rows to be deleted here. It is specified by using the deleteColumn or deleteFamily function.

Example:

// Delete a row with the specified key, family, and column.
String key = "testKey1";
String family = "family";
String column = "column";
Delete delete = new Delete(key.getBytes());
delete.deleteColumn(family.getBytes(),column.getBytes());
hTable.delete(delete);
MySQL [test]> select * from htable1$family;
+--------------+-----------------+----------------+----------+
| K            | Q               | T              | V        |
+--------------+-----------------+----------------+----------+
| appendKey    | appendColumn    | -1715961265748 | _append  |
| incrementKey | incrementColumn | -1715961228139 |          |
| incrementKey | incrementColumn | -1715961188112 |          |
| testKey0     | column          | -1715961035391 | putValue |
| testKey2     | column          | -1715961035471 | putValue |
+--------------+-----------------+----------------+----------+

Remarks:

  • The preceding query results show that the cells whose primary key is testKey1 are all deleted.

Exists

Function description:

  • You can call this function to determine whether the column family or column specified in a Get object exists. If it exists, true is returned. Otherwise, false is returned.

Function prototype:

  • boolean exists(Get get)

Parameters:

  • get: a Get object, which is specified by using the addFamily or addColumn function.

Example:

String key = "testKey2";
String family = "family";
Get get = new Get(key.getBytes());
get.addFamily(family.getBytes());
boolean ret = hTable.exists(get);
System.out.printf("Exist Demo: ret: %b%n", ret);
MySQL [test]> select * from htable1$family where k = "testKey2";
+----------+--------+----------------+----------+
| K        | Q      | T              | V        |
+----------+--------+----------------+----------+
| testKey2 | column | -1715961561132 | putValue |
+----------+--------+----------------+----------+

Remarks:

  • The semantics of Exists are equivalent to those of Get.

Check And Put

Function description:

  • You can call this function to check and replace the data of the specified column. It returns true if the column exists and its data is replaced, and returns false otherwise.

Function prototype:

  • boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put)

Parameters:

  • row: the target row key.
  • family: the target column family.
  • qualifier: the name of the target column.
  • value: the value of the target column.
  • put: the new column value.

Example:

String key = "testKey2";
String family = "family";
String column = "column";
String value = "putValue";
String new_value = "value_new";
Put put = new Put(key.getBytes());
put.add(family.getBytes(), column.getBytes(), new_value.getBytes());
boolean ret = hTable.checkAndPut(
        key.getBytes(),
        family.getBytes(),
        column.getBytes(),
        value.getBytes(),
        put);
System.out.printf("CheckAndPut Demo: ret: %b%n", ret);
MySQL [test]> select * from htable1$family where k = "testKey2";
+----------+--------+----------------+-----------+
| K        | Q      | T              | V         |
+----------+--------+----------------+-----------+
| testKey2 | column | -1715961408587 | value_new |
| testKey2 | column | -1715961035471 | putValue  |
+----------+--------+----------------+-----------+

Remarks:

  • The cell whose primary key is testKey2 and value is putValue is modified to generate a cell of a new version whose value is value_new.

Check And Delete

Function description:

  • You can call this function to delete the specified column. It returns true if the specified column exists and is deleted, and returns false otherwise.

Function prototype:

  • boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier, byte[] value, Delete delete)

Parameters:

  • row: the target row key.
  • family: the target column family, which is specified when the table is created.
  • qualifier: the name of the target column.
  • value: the value of the target column.
  • delete: the column to delete.

Example:

String key = "testKey2";
String family = "family";
String column = "column";
String value = "value_new";
Delete delete = new Delete(key.getBytes());
delete.deleteColumn(family.getBytes(), column.getBytes());
boolean ret = hTable.checkAndDelete(
        key.getBytes(),
        family.getBytes(),
        column.getBytes(),
        value.getBytes(),
        delete);
System.out.printf("CheckAndDelete Demo: ret: %b%n", ret);
MySQL [test]> select * from htable1$family where k = "testKey2";
+----------+--------+----------------+----------+
| K        | Q      | T              | V        |
+----------+--------+----------------+----------+
| testKey2 | column | -1715961035471 | putValue |
+----------+--------+----------------+----------+

Remarks:

  • The cell whose primary key is testKey2 and value is value_new is deleted.

Get Configuration

Function description:

  • You can call this function to return the config handle of an operation instance. It can be used to change attributes for an operation.

Function prototype:

  • Configuration getConfiguration()

Parameters:

  • None

Example:

hTable.getConfiguration().set("rpc.execute.timeout", "1500");

Previous topic

Migrate HBase business code to OBKV-HBase
Last

Next topic

Delete expired data
Next
What is on this page
Preparations
Considerations
Put
Get
Scan
Increment Column Value
Increment
Append
Delete
Exists
Check And Put
Check And Delete
Get Configuration