Spring framework + MongoDB

Posted on: January 11th, 2012 by Spade No Comments »

Mongo DB

Модное нынче движение NoSQL баз данных завоевывает все больше поклонников. Правда не везде – в корпоративном секторе никто не гонится за инновациями. Скорее наоборот – все больше полагаются на «старое-доброе», когда речь идет о больших деньгах. Но многие стартапы, не связанные требованиями консервативных дядек-толстосумов, часто используют этот подход в продакшене, даже если не в качестве основного решения, то по крайней мере как промежуточное или узкоспециализированное хранилище.

NoSQL сам по себе неоднороден и имеет много разновидностей. Самый распространенный тип на данный момент это key-value storage. Уточним, что не все key-value storage решения можно назвать СУБД, так как они не всегда предоставляют интерфейс для управления собой – например, известное всем memcached хранилище тоже работает по принципу ключ-значение. Но выбирать несколько объектов, по каким-либо признакам фильтруя содержимое, с его помощью невозможно. Потому остановимся на инструментах, которые представляют собой NoSQL хранилища c каким-то QL(query language). Хотя у многих возникла ложная радость, что не придется учить sql или нечто подобное (это обманчивое впечатление производит сам термин NoSQL), на самом деле какой-то спец. язык для доступа к данным все-таки нужен.

Стоит отметить, что NoSQL далеко не везде подходит как основное решение. Но если требуется хранить информацию без четко установленной структуры, где список полей все время меняется и данные могут быть не полными – такой вариант подойдет хорошо. Примером подобных данных может быть производственная характеристика на человека, паспорт, личное дело и другие виды документов. Базы данных с таким форматом называются документо-ориентированными. Одной из самых популярных является MongoDB. Коротко:

«MongoDB (from “humongous”) is a scalable, high-performance, open source NoSQL database. Written in C++».

Формат ввода и вывода данных – JSON. Не требует установки – нужно скачать архив, распаковать и запустить сервер, указав путь к директории для хранения данных:

mongod.exe --dbpath="d:/mongodb-win32-i386-2.0.2/data"

Интерфейс для доступа через консоль:

mongo.exe

Чтобы просмотреть список уже существующих баз данных

show dbs
 
fbtest  0.03125GB
 
local   (empty)
 
test    0.03125GB

Чтоб создать новую базу данных(или использовать одну из существующих) пишем:

use fbtest
 
switched to db fbtest

Однако физически база данных не будет создана пока вы не сохраните в ней какие-либо данные. Формат хранения данных – коллекции (это аналог таблиц в RDBMS), а в коллекциях хранятся документы (аналог записи в RDBMS). Коллекция тоже создастя при первой вставке. Сохраним несколько документов в базе данных:

db.users.insert({"nick":"santa", "firstName":"Klaus", "lastName": "Klauss", "country":"USA"})
 
db.users.insert({"nick":"prometeus", "firstName":"Godd", "lastName": "Prometeus", "email":"prom@gmail.com"})
 
db.users.insert({"nick":"zizu", "firstName":"Zigfrid", "lastName": "O'Roy", "country":"UK"})

db используется как псевдоним для доступа к текущей базе данных. Мы создали коллекцию users и сохранили 3 документа. Вставка идет в формате JSON. Чтобы просмотреть содержимое всей коллекции используем команду find():

db.users.find()

Подробно разбирать способы фильтрации мы не будем – они не сильно уступают в сложности SQL :). Приведем только несколько примеров:

db.users.find({"nick":/san/i})
 
db.users.find({"firstName":{"$ne":"Godd"}})
 
db.users.find({"country":{"$in":["USA", "UK"]}})

В первом идет поиск документов с полем nick, совпадающим с регулярным выражением, во втором – «где firstName не равно…», в третьем – документов, чье поле country есть в списке поиска.

SPRING DATA

Spring Data – open source проект, который облегчает приложениям использующим spring framework взаимодействие с не-реляционными базами данных, cloud платформами и map-reduce фреймворками. На данный момент у них уже есть и поддержка MongoDB.

Скачаем самые свежие версии библиотек (на момент написания статьи spring framework имел версию 3.1), так как spring data относительно молодая и опирается на последние релизы основного spring:

Будем считать, что сам проект на spring у вас уже существует. Вставим в xml конфиг следующие строки:

<mongo:mongo host="localhost" port="27017"/>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongo" />
<constructor-arg name="databaseName" value="fbtest" />
</bean>

Для корректной работы должны быть подключено пространство имен xmlns:mongo=”http://www.springframework.org/schema/data/mongo”. MongoTemplate – ключевой класс, реализующий интерфейс MongoOperations для доступа к данным через драйвер.

Создадим модель документа:

import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
 
@Document(collection = "users")
public class User implements Serializable {
 
    String nick;
    String firstName;
    String lastName;
    String email;
    String country;
    String photoLink;
 
    public String getNick() {
        return nick;
    }
 
    public void setNick(String nick) {
        this.nick = nick;
    }
 
.....
 
}

 

В аннотации уровня класса указывается имя коллекции на которую происходит mapping. Поля класса совпадают с полями документа – значит соответствие будет поддерживаться на уровне драйвера автоматически.

Создаем интерфейс для доступа к данным:

import java.util.List;
 
public interface IUserDAO {
 
    List getUsers();
}

И его реализацию на основе Mongo:

@Repository
public class UserDAO implements IUserDAO {
 
    private static final Logger log = LoggerFactory.getLogger(UserDAO.class);
 
    @Autowired
    MongoTemplate mongoTemplate;
 
    @Override
    public List getUsers() {
        return mongoTemplate.findAll(User.class);
    }
}

Вот интеграция и готова :). Если интересны подробные примеры и фильтры – пишите!

Leave a Reply