четверг, 31 мая 2012 г.

Пост 4. CRUD.CREATE.Начинаем работу с Oracle NoSQL DB.

Пока что хватит теории. Давайте немного попрактикуемся. 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. Запуск базы.


Теперь нам понадобится какой-либо инструмент для разработки. В моем случае это будет NetBeans (причина выбора оного - личные предпочтения). Итак, база запущена NetBeans открыт, приступим. Прежде чем выполнять какие-либо операции в БД, надо к ней подключится. Делать это мы будем часто, так что давайте создадим отдельный класс, ответственный за это, который будет входить в пакет simpleoperation.


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);
       myStore.close();
     }
}

В завершении поста хотел бы заметить, что помимо метода put поддерживаются еще 3 схожих метода. putIfAbsent запишет пару только в случае отсутствия подобного ключа в базе, putIfPresent запишет только если указанный ключ существует(аналог update) и,наконец, putIfVersion запишет, если версия пары эквивалентна указанной. Про версии мы поговорим немного позже!

Если у вас есть какие-либо вопросы по Oracle NoSQL - задавайте в комментах, постараюсь ответить, либо пишите на oracle.nosql@gmail.com.

4 комментария:

  1. "...Просто качаем небольшой дистрибутив и запускаем версию light. Распаковываем архив, заходим в папочку bin и запускаем run-kvlite.cmd в случае Windowds, либо run-kvlite.sh в случае Linux."

    Я никак не могу найти папку bin. В каком она архиве, скажи пожалуйста!

    В слове виндоус у тебя ошибка , см. текст в кавычках

    ОтветитьУдалить
  2. Спасибо, за вопрос.
    Во второй версии произошли некоторые изменения в плане контента дистрибутива.
    Надо создать bat файл и запускать его.
    Текст поста поправил.

    ОтветитьУдалить
  3. Привет!

    Может, будет полезно.

    Я не знаю, как на момент написания поста, но сейчас в kvclient в классе Key есть метод fromString. Поэтому, писать parseKey - лишнее :)

    К примеру, конструкция:

    Key key = Key.fromString("/Smith/Bob/Contact/Phone/-/Cellular/Home");

    распарсит все, как нужно.

    ОтветитьУдалить
  4. Олег, спасибо за комментарий!
    Действительно такой медод есть, но на момент написания статьи его не было:)
    Действительно можно использовать его:)

    ОтветитьУдалить