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

