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» где отображаются все записи в БД.