SlideShare a Scribd company logo
1 of 40
Download to read offline
Spring data
Евгений Борисов
bsevgeny@gmail.com
@jekaborisov
Пишу Стартап
Пишу курсы
Пишу код для JFrog-a
Синглтоны – не пишу, пью
Страдаю от аллергию на весну,
Но люблю спринг
2
2 Слова о себе
Терминология
• Аппликация = приложение
• Айбернет = хибернет
• Штрудель =Собака
• Компонент – использую с любым ударением
• Параметр = Параметр
• Список пополняется…
Agenda
Времена JDBC Времена JPA Сегодня - Spring Data
Agenda
•Spring Data JPA (Hibernate)
•Spring Data Mongo
•Spring Data Neo4J
• Кассандра – не только в виде фонта, но ещё отстаёт
Когда мы были молодые и с нами был JDBC
План работы:
1. Open the connection.
2. Create the statement.
3.Execute the statement.
4.Loop through the results.
5.Treat Exceptions.
6.Handle Transactions.
7. Close the connection.
Боль
try {
connection = DriverManager.getConnection("jdbc:…");
PreparedStatement pStm = connection.prepareStatement(
"Select TITLE from BOOKS where price < ?");
pStm.setInt(1, 100);
ResultSet rs = pStm.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("TITLE"));
}
} catch (SQLException e) {
// А что тут писать??? Кидаем дальше.
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// Вообще нечего писать
}
}
}
Когда уходит детство приходит JPA…
ActiveJPA
EclipseLink
HibernateOpenJPA
MyBatis
TopLink
А что сегодня в моде?
Document database
JSON documents
JSON queries
MongoDB
Mongo mongo = new Mongo(…);
DB db = mongo.getDB("myDatabase");
Collection collection = db.getCollection("myCollection");
DBObject query = new BasicDBObject();
query.put("address.city", "Kiev");
DBObject cursor = collection.find(query);
for (DBObject element : cursor) {
// Map data onto object
}
Graph database
Nodes / Relationships
Traversals / Cypher / Gremlin
Neo4j
GraphDatabaseService database = new EmbeddedGraphDatabase(…);
Transaction tx = database.beginTx();
try {
Node mrRodionov = database.createNode();
mrRodionov.setProperty("name", “Nikolay Alimenkov");
Node baruch = database.createNode();
baruch.setProperty("name", "Baruch");
Relationship friendship = mrRodionov.createRelationshipTo(baruch, FriendTypes.KNOWS);
tx.success();
} finally {
tx.finish();
}
Можно ли тут применить JPA?
Вывод:
Пришло иное время, достал всех Хибернет
Spring Data нам поможет ему ответить НЕТ
http://projects.spring.io/spring-data/
Проект Spring Data существует с 2008 года
А Кассандра?
Поехали…
А теперь Spring Data JPA
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.8.0.RELEASE</version>
</dependency>
Релиз 1.0.0 вышел в 2011 году
Загадочный CrudRepository
@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
<S extends T> S save(S entity);
<S extends T> Iterable<S> save(Iterable<S> entities);
T findOne(ID id);
boolean exists(ID id);
Iterable<T> findAll();
Iterable<T> findAll(Iterable<ID> ids);
long count();
void delete(ID id);
void delete(T entity);
void delete(Iterable<? extends T> entities);
void deleteAll();
}
А ещё что-нибудь есть?
Да не вопрос
Полно всего
CrudRepository
PagingAndSortingRepository
JpaRepository
MongoRepository
Neo4jRepository
SimpleCassandraRepository (1.2)
PagingAndSortingRepository
• Наследует от CrudRepository
• Добавляет ещё 2 метода
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
А нельзя ли без магии?
Вот все заклинания и их расшифровки
Keyword Sample JPQL snippet
And findByLastnameAndFirstname where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals where x.firstname = 1?
Between findByStartDateBetween where x.startDate between 1? and ?2
LessThan findByAgeLessThan where x.age < ?1
LessThanEqual findByAgeLessThanEqual where x.age ⇐ ?1
GreaterThan findByAgeGreaterThan where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual where x.age >= ?1
After findByStartDateAfter where x.startDate > ?1
Before findByStartDateBefore where x.startDate < ?1
IsNull findByAgeIsNull where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull where x.age not null
Like findByFirstnameLike where x.firstname like ?1
NotLike findByFirstnameNotLike where x.firstname not like ?1
StartingWith findByFirstnameStartingWith where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc where x.age = ?1 order by x.lastname desc
Not findByLastnameNot where x.lastname <> ?1
In findByAgeIn(Collection<Age> ages) where x.age in ?1
NotIn findByAgeNotIn(Collection<Age> age) where x.age not in ?1
True findByActiveTrue() where x.active = true
False findByActiveFalse() where x.active = false
IgnoreCase findByFirstnameIgnoreCase where UPPER(x.firstame) = UPPER(?1)
Keyword Sample JPQL snippet
And findByLastnameAndFirstname where x.lastname = ?1 and
x.firstname = ?2
Or findByLastnameOrFirstname where x.lastname = ?1 or
x.firstname = ?2
Between findByStartDateBetween where x.startDate between 1?
and ?2
LessThan findByAgeLessThan where x.age < ?1
LessThanEqual findByAgeLessThanEqual where x.age ⇐ ?1
GreaterThan findByAgeGreaterThan where x.age > ?1
After findByStartDateAfter where x.startDate > ?1
Before findByStartDateBefore where x.startDate < ?1
IsNull findByAgeIsNull where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull where x.age not null
Like findByFirstnameLike where x.firstname like ?1
NotLike findByFirstnameNotLike where x.firstname not like ?1
Containing findByFirstnameContaining where x.firstname like
?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc where x.age = ?1 order by
x.lastname desc
Not findByLastnameNot where x.lastname <> ?1
In findByAgeIn(Collection<Age> ages) where x.age in ?1
NotIn findByAgeNotIn(Collection<Age> age) where x.age not in ?1
IgnoreCase findByFirstnameIgnoreCase where UPPER(x.firstame) =
UPPER(?1)
Ммминуточку,
а я если я не хочу все базовые методы?
Тогда наследуем от интерфейса Repository
Он пустой.
Мы хотим независимость,
Даже от Спринга!
Ну тогда пишите свои интерфейсы и
аннотируйте их @RepositoryDefinition
@RepositoryDefinition(domainClass = Talk.class,idClass = Long.class)
public interface TalkRepository {
List<Talk> findByTitleLikeIgnoreCase(String s);
}
Давайте перейдём на MongoDB
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.7.0.RELEASE</version>
</dependency>
Что делать если не найти заклинание?
Пользуйся заклинанием @Query
Я всю жизнь писал только SQL
Как же мне писать под Mongo?
Как писать запросы для Mongo если я знаю только SQL?
SQL SELECT Statements MongoDB find() Statements
SELECT * FROM users db.users.find()
SELECT id, user_id, status FROM users db.users.find( { }, { user_id: 1, status: 1 } )
SELECT user_id, status FROM users db.users.find( { }, { user_id: 1, status: 1, _id: 0 } )
SELECT * FROM users WHERE status != "A" db.users.find( { status: { $ne: "A" } } )
SELECT * FROM users WHERE status = "A" AND age = 50 db.users.find( { status: "A", age: 50 } )
SELECT * FROM users WHERE status = "A" OR age = 50 db.users.find( { $or: [ { status: "A" } , { age: 50 } ] } )
SELECT * FROM users WHERE age > 25 db.users.find( { age: { $gt: 25 } } )
SELECT * FROM users WHERE age < 25 db.users.find( { age: { $lt: 25 } } )
SELECT * FROM users WHERE age > 25 AND age <= 50 db.users.find( { age: { $gt: 25, $lte: 50 } } )
А теперь с Neo4j
compile 'org.springframework.data:spring-data-neo4j:3.2.0.RELEASE'
Выводы…
Раньше Сегодня
Всякое, полезное
• http://docs.spring.io/spring-data/jpa/docs/current/reference/html/
• http://projects.spring.io/spring-data-neo4j/
• http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/
• http://docs.mongodb.org/manual/reference/sql-comparison

More Related Content

What's hot

JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.Igor Shkulipa
 
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...SQALab
 
ООП в JavaScript
ООП в JavaScriptООП в JavaScript
ООП в JavaScriptenterra-inc
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.Igor Shkulipa
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Spring the Ripper by Evgeny Borisov
Spring the Ripper by Evgeny BorisovSpring the Ripper by Evgeny Borisov
Spring the Ripper by Evgeny BorisovJavaDayUA
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?Roman Timushev
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?PyNSK
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаAlexander Kucherenko
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.Igor Shkulipa
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C codeDenis Efremov
 
Devclub 01/2017 - (Не)адекватное Java-интервью
Devclub 01/2017 - (Не)адекватное Java-интервьюDevclub 01/2017 - (Не)адекватное Java-интервью
Devclub 01/2017 - (Не)адекватное Java-интервьюAnton Arhipov
 
Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"Fwdays
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverИлья Кожухов
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности PythonPyNSK
 

What's hot (20)

JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
 
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
 
ООП в JavaScript
ООП в JavaScriptООП в JavaScript
ООП в JavaScript
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Spring the Ripper by Evgeny Borisov
Spring the Ripper by Evgeny BorisovSpring the Ripper by Evgeny Borisov
Spring the Ripper by Evgeny Borisov
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
Devclub 01/2017 - (Не)адекватное Java-интервью
Devclub 01/2017 - (Не)адекватное Java-интервьюDevclub 01/2017 - (Не)адекватное Java-интервью
Devclub 01/2017 - (Не)адекватное Java-интервью
 
Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
 
TT
TTTT
TT
 
Template Toolkit – зло!?
Template Toolkit – зло!?Template Toolkit – зло!?
Template Toolkit – зло!?
 
Selenium vs AJAX
Selenium vs AJAXSelenium vs AJAX
Selenium vs AJAX
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 

Similar to Spring data jee conf

использование Hibernate java persistence.part 1.
использование Hibernate java persistence.part 1.использование Hibernate java persistence.part 1.
использование Hibernate java persistence.part 1.Asya Dudnik
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Pavel Egorov
 
Next Gen Applications
Next Gen ApplicationsNext Gen Applications
Next Gen ApplicationsVittorio Cioe
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Ontico
 
Вещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиВещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиZheka Kozlov
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Fedor Malyshkin
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agencyit-people
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. DatabasesSergey Nemchinsky
 
В помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кодаВ помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кодаAndrey Karpov
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Fedor Lavrentyev
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт GuavaEgor Chernyshev
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentAnton Kirillov
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CYandex
 
Метапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptМетапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptTimur Shemsedinov
 

Similar to Spring data jee conf (20)

использование Hibernate java persistence.part 1.
использование Hibernate java persistence.part 1.использование Hibernate java persistence.part 1.
использование Hibernate java persistence.part 1.
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1
 
Next Gen Applications
Next Gen ApplicationsNext Gen Applications
Next Gen Applications
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
Bytecode
BytecodeBytecode
Bytecode
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)
 
Вещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиВещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не знали
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
ZooKeeper Java Cloud
ZooKeeper Java CloudZooKeeper Java Cloud
ZooKeeper Java Cloud
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. Databases
 
В помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кодаВ помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кода
 
Curse of spring boot test [VRN]
Curse of spring boot test [VRN]Curse of spring boot test [VRN]
Curse of spring boot test [VRN]
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
Метапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptМетапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScript
 
Underscore js
Underscore jsUnderscore js
Underscore js
 

Spring data jee conf

  • 2. Пишу Стартап Пишу курсы Пишу код для JFrog-a Синглтоны – не пишу, пью Страдаю от аллергию на весну, Но люблю спринг 2 2 Слова о себе
  • 3. Терминология • Аппликация = приложение • Айбернет = хибернет • Штрудель =Собака • Компонент – использую с любым ударением • Параметр = Параметр • Список пополняется…
  • 4. Agenda Времена JDBC Времена JPA Сегодня - Spring Data
  • 5. Agenda •Spring Data JPA (Hibernate) •Spring Data Mongo •Spring Data Neo4J • Кассандра – не только в виде фонта, но ещё отстаёт
  • 6. Когда мы были молодые и с нами был JDBC План работы: 1. Open the connection. 2. Create the statement. 3.Execute the statement. 4.Loop through the results. 5.Treat Exceptions. 6.Handle Transactions. 7. Close the connection.
  • 7. Боль try { connection = DriverManager.getConnection("jdbc:…"); PreparedStatement pStm = connection.prepareStatement( "Select TITLE from BOOKS where price < ?"); pStm.setInt(1, 100); ResultSet rs = pStm.executeQuery(); while (rs.next()) { System.out.println(rs.getString("TITLE")); } } catch (SQLException e) { // А что тут писать??? Кидаем дальше. } finally { if (connection != null) { try { connection.close(); } catch (SQLException e) { // Вообще нечего писать } } }
  • 8. Когда уходит детство приходит JPA… ActiveJPA EclipseLink HibernateOpenJPA MyBatis TopLink
  • 11. MongoDB Mongo mongo = new Mongo(…); DB db = mongo.getDB("myDatabase"); Collection collection = db.getCollection("myCollection"); DBObject query = new BasicDBObject(); query.put("address.city", "Kiev"); DBObject cursor = collection.find(query); for (DBObject element : cursor) { // Map data onto object }
  • 12. Graph database Nodes / Relationships Traversals / Cypher / Gremlin
  • 13. Neo4j GraphDatabaseService database = new EmbeddedGraphDatabase(…); Transaction tx = database.beginTx(); try { Node mrRodionov = database.createNode(); mrRodionov.setProperty("name", “Nikolay Alimenkov"); Node baruch = database.createNode(); baruch.setProperty("name", "Baruch"); Relationship friendship = mrRodionov.createRelationshipTo(baruch, FriendTypes.KNOWS); tx.success(); } finally { tx.finish(); }
  • 14. Можно ли тут применить JPA?
  • 16. Пришло иное время, достал всех Хибернет Spring Data нам поможет ему ответить НЕТ
  • 20. А теперь Spring Data JPA <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.8.0.RELEASE</version> </dependency> Релиз 1.0.0 вышел в 2011 году
  • 21. Загадочный CrudRepository @NoRepositoryBean public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> { <S extends T> S save(S entity); <S extends T> Iterable<S> save(Iterable<S> entities); T findOne(ID id); boolean exists(ID id); Iterable<T> findAll(); Iterable<T> findAll(Iterable<ID> ids); long count(); void delete(ID id); void delete(T entity); void delete(Iterable<? extends T> entities); void deleteAll(); }
  • 22. А ещё что-нибудь есть? Да не вопрос Полно всего CrudRepository PagingAndSortingRepository JpaRepository MongoRepository Neo4jRepository SimpleCassandraRepository (1.2)
  • 23. PagingAndSortingRepository • Наследует от CrudRepository • Добавляет ещё 2 метода Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable);
  • 24. А нельзя ли без магии?
  • 25. Вот все заклинания и их расшифровки Keyword Sample JPQL snippet And findByLastnameAndFirstname where x.lastname = ?1 and x.firstname = ?2 Or findByLastnameOrFirstname where x.lastname = ?1 or x.firstname = ?2 Is,Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals where x.firstname = 1? Between findByStartDateBetween where x.startDate between 1? and ?2 LessThan findByAgeLessThan where x.age < ?1 LessThanEqual findByAgeLessThanEqual where x.age ⇐ ?1 GreaterThan findByAgeGreaterThan where x.age > ?1 GreaterThanEqual findByAgeGreaterThanEqual where x.age >= ?1 After findByStartDateAfter where x.startDate > ?1 Before findByStartDateBefore where x.startDate < ?1 IsNull findByAgeIsNull where x.age is null IsNotNull,NotNull findByAge(Is)NotNull where x.age not null Like findByFirstnameLike where x.firstname like ?1 NotLike findByFirstnameNotLike where x.firstname not like ?1 StartingWith findByFirstnameStartingWith where x.firstname like ?1 (parameter bound with appended %) EndingWith findByFirstnameEndingWith where x.firstname like ?1 (parameter bound with prepended %) Containing findByFirstnameContaining where x.firstname like ?1 (parameter bound wrapped in %) OrderBy findByAgeOrderByLastnameDesc where x.age = ?1 order by x.lastname desc Not findByLastnameNot where x.lastname <> ?1 In findByAgeIn(Collection<Age> ages) where x.age in ?1 NotIn findByAgeNotIn(Collection<Age> age) where x.age not in ?1 True findByActiveTrue() where x.active = true False findByActiveFalse() where x.active = false IgnoreCase findByFirstnameIgnoreCase where UPPER(x.firstame) = UPPER(?1)
  • 26. Keyword Sample JPQL snippet And findByLastnameAndFirstname where x.lastname = ?1 and x.firstname = ?2 Or findByLastnameOrFirstname where x.lastname = ?1 or x.firstname = ?2 Between findByStartDateBetween where x.startDate between 1? and ?2 LessThan findByAgeLessThan where x.age < ?1 LessThanEqual findByAgeLessThanEqual where x.age ⇐ ?1 GreaterThan findByAgeGreaterThan where x.age > ?1 After findByStartDateAfter where x.startDate > ?1 Before findByStartDateBefore where x.startDate < ?1
  • 27. IsNull findByAgeIsNull where x.age is null IsNotNull,NotNull findByAge(Is)NotNull where x.age not null Like findByFirstnameLike where x.firstname like ?1 NotLike findByFirstnameNotLike where x.firstname not like ?1 Containing findByFirstnameContaining where x.firstname like ?1 (parameter bound wrapped in %) OrderBy findByAgeOrderByLastnameDesc where x.age = ?1 order by x.lastname desc Not findByLastnameNot where x.lastname <> ?1 In findByAgeIn(Collection<Age> ages) where x.age in ?1 NotIn findByAgeNotIn(Collection<Age> age) where x.age not in ?1 IgnoreCase findByFirstnameIgnoreCase where UPPER(x.firstame) = UPPER(?1)
  • 28. Ммминуточку, а я если я не хочу все базовые методы?
  • 29. Тогда наследуем от интерфейса Repository Он пустой.
  • 31. Ну тогда пишите свои интерфейсы и аннотируйте их @RepositoryDefinition
  • 32. @RepositoryDefinition(domainClass = Talk.class,idClass = Long.class) public interface TalkRepository { List<Talk> findByTitleLikeIgnoreCase(String s); }
  • 33. Давайте перейдём на MongoDB <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.7.0.RELEASE</version> </dependency>
  • 34. Что делать если не найти заклинание?
  • 36. Я всю жизнь писал только SQL Как же мне писать под Mongo?
  • 37. Как писать запросы для Mongo если я знаю только SQL? SQL SELECT Statements MongoDB find() Statements SELECT * FROM users db.users.find() SELECT id, user_id, status FROM users db.users.find( { }, { user_id: 1, status: 1 } ) SELECT user_id, status FROM users db.users.find( { }, { user_id: 1, status: 1, _id: 0 } ) SELECT * FROM users WHERE status != "A" db.users.find( { status: { $ne: "A" } } ) SELECT * FROM users WHERE status = "A" AND age = 50 db.users.find( { status: "A", age: 50 } ) SELECT * FROM users WHERE status = "A" OR age = 50 db.users.find( { $or: [ { status: "A" } , { age: 50 } ] } ) SELECT * FROM users WHERE age > 25 db.users.find( { age: { $gt: 25 } } ) SELECT * FROM users WHERE age < 25 db.users.find( { age: { $lt: 25 } } ) SELECT * FROM users WHERE age > 25 AND age <= 50 db.users.find( { age: { $gt: 25, $lte: 50 } } )
  • 38. А теперь с Neo4j compile 'org.springframework.data:spring-data-neo4j:3.2.0.RELEASE'
  • 40. Всякое, полезное • http://docs.spring.io/spring-data/jpa/docs/current/reference/html/ • http://projects.spring.io/spring-data-neo4j/ • http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/ • http://docs.mongodb.org/manual/reference/sql-comparison