OBKV-Table Javaクライアントは、単一行の更新と一括更新をサポートしています。業務シナリオに応じて適切なAPIを選択してください。
更新API
以下のObTableClient APIを使用してデータを更新できます:
API |
説明 |
注意事項 |
|---|---|---|
update(String tableName) |
単一行データを更新します。更新条件を設定できます。 | |
insertOrUpdate(String tableName) |
単一行データを挿入または更新します。 | |
replace(String tableName) |
単一行データを置き換えます(セマンティクス上は、まず削除してから挿入します)。 | |
put(String tableName) |
単一行データを上書きします。 |
|
increment(String tableName) |
整数列に指定された値を原子的に加算します。 | 元の行が存在しない場合、指定された増分値を使用して新しい行を更新します。 |
append(String tableName) |
文字列列に文字列を原子的に追加します。 | 元の行が存在しない場合、指定された増分値を使用して新しい行を挿入します。 |
checkAndInsUp(String tableName, ObTableFilter filter, InsertOrUpdate insUp, boolean checkExists, boolean rollbackWhenCheckFailed) |
条件を満たす場合に更新します |
|
更新例
前提条件
ObTableClientが初期化されています。データベースにリレーショナルテーブルが作成されています。以下の例では、このテーブルを使用します:
CREATE TABLE IF NOT EXISTS `employees` ( `employeeId` int NOT NULL, `name` varchar(100) NOT NULL, `department` varchar(50), `position` varchar(50), `workYear` int, `comment` varchar(100), PRIMARY KEY (`employeeId`) ) PARTITION BY KEY(`employeeId`) PARTITIONS 97;
単一行の更新
update
以下の例では、主キーemployeeIdが1001の行のworkYearを11に設定する、1行のデータを更新します。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | dev | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
private static void updateRow(ObTableClient obkvHandle) throws Exception {
Row rowKey = row().add(colVal("employeeId", 1001));
Row properties = row().add(colVal("workYear", 11));
obkvHandle.update("employees")
.setRowKey(rowKey)
.addMutateRow(properties)
.execute();
}
以下の例では、主キーemployeeIdが1001の行のworkYearが3以上の場合、workYearを11に設定する、1行のデータを更新します。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | dev | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
private static void updateRowWithFilter(ObTableClient obkvHandle) throws Exception {
Row rowKey = row().add(colVal("employeeId", 1001));
Row properties = row().add(colVal("workYear", 11));
ObTableValueFilter filter = compareVal(ObCompareOp.GE, "workYear", 3);
obkvHandle.update("employees")
.setRowKey(rowKey)
.addMutateRow(properties)
.setFilter(filter)
.execute();
}
insertOrUpdate
以下の例では、主キーemployeeIdが1001の行のworkYearを11に設定する、1行のデータを更新します。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | dev | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
private static void insertOrUpdateRow(ObTableClient obkvHandle) throws Exception {
Row rowKey = row().add(colVal("employeeId", 1001));
Row properties = row().add(colVal("workYear", 11));
obkvHandle.insertOrUpdate("employees")
.setRowKey(rowKey)
.addMutateRow(properties)
.execute();
}
replace
以下の例では、1行のデータを更新し、主キー employeeId が 1001 の行の workYear を 11 に設定します。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | dev | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
private static void replaceRow(ObTableClient obkvHandle) throws Exception {
Row rowKey = row().add(colVal("employeeId", 1001));
Row properties = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 11));
obkvHandle.replace("employees")
.setRowKey(rowKey)
.addMutateRow(properties)
.execute();
}
put
以下の例では、1行のデータを上書きし、主キー employeeId が 1001 の行の workYear を 1 に設定します。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+-----------+--------------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+-----------+--------------+
| 1001 | zhangsan | R&D | dev | 10 | new employee |
+------------+----------+------------+----------+-----------+--------------+
*/
private static void putRow(ObTableClient obkvHandle) throws Exception {
Row rowKey = row().add(colVal("employeeId", 1001));
Row properties = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 1))
.add(colVal("comment", "new employee"));
obkvHandle.put("employees")
.setRowKey(rowKey)
.addMutateRow(properties)
.execute();
}
increment
以下の例では、主キー employeeId が 1001 の行の workYear を原子的に 1 増やし、最終的な値を 11 に設定します。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | dev | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
private static void incrementRow(ObTableClient obkvHandle) throws Exception {
Row rowKey = row().add(colVal("employeeId", 1001));
Row properties = row().add(colVal("workYear", 1));
obkvHandle.increment("employees")
.setRowKey(rowKey)
.addMutateRow(properties)
.execute();
}
append
以下の例では、主キー employeeId が 1001 の行の position に文字列 dev を追加し、最終的な値を java dev に設定します。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | java | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
private static void appendRow(ObTableClient obkvHandle) throws Exception {
Row rowKey = row().add(colVal("employeeId", 1001));
Row properties = row().add(colVal("position", "dev"));
obkvHandle.append("employees")
.setRowKey(rowKey)
.addMutateRow(properties)
.execute();
}
checkAndInsUp
以下の例では、主キー employeeId が 1001 の行の workYear が 3 以上であるかどうかをチェックします。条件を満たしている場合は、insertUpOp を実行し、comment を good に更新します。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | dev | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
private static void checkAndInsUpRow(ObTableClient obkvHandle) throws Exception {
Row rowKey = row().add(colVal("employeeId", 1001));
Row properties = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 10))
.add(colVal("comment", "good"));
InsertOrUpdate insertUpOp = insertOrUpdate().setRowKey(rowKey).addMutateRow(properties);
ObTableValueFilter filter = compareVal(ObCompareOp.GE, "workYear", 3);
MutationResult result = obkvHandle.checkAndInsUp("employees", filter, insertUpOp, true)
.execute();
System.out.println(result.getAffectedRows());
}
バッチ更新
batchUpdate
以下の例では、2行のデータを一括更新し、主キー employeeId がそれぞれ 1001 および 1002 の行の workYear を 11 に設定します。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | dev | 10 | NULL |
| 1002 | lisi | R&D | dev | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
private static void batchUpdateRow(ObTableClient obkvHandle) throws Exception {
Row rowKey1 = row().add(colVal("employeeId", 1001));
Row rowKey2 = row().add(colVal("employeeId", 1002));
Row properties1 = row().add(colVal("workYear", 11));
Row properties2 = row().add(colVal("workYear", 11));
Update updateOp1 = update().setRowKey(rowKey1).addMutateRow(properties1);
Update updateOp2 = update().setRowKey(rowKey2).addMutateRow(properties2);
BatchOperationResult res = obkvHandle.batchOperation("employees")
.addOperation(updateOp1,updateOp2)
.execute();
System.out.println(res.hasError());
}
batchInsertOrUpdate
以下の例では、2行のデータを一括更新し、主キー employeeId がそれぞれ 1001 および 1002 の行の workYear を 11 に設定します。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | dev | 10 | NULL |
| 1002 | lisi | R&D | dev | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
private static void batchInsertOrUpdateRow(ObTableClient obkvHandle) throws Exception {
Row rowKey1 = row().add(colVal("employeeId", 1001));
Row rowKey2 = row().add(colVal("employeeId", 1002));
Row properties1 = row().add(colVal("workYear", 11));
Row properties2 = row().add(colVal("workYear", 11));
InsertOrUpdate insertUpOp1 = insertOrUpdate().setRowKey(rowKey1).addMutateRow(properties1);
InsertOrUpdate insertUpOp2 = insertOrUpdate().setRowKey(rowKey2).addMutateRow(properties2);
BatchOperationResult res = obkvHandle.batchOperation("employees")
.addOperation(insertUpOp1,insertUpOp2)
.execute();
System.out.println(res.hasError());
}
batchReplace
以下の例では、2行のデータを一括更新し、主キー employeeId がそれぞれ 1001 および 1002 の行の workYear を 11 に設定します。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | dev | 10 | NULL |
| 1002 | lisi | R&D | dev | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
private static void batchReplaceRow(ObTableClient obkvHandle) throws Exception {
Row rowKey1 = row().add(colVal("employeeId", 1001));
Row rowKey2 = row().add(colVal("employeeId", 1002));
Row properties1 = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 11));
Row properties2 = row().add(colVal("name", "lisi"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 11));
Replace replaceOp1 = replace().setRowKey(rowKey1).addMutateRow(properties1);
Replace replaceOp2 = replace().setRowKey(rowKey2).addMutateRow(properties2);
BatchOperationResult res = obkvHandle.batchOperation("employees")
.addOperation(replaceOp1,replaceOp2)
.execute();
System.out.println(res.hasError());
}
batchPut
以下の例では、2行のデータを一括更新し、主キー employeeId がそれぞれ 1001 と 1002 の行の workYear を 11 に設定します。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+-----------+--------------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+-----------+--------------+
| 1001 | zhangsan | R&D | dev | 10 | new employee |
| 1002 | lisi | R&D | dev | 10 | new employee |
+------------+----------+------------+----------+-----------+--------------+
*/
private static void batchPutRow(ObTableClient obkvHandle) throws Exception {
Row rowKey1 = row().add(colVal("employeeId", 1001));
Row rowKey2 = row().add(colVal("employeeId", 1002));
Row properties1 = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 11))
.add(colVal("comment", "new employee"));
Row properties2 = row().add(colVal("name", "lisi"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 11))
.add(colVal("comment", "new employee"));
Put putOp1 = put().setRowKey(rowKey1).addMutateRow(properties1);
Put putOp2 = put().setRowKey(rowKey2).addMutateRow(properties2);
BatchOperationResult res = obkvHandle.batchOperation("employees")
.addOperation(putOp1,putOp2)
.execute();
System.out.println(res.hasError());
}
batchIncrement
以下の例では、2行のデータの workYear を一括で 1 増やし、主キー employeeId がそれぞれ 1001 と 1002 の行の最終値をどちらも 11 にします。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | dev | 10 | NULL |
| 1002 | lisi | R&D | dev | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
private static void batchIncrementRow(ObTableClient obkvHandle) throws Exception {
Row rowKey1 = row().add(colVal("employeeId", 1001));
Row rowKey2 = row().add(colVal("employeeId", 1002));
Row properties1 = row().add(colVal("workYear", 1));
Row properties2 = row().add(colVal("workYear", 1));
Increment incrementOp1 = increment().setRowKey(rowKey1).addMutateRow(properties1);
Increment incrementOp2 = increment().setRowKey(rowKey2).addMutateRow(properties2);
BatchOperationResult res = obkvHandle.batchOperation("employees")
.addOperation(incrementOp1,incrementOp2)
.execute();
System.out.println(res.hasError());
}
batchAppend
以下の例では、2行のデータの position に文字列 dev を一括で追加し、主キー employeeId がそれぞれ 1001 と 1002 の行の最終値をどちらも java dev にします。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | java | 10 | NULL |
| 1002 | lisi | R&D | java | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
private static void batchAppendRow(ObTableClient obkvHandle) throws Exception {
Row rowKey1 = row().add(colVal("employeeId", 1001));
Row rowKey2 = row().add(colVal("employeeId", 1002));
Row properties1 = row().add(colVal("position", " dev"));
Row properties2 = row().add(colVal("position", " dev"));
Append appendOp1 = append().setRowKey(rowKey1).addMutateRow(properties1);
Append appendOp2 = append().setRowKey(rowKey2).addMutateRow(properties2);
BatchOperationResult res = obkvHandle.batchOperation("employees")
.addOperation(appendOp1,appendOp2)
.execute();
System.out.println(res.hasError());
}
batchCheckAndInsUp
以下の例では、主キー employeeId がそれぞれ 1001 と 1002 の行の workYear が 3 以上かどうかをチェックします。条件を満たす場合は、comment を good に更新します。
// Assume the following data already exists in the database
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | dev | 10 | NULL |
| 1002 | lisi | R&D | dev | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
private static void batchCheckAndInsUpRow(ObTableClient obkvHandle) throws Exception {
Row rowKey1 = row().add(colVal("employeeId", 1001));
Row rowKey2 = row().add(colVal("employeeId", 1002));
Row properties1 = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 10))
.add(colVal("comment", "good"));
Row properties2 = row().add(colVal("name", "lisi"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 10))
.add(colVal("comment", "good"));
InsertOrUpdate insertUpOp1 = insertOrUpdate().setRowKey(rowKey1).addMutateRow(properties1);
InsertOrUpdate insertUpOp2 = insertOrUpdate().setRowKey(rowKey2).addMutateRow(properties2);
ObTableValueFilter filter = compareVal(ObCompareOp.GE, "workYear", 3);
CheckAndInsUp ckOp1 = new CheckAndInsUp(filter, insertUpOp1, true);
CheckAndInsUp ckOp2 = new CheckAndInsUp(filter, insertUpOp2, true);
BatchOperationResult res = obkvHandle.batchOperation("employees")
.addOperation(ckOp1,ckOp2)
.execute();
System.out.println(res.hasError());
}