OBKV-Table Javaクライアントは、単一行データの更新と一括データの更新をサポートしています。業務ニーズに応じて、適切なインターフェースを選択してデータを更新することができます。
更新をサポートするインターフェース
ObTableClientが更新をサポートするインターフェースは以下のとおりです。
インターフェース |
説明 |
注意事項 |
|---|---|---|
update(String tableName) |
1行のデータを更新します。更新条件を設定できます。 | |
insertOrUpdate(String tableName) |
1行のデータを挿入または更新します。 | |
replace(String tableName) |
1行のデータを置き換えます(既存行を削除してから、新しい行を書き込むロジック)。 | |
put(String tableName) |
1行のデータを上書きします。 |
|
increment(String tableName) |
整数型の列の値をアトミックに加算します。 | 古い行が存在しない場合、指定されたdelta値を持つ新しい行を作成します。 |
append(String tableName) |
文字列型の列に文字列をアトミックに追加します。 | 古い行が存在しない場合、新しい行を追加し、指定されたdelta値を設定します。 |
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に更新します。
// データベースには既に以下のデータが存在していると仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| 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に更新します。
// データベースには既に以下のデータが存在していると仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| 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に更新します。
// データベースには既に以下のデータが存在していることを仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| 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
この例では、主キーemployeeIdが1001の行のworkYearを11に更新します。
// データベースには既に以下のデータが存在していることを仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| 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
この例では、主キーemployeeIdが1001の行を上書きし、workYearを11に設定します。
// データベースには既に以下のデータが存在するものとします
/*
+------------+----------+------------+----------+-----------+--------------+
| 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にします。
// データベースには既に以下のデータが存在するものとします
/*
+------------+----------+------------+----------+----------+---------+
| 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 となります。
// データベースには既に以下のデータが存在するものと仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| 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 以上であるかどうかをチェックします。3 以上の場合、insertUpOp を実行して comment を good に更新します。
// データベースには既に以下のデータが存在すると仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| 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
サンプルコードでは、1回のバッチ処理で2行のデータを更新し、主キー employeeId が 1001 および 1002 の workYear をどちらも 11 に更新します。
// データベースには既に以下のデータが存在するものと仮定します
/*
+------------+----------+------------+----------+----------+---------+
| 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
サンプルコードでは、1回のバッチ処理で2行のデータを更新し、主キー employeeId が 1001 および 1002 の workYear をいずれも 11 に変更します。
// データベースには既に以下のデータが存在すると仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| 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
サンプルコードでは、1回のバッチ処理で2行のデータを更新します。主キーemployeeIdが1001および1002のworkYearをどちらも11に更新します。
// データベースには既に以下のデータが存在していることを仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| 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
サンプルコードでは、1回のバッチ処理で2行のデータを更新します。主キー employeeId が 1001 と 1002 の workYear をどちらも 11 に更新します。
// データベースには既に以下のデータが存在することを仮定します。
/*
+------------+----------+------------+----------+-----------+--------------+
| 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("comm ent", "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
サンプルコードでは、1バッチ内で2行のデータを更新し、主キー employeeId が 1001 および 1002 の workYear をそれぞれ 1 加算します。最終的な結果は 11 となります。
// データベースには既に以下のデータが存在することを仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| 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行のデータを更新し、主キー employeeId が 1001 および 1002 の position に文字列 dev を追加し、最終的な結果は java dev となります。
// データベースには既に以下のデータが存在することを前提とします。
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | java | 10 | NULL |
| 1001 | 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 以上であるかどうかをチェックし、3 以上の場合は comment を good に更新します。
// データベースには既に以下のデータが存在するものと仮定します。
/*
+------------+----------+------------+----------+----------+---------+
| employeeId | name | department | position | workYear | comment |
+------------+----------+------------+----------+----------+---------+
| 1001 | zhangsan | R&D | dev | 10 | NULL |
| 1002 | lisi | R&D | dev | 10 | NULL |
+------------+----------+------------+----------+----------+---------+
*/
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());
}