Страницы

среда, 24 мая 2017 г.

Копируем данные быстро (ObjectDB)

     В небольших проектах на Java часто возникает желание упаковать всё в один исполняемый файл, эдакий uber-jar, чтобы можно было легко и быстро развернуть код на любой машине. А плюшки серьезно развивающегося Spring Boot только этому способствуют.

     Практически обязательный вопрос, который появится при создании проекта - какую базу данных (встроенную, естественно) использовать? Одним из удобных вариантов является ObjectDB - объектно-ориентированная база данных, реализующая стандарт JPA (Java Persistence API) http://www.objectdb.com На сайте есть достаточно подробные инструкции по установке и использованию.

     Однако, как быстро перенести табличные данные из имеющегося CSV или DSV файла?
     Здесь может помочь небольшая CLI-программа, позволяющая записать информацию в файл ODB из исходного CSV/DSV или принимая данные со стандартного ввода.

     Для начала, создайте проект в вашей IDE и скопируйте в него entity-класс или классы (название не только класса, но и пакета должно совпадать с целевым проектом).
     Затем создайте два класса  - Serializer и ODBCreate (исходный код доступен на https://github.com/bord81/Usefull-stuff/tree/File-or-console-input/ObjectDB/table-qcreate).

     В классе Serializer нужно указать имя промежуточного файла для entity-класса:

private static final String targetFile = "your_entity.ser";

     И его название:

SomeEntityClass someEntityClass = new SomeEntityClass();

     После этого можно запустить ODBCreate.java и выбрать Serialize new class - 's'.
   
     Зачем это нужно? На следующем этапе, программа прочитает сериализованный entity-класс, используя рефлексию получит структуру его полей и создаст или обновит соответствующую таблицу в файле ObjectDB.

     Для этого в классе ODBCreate нужно прописать следующее:

     Имя odb-файла

private static final String oDBfile = "filename.odb";

     Файл-источник (CSV/DSV)

private static final String dbSource = "filename.dsv";

     Символ-разделитель полей

private static final String dbSeparator = ";"

     В зависимости от типа данных (Integer или Long), возможно прийдется поменять метод в первом блоке кода - Integer.parseInt или Long.parseLong.

     Далее программа запускается снова и данные переносятся непосредственно в базу, и, если их больше чем пару строк, то усилия на создание этого промежуточного проекта себя более чем оправдывают. Также возможен последовательный ввод данных с клавиатуры (для теста например).

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