Пока что хватит теории. Давайте немного попрактикуемся. Oracle NoSQL DB поддерживает CRUD (создать, получить, изменить, удалить) операции (позволю себе отвлечься, лучшего ответа на вопрос,что такое база данных я не видел). Итак, хорошие новости! Для того что бы начать работать с NoSQL базой, нам не потребуется много усилий, затраченых на установку оной. Просто качаем небольшой дистрибутив и запускаем версию light. Распаковываем архив, заходим в папочку в случае винды создаем bat файл со следующим содержанием:
java -jar D:\Distr\Linux\NoSQL\kv-2.0.23\lib\kvstore-2.0.23.jar kvlite
и запускаем его. Собственно все, база запущена! У меня под виндами это выглядит как то так:
Рис 1. Запуск базы.
package simpleoperation;
import oracle.kv.KVStore;
import oracle.kv.KVStoreConfig;
import oracle.kv.KVStoreFactory;
public class OraStore {
private final KVStore oraStore;
public OraStore(String sname, String host, String port) {
KVStoreConfig kconfig = new KVStoreConfig(sname, host + ":" + port);
oraStore = KVStoreFactory.getStore(kconfig);
System.out.println("Store Opened");
}
public KVStore getStore() {
return oraStore;
}
}
Как видно для подключения к базе нам потребуется имя хоста, порт базы и имя хранилища(все прям как в RDBMS).
А в главном методе это будет выглядеть как то так:
public class SomeMainClass{
static String port = "5000";
static String host = "localhost";
static String store = "kvstore";
public static void main(String[] args) throws FileNotFoundException, IOException, InterruptedException {
OraStore orastore = new OraStore(store, host, port);
KVStore myStore = orastore.getStore();
...................
...................
myStore.close();
}
}
package kvstore.basicExample;
import oracle.kv.Key;
import oracle.kv.Value;
import java.util.ArrayList;
...
List<String> majorComponents = new ArrayList<String>();
List<String> minorComponents = new ArrayList<String>();
...
majorComponents.add("Smith");
majorComponents.add("Bob");
minorComponents.add("phonenumber");
Key myKey = Key.createKey(majorComponents, minorComponents);
String data = "408 555 5555";
Value myValue = Value.createValue(data.getBytes());
kvstore.put(myKey, myValue);
Как видно в этом примере мы сначала создаем два массива для major и minor части. Затем заполняем их (в итоге получается: Smith/Bob/-/phonenumber/). Потом объявляем переменную типа String, называем ее value и присваиваем ей какое-нибудь значение, далее в переменную типа Value выдавливаем поток байтов из String (да, кстати, не забудте добавить в библиотеку kvclient-1.2.123.jar). Давайте автоматизируем процесс записи (это действительно сумашествие, каждый раз проделывать такие выкрутасы, для записи одной строки). Для этого:
1) Достигнем неких договоренностей, а именно: ключ будем записывать в виде: major1/major2/-/minor1/minor2/
2) Создадим вспомогательные классы и методы.
Начнем с метода, который парсит строчку в фомат ключа, забивает распаршенное в массив и возвращает переменную типа ключ. Это будет выглядеть как то так:
public static Key ParseKey(String keysString2) {
int endstring;
if (keysString2.indexOf(":") != -1) {
endstring = keysString2.indexOf(":") - 1;
} else {
endstring = keysString2.length();
}
String keysString = keysString2.substring(0, endstring);
List<String> majorComponents = new ArrayList<>();
List<String> minorComponents = new ArrayList<>();
String[] keysArray = keysString.split("/");
boolean isMajor = true;
for (int i = 0; i < keysArray.length; i++) {
if (keysArray[i].equals("-")) {
isMajor = false;
continue;
}
if (isMajor) {
majorComponents.add(keysArray[i]);
} else {
minorComponents.add(keysArray[i]);
}
}
if ((majorComponents.size() > 0) && (minorComponents.size() > 0)) {
myKey = Key.createKey(majorComponents, minorComponents);
} else if ((majorComponents.size() > 0) & (minorComponents.size() <= 0)) {
myKey = Key.createKey(majorComponents);
} else {
System.out.println("Error");
}
return myKey;
}
Отлично! Давайте теперь создадим метод с помощью которого мы можем записать пару ключ-значение:
public static void put(String sKey, String data, KVStore myStore)
throws FileNotFoundException, IOException {
Key myKey = ParseKey.ParseKey(sKey);
Value myValue = Value.createValue(data.getBytes());
myStore.put(myKey, myValue);
}
Понятно, что в этом случае записывать возможно только переменные типа String. Пока остановимся на этом, чуть позже я приведу пример с другими типами данных(фото, видео). Да и обработки исключений здесь нет, все это мы добавим позже (слона как говорится надо есть по частям). В методе mail это будет выглядеть как то так:
public class SomeMainClass{
static String port = "5000";
static String host = "localhost";
static String store = "kvstore";
public static void main(String[] args) throws FileNotFoundException, IOException, InterruptedException {
OraStore orastore = new OraStore(store, host, port);
KVStore myStore = orastore.getStore();
SimpleOperations.Create.put("first/key/-/in/db/","Oracle",myStore);
SimpleOperations.Create.put("first/key/-/in/db/","Oracle",myStore);
myStore.close();
}
}
В завершении поста хотел бы заметить, что помимо метода put поддерживаются еще 3 схожих метода. putIfAbsent запишет пару только в случае отсутствия подобного ключа в базе, putIfPresent запишет только если указанный ключ существует(аналог update) и,наконец, putIfVersion запишет, если версия пары эквивалентна указанной. Про версии мы поговорим немного позже!
Если у вас есть какие-либо вопросы по Oracle NoSQL - задавайте в комментах, постараюсь ответить, либо пишите на oracle.nosql@gmail.com.