SlideShare a Scribd company logo
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

PDF
Groovy jug-moscow-part 1
PPTX
Spring the ripper
PDF
Spring puzzlers
PDF
Spring puzzlers 2
PDF
Scala Rock-Painting
PDF
Java 8 puzzlers
PPTX
Kotlin with API tests
PDF
Cоздание приложений со знанием Perl
Groovy jug-moscow-part 1
Spring the ripper
Spring puzzlers
Spring puzzlers 2
Scala Rock-Painting
Java 8 puzzlers
Kotlin with API tests
Cоздание приложений со знанием Perl

What's hot (20)

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

Similar to Spring data jee conf (20)

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

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