Java
6 July 2011

Использование MongoDB в Java EE 6



MongoDB — документо-ориентированная NoSQL СУБД, не требующая описания схемы таблиц. Больше о ней можно узнать на оф. сайте, а в данной статье я опишу пример использования MongoDB в Java EE 6 приложении.

Напишем небольшое приложение, реализующее select — insert операции в MongoDB. Будет использована среда NetBeans 7.0 и сервер приложений GlassFish.

Установка

Для начала скачиваем отсюда MongoDB для конкретной платформы.
Затем запускаем сервер. Для этого необходимо запустить mongod.exe из папки bin. Перед этим необходимо создать директорию /data/db, которая будет по умолчанию использоваться для хранения данных.
При запуске сервера можно также указать другую папку для хранения данных, для этого нужно указать параметр --dbpath [имя папки].

Создание проекта

В NetBeans создаем WebApplication проект. Указываем сервер GlassFish, JavaEE версию — Java EE 6. Также необходимо отметить пункт Enable Contexts and Dependency Injection и добавить JavaServer Faces фреймверк.

Для использования MongoDB к проекту нужно подключить MongoDB Java Driver.

Код

Приложение будет хранить и отображать список книг. Создадим класс Book:

import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import javax.enterprise.inject.Model;
import javax.validation.constraints.Size;

@Model
public class Book {
    @Size(min = 1, max = 20)
    private String name;
    
    @Size(min = 1, max = 20)
    private String author;
    
    @Size(min = 1, max = 20)
    private String language;
    
    private int year;

    //геттеры и сеттеры для полей
    
    public BasicDBObject toDBObject() {
        BasicDBObject document = new BasicDBObject();
        
        document.put("name", name);
        document.put("year", year);
        document.put("language", language);
        document.put("author", author);
        
        return document;
    }
    
    public static Book fromDBObject(DBObject document) {
        Book b = new Book();
        
        b.name = (String) document.get("name");
        b.year = (Integer) document.get("year");
        b.language = (String) document.get("language");
        b.author = (String) document.get("author");
        
        return b;
    }
}

Здесь методы «toDBObject» и «fromDBObject» обеспечивают преобразования из класса Book в DBObject и наоборот. DBObject это интерфейс, инкапсулирующий набор пар ключ-значение, которые могут быть сохранены в базу. Здесь используется реализация этого интерфейса BasicDBObject.

Создадим также stateless bean, содержащий всю логику приложения:


import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.inject.Named;

@Stateless
@Named
public class BookSessionBean {
    
    @Inject Book book;
    
    private DBCollection bookCollection;
    
    @PostConstruct
    private void initDB() throws UnknownHostException {
        Mongo mongo = new Mongo();
        DB db = mongo.getDB("booksDB");
        bookCollection = db.getCollection("books");
        if (bookCollection == null) {
            bookCollection = db.createCollection("books", null);
        }
    }    
    
    public void createBook() {
        BasicDBObject doc = book.toDBObject();
        bookCollection.insert(doc);
    }
    
    public List<Book> getBooks() {
        List<Book> books = new ArrayList<Book>();
        
        DBCursor cursor = bookCollection.find();
        while (cursor.hasNext()) {
            DBObject dbo = cursor.next();
            books.add(Book.fromDBObject(dbo));
        }
        
        return books;
    }
}

База данных инициализируется в методе «initDB» с аннотацией @PostConstruct.
Коллекция «DBCollection» позволяет выполнять запросы к базе. Вызов метода «find» в методе «getBooks» эквивалентен SQL запросу «select * from books». Метод «find» возвращает курсор «DBCursor», который можно использовать как итератор по результатам запроса к БД.

Осталось только создать страницы добавления и отображения данных. Изменим «index.xhtml», чтобы она выглядела следующим образом:


<h1> Add new book </h1>
<h:form>
    Name:  <h:inputText value="#{book.name}" size="20" /> <br/>
    Year:   <h:inputText value="#{book.year}" size="6" /> <br/>
    Language: <h:inputText value="#{book.language}" size="20" /> <br/>
    Author: <h:inputText value="#{book.author}" size="20" /> <br/>
    <h:commandButton actionListener="#{bookSessionBean.createBook()}"
          action="show" title="Add" value="submit"/>
</h:form>

Добавим также страницу «show.xhtml» для отображения записей из БД:


<h:form>
    <h:dataTable value="#{bookSessionBean.books}" var="b">
        <h:column><f:facet name ="header">Name</f:facet>#{b.name}</h:column>
        <h:column><f:facet name ="header">Year</f:facet>#{b.year}</h:column>
        <h:column><f:facet name ="header">Language</f:facet>#{b.language}</h:column>
        <h:column><f:facet name ="header">Author</f:facet>#{b.author}</h:column>
    </h:dataTable>
</h:form>

Результат

Запустив проект, увидим главную страницу:



После заполнения полей и нажатия кнопки submit попадаем на страницу «show.xhtml» где отображаются все записи в БД.


Ссылки


+30
23.6k 74
Comments 22
Top of the day