Пример использования базы данных H2 в embended-режиме в Eclipse

Статья предназначено прежде всего для новичков, т.к. и сам я не являюсь программистом по своей специальности, и на Java начал программировать совсем недавно.

Мне захотелось написать одну простую программу, в которой использовалось бы встроенная БД. Немного погуглив я вышел на H2. Об этой БД были хорошие отзывы, и в сравнении производительности у нее были хорошие результаты, поэтому ее и выбрал.

Далее у меня появилась проблема как же ее все-таки использовать. Дальше я снова погуглил, и нашел вот это. Здесь правда для NetBeans, в Eclipse я делал по другому. В первую очередь это касается создания таблиц. Далее опишу что у меня получилось.


1. Скачиваем с сайта установочный файл или zip архив. Устанавливаем и распаковываем.

2. Для того чтоб было проще, я скопировал в отдельную папку h2-*.jar из папки bin и папку javadoc из папки docs.

3. Далее запускаем Eclipse, создаем новый проект, задаем ему имя и нажимаем Next. В следующем окне выбираем Add External JAR’s и там выбираем наш h2-*.jar. Разворачиваем список появившийся и выбираем Javadoc Location нажав кнопку Edit, выбираем папку javadoc. И жмем Finish.
image

4. Создаем package и class которые вам нужны. Далее последует код который поможет вам создать базу, таблицу, заполнить ее значениями и получить их.

import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectH2 {

public static void main(String[] args) {
try {
Class.forName("org.h2.Driver").newInstance();
Connection conn = DriverManager.getConnection("jdbc:h2:test",
"sa", "");
Statement st = null;
st = conn.createStatement();
st.execute("INSERT INTO TEST VALUES(default,'HELLO')");
st.execute("INSERT INTO TEST(NAME) VALUES('JOHN')");
String name1 = "Jack";
String q = "insert into TEST(name) values(?)";
PreparedStatement st1 = null;

st1 = conn.prepareStatement(q);
st1.setString(1, name1);
st1.execute();

ResultSet result;
result = st.executeQuery("SELECT * FROM TEST");
while (result.next()) {
String name = result.getString("NAME");
System.out.println(result.getString("ID")+" "+name);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}


Вот небольшие комментарии по коду.

Обработка ошибки try..catch – я использовал простую обработку Exception, иначе выдавалось бы сообщение об ошибке что не обрабатываются исключения, и просило бы обработать исключения SQLException и еще какие-то, просто Exception упрощает в данном случае написание кода, но не думаю что это слишком правильно и следует все таки более аккуратно обрабатывать исключения.

Class.forName("org.h2.Driver").newInstance();

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

Connection conn = DriverManager.getConnection("jdbc:h2:test","sa", "");

Первое здесь это путь к файлу с БД. Если написать так, то он создаться в корне с программой (jar файлом, а в случае запуска из Eclipse — в корне проекта), так же можно задать путь в какую-нибудь папку, относительный путь и т.п. Далее идет имя администратора и пароль. Так как я создаю встроенную базу данных, то не стал пока разбираться с пользователями и т.п. После этого должен создаться файл test.h2.db. Так же этот файл можно зашифровать сразу же. В файле H2.pdf есть раздел «Connecting to an Encrypted Database» и там есть пример кода. Так же еще хотелось бы сказать что путь к базе, логин и т.д. имеет смысл вынести в отдельные константы, в данном случае я опять же упростил написание просто.

Назначение переменных Statement и PreparedStatment для меня выглядит одинаковым, просто в случае с PreparedStatment позволяет нам создавать запросы в БД с использованием переменных.
Обратите внимание на:
st1.setString(1, name1);

Здесь идет преобразование переменной к необходимому типу, есть еще setInt и т.д. Здесь 1 — это номер знака вопроса в запросе.

insert into TEST(name) values(?)

Так же существует несколько способов выполнить запрос – execute, executeQuery и executeUpdate, так что стоит про них почитать в javadoc на H2 может вам это и пригодится, мне пока что не нужно было.

Ну и последнее — переменная ResultSet result – судя по описание в ней довольно много чего можно выполнить, мне она пригодилась только для одного вывода из базы данных. Знать надо вот что, result.next() надо сделать в первую очередь, до того как вытаскивать результаты, иначе будет ошибка, изначально переменная result ссылается на строку -1 (если так можно выразиться), а там ничего нет.

В примере для NetBeanse немного по другому написан цикл вывода, с тем вариантом я не разобрался, возникали ошибки, у меня заработал мой вариант.

Так же в реальной программе я это все разделю на отдельные нужные мне функции, и так же не забываем о том что надо еще отсоединиться от базы и закрыть ее: st.close(); и conn.close(); Например это стоит делать в блоке finally после обработки ошибки. Я этого в данном случае не делал.

Как запустить java программу без Eclipse?

Выбираем File-Export, там уже выбираем Java-Runable JAR File, затем Next.
Launch Configuration – выбираем наш проект. Задаем имя выходного файла и его расположение.
Выбираем library handling.
Как я понял первый вариант копируем только необходимый ему код, второй вариант упаковывает все целиком (в нашем случае h2-*.jar), третий вариант – создает поддиректорию, в которой будет располагаться h2-*.jar.
Если вы пишете только для себя то тут думаю неважно какой вариант вы выберите, но если хотите распространять, то по-моему лучше всего третий вариант, или второй, про первый вариант сам Eclipse выдает предупреждение что могут быть проблемы с лицензией. Лицензия на H2 вот тут.

Создали jar файл, теперь нужно его запустить, пишем в консоли:
java –jar test.jar
где test.jar – имя вашего файла.

После установке в Windows, появляются еще ссылки на H2 Console в меню «Пуск». Запускаем одну из них, и должен открыться браузер с формой в которой если вы укажите путь до вашей базы, логин, пароль и т.д. то сможете выполнить какие-либо запросы к вашей базе.

В примерах по H2 есть примеры подключения через браузер к базе, там что то пишется в файл web.xml, но как понимаю это не для простого java приложения. Так что способ описанный мной, может пригодиться.

На этом всё.

Используемые источники:
1. www.h2database.com/html/main.html
2. www.feras-odeh.com/java/h2_embeded_database_java
3. www.h2database.com/html/license.html
Tags:
java, h2, database

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

Похожие публикации