DevBug blog

О Linux, Java, разработке ПО и не только

Apache Derby и Java

2010-11-19 Java Aliaksei Bahdanau

Apache Derby– open source инструмент для работы с реляционными базами данных в Java. Распространяется по лицензии Apache v 2.0.

Когда перед Вами стоит задача написать небольшое приложение, работающее с реляционной базой данных (относительно небольшой) Apache Derby может и не идеальный, но удобный инструмент для выполнения поставленной задачи. Об основных преимуществах Derby можно прочитать на офсайте. Но если в двух словах, то:

  • Apache Derby основан на стандартах Java, JDBC и SQL;
  • для платформы Eclipse распространяется в виде плагина;
  • для полноценной работы программы на стороне клиента не требует дополнительной установки сервера (грубо говоря, сервер будет “зашит” в программу);
  • прост в использовании;

Скачивание

Для написания простой программы (чтение/запись из/в БД) необходимо скачать плагин для Eclipse. На момент написания статьи последним официальным релизом Derby является версия 1.6.2.1. (Скачать). На данной странице присутствуют различные раздачи Derby. Нас же интересует плагин для Eclipse. Ищем на странице слова “There are two separate Eclipse plugins for Derby:” все, что находится ниже (2 файла: derby_core_plugin и derby_ui_doc_plugin )-качаем. Прямые ссылки на скачивания:

На странице загрузок можно посмотреть список всех доступных версий, а также последний официальный релиз Derby.

Установка Derby-плагина для Eclipse

Скачанные ранее файлы (derby_core_plugin и derby_ui_doc_plugin ) необходимо распаковать в **…/Eclipse/plugins`

Запускаем локальный сервер Derby

Создаем новый Java-проект в Eclipse. Далее правой кнопкой мыши (ПКМ) по созданному проекту. Если правильно установили (распаковали) плагин Derby, то по нажатию ПКМ по проекту в контекстном меню должна появится строчка вида:

pic_1

Для того, чтобы добавить поддержку в наш проект, выбираем Add Apache derby nature. Теперь, если опять нажать ПКМ по нашему проекту, то в контекстное меню для Derby будет выглядеть следующим образом:

2

  1. контекстное меню Derby;
  2. запуск локального сервера Derby;
  3. остановка сервера Derby;
  4. командная строка Derby;

Выбираем пункт 2 - запускаем локальный сервер Derby. Если все прошло удачно-появится диалоговое окно следующего содержания:

4
Если данное окно не появилось по каким-либо причинам – читаем ошибки в Console.

Создаем базу данных

Теперь займемся созданием базы данных. Создавать БД будем при помощи командной строки Derby - ij (Interactive SQL) – п. 4. ПКМ по нашему проекту—>Apache Derby –>ij. В результате в консоли появится сообщение:

ij version 10.6
ij>

Далее вводим команду:

connect 'jdbc: derby://localhost:1527/userDB;create=true';

Данная команда создает БД с именем userDB. Параметр create=true как раз-таки и отвечает за создание новой базы. В результате данных манипуляций в Package Explorer в Eclipse появятся папка с именем нашей БД и папка с именем “Derby Library”:

5

Создадим в нашей БД таблицу users с полями first_name, last_name. us_id:

create table users (first_name varchar(30) not null, last_name varchar (30) not null, us_id integer not null); 

Заполним нашу таблицу следующими записями (записи в консоли вводятся поочередно, каждая команда заканчивается точкой с запятой ):

insert into users values ('Tom', 'Anderson',1);insert into users values (‘Andew’, 'Yawk',2);insert into users values (‘Alex’, ‘Popov’, 3);

Для того, чтобы просмотреть нашу таблицу вводим команду:

     select * from users

В результате в консоли будет выведен результат:

FIRST_NAME                    |LAST_NAME                     |US_ID     
-------------------------------------------------------------------------
Tom                           |Anderson                      |1         
Andrew                        |Yawk                          |2         
Alex                          |Popov                           |3    

База данных создана.

Пишем программу

В данном примере будем рассматривать простую программу. Создаем класс, например Main (при создании класса ставим галочку напротив public static void main).

Для работы с нашей БД необходимо зарегистрировать в нашей программе драйвер JDBC, установить соединение к нашей БД, указать путь (URL) к БД . Для этого пишем следующий код:

String driver ="org.apache.derby.jdbc.EmbeddedDriver"; //регистрируем JDBC        
String dbName = "userDB"; // указываем имя нашей БД         
String connectionURL = "jdbc: derby:" + dbName; //URL к БД         
java.sql.Connection conn = null;         
    
    try {         
        Class.forName(driver);         
    } catch (java.lang.ClassNotFoundException e) {         
        e.printStackTrace();         
    }         
    try {         
        conn = DriverManager.getConnection(connectionURL);

/* остальная часть кода будет тут*/ 

} catch (Throwable er) {        
        er.printStackTrace();         
    } finally {         
        conn.close();         
    }

}

Пробуем запустить нашу программу. Если ошибок не возникает – едем дальше – пишем оставшуюся часть кода, которая будет считывать/записывать из/в нашу БД. Для этого пишем следующий код (его необходимо вставить до или после слов “ /* остальная часть кода будет туту*/ “).

Для записи в нашу БД:

Statement st=conn.createStatement();        
     int m=st.executeUpdate("INSERT INTO USERS VALUES('Adam','Smith',4)");         
      System.out.println("Updated " + m + " rows"); 

Данный код добавит в таблицу users пользователя “Adam Smyth” с id=4; Последняя строчка данного кода выведет нам в консоли количество добавленных строк:

 "Updated 1 rows"

Считаем записи из нашей БД и выведем результат в консоль:

ResultSet rs = st.executeQuery("Select * from users");        
            while (rs.next()) {         
                String first = rs.getString(1);         
                String last = rs.getString(2);         
                int id = rs.getInt(3);         
                
                System.out.println(id+ " " + first+" "+ last+ " ");         
            
            }         
            rs.close();

В результате в консоли будет выведено сообщение:

1 Tom Anderson
2 Andrew Yawk
3 Alex Popov
4 Adam Smith 

Полный код программы приведен ниже:

package com.lex;

import java.sql.DriverManager;        
import java.sql.ResultSet;         
import java.sql.SQLException;         
import java.sql.Statement;

import org.apache.derby.client.am.Connection;        
//import org.apache.derby.client.am.Statement;

public class Main {

    public static void main(String[] args) throws SQLException {         
        // TODO Auto-generated method stub         
        
        String driver ="org.apache.derby.jdbc.EmbeddedDriver";         
        String dbName = "userDB";         
        String connectionURL = "jdbc: derby:" + dbName;         
        java.sql.Connection conn = null;         
        
        try {         
            Class.forName(driver);         
        } catch (java.lang.ClassNotFoundException e) {         
            e.printStackTrace();         
        }         
        try {         
            conn = DriverManager.getConnection(connectionURL);         
            // body of code to go here         
        
            Statement st=conn.createStatement();         
            int m=st.executeUpdate("INSERT INTO USERS VALUES('Adammy','Smithy',5)");         
            System.out.println("Updated " + m + " rows"); 

            ResultSet rs = st.executeQuery("Select * from users");        
            while (rs.next()) {         
                String first = rs.getString(1);         
                String last = rs.getString(2);         
                int id = rs.getInt(3);         
                
                System.out.println(id+ " " + first+" "+ last+ " ");         
            
            }         
            rs.close();         
            
        } catch (Throwable er) {         
            er.printStackTrace();         
        } finally {         
            conn.close();         
        }

    }

Как видно, ничего сложного. Для более серьезных проектов – соответствующее решение поставленной задачи.

comments powered by Disqus