2024-05 spring data nosql

This commit is contained in:
DiK
2024-07-23 16:05:17 +02:00
parent fe84b151b3
commit ffe24b9c85
25 changed files with 724 additions and 0 deletions
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>spring-data-keyvalue-class-work</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>spring-data-keyvalue-exercise</module>
<module>spring-data-keyvalue-solution</module>
</modules>
</project>
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>spring-data-keyvalue-exercise</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.3</version>
<relativePath />
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<snakeyaml.version>2.0</snakeyaml.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-keyvalue</artifactId>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>${snakeyaml.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,27 @@
package ru.otus.spring;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import ru.otus.spring.domain.Person;
import ru.otus.spring.repostory.PersonRepository;
@SpringBootApplication
public class Main {
@SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
@Autowired
private PersonRepository repository;
@PostConstruct
public void init() {
repository.save(new Person(1, "Pushkin"));
repository.findAll();
}
public static void main(String[] args) {
SpringApplication.run(Main.class);
}
}
@@ -0,0 +1,25 @@
package ru.otus.spring.domain;
public class Email {
private int id;
private String email;
public Email(String email) {
this.email = email;
}
public Email(int id, String email) {
this.id = id;
this.email = email;
}
public int getId() {
return id;
}
public String getEmail() {
return email;
}
}
@@ -0,0 +1,32 @@
package ru.otus.spring.domain;
public class Person {
private int id;
private String name;
public Person(String name) {
this.name = name;
}
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@@ -0,0 +1,11 @@
package ru.otus.spring.repostory;
import org.springframework.data.repository.CrudRepository;
import ru.otus.spring.domain.Person;
import java.util.List;
public interface PersonRepository extends CrudRepository<Person, Integer> {
List<Person> findAll();
}
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>spring-data-keyvalue-solution</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.3</version>
<relativePath />
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<snakeyaml.version>2.0</snakeyaml.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-keyvalue</artifactId>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>${snakeyaml.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,38 @@
package ru.otus.spring;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.map.repository.config.EnableMapRepositories;
import ru.otus.spring.domain.Email;
import ru.otus.spring.domain.Person;
import ru.otus.spring.repostory.EmailRepository;
import ru.otus.spring.repostory.PersonRepository;
@SpringBootApplication
@EnableMapRepositories
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class);
}
@SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
@Autowired
private PersonRepository repository;
@Autowired
private EmailRepository emailRepository;
@PostConstruct
public void init() {
repository.save(new Person(1, "Pushkin"));
repository.save(new Person(2, "Lermontov"));
System.out.println(repository.findAll());
emailRepository.save(new Email(1, "alex@pushkin.com"));
emailRepository.save(new Email(2, "micha@pushkin.com"));
System.out.println(emailRepository.findAll());
}
}
@@ -0,0 +1,37 @@
package ru.otus.spring.domain;
import org.springframework.data.annotation.Id;
import org.springframework.data.keyvalue.annotation.KeySpace;
@KeySpace("email")
public class Email {
@Id
private int id;
private String email;
public Email(int id, String email) {
this.id = id;
this.email = email;
}
public Email(String email) {
this.email = email;
}
public int getId() {
return id;
}
public String getEmail() {
return email;
}
@Override
public String toString() {
return "Email{" +
"id=" + id +
", email='" + email + '\'' +
'}';
}
}
@@ -0,0 +1,45 @@
package ru.otus.spring.domain;
import org.springframework.data.annotation.Id;
import org.springframework.data.keyvalue.annotation.KeySpace;
@KeySpace("person")
public class Person {
@Id
private int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public Person(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
@@ -0,0 +1,12 @@
package ru.otus.spring.repostory;
import ru.otus.spring.domain.Email;
import java.util.List;
public interface EmailRepository {
List<Email> findAll();
Email save(Email email);
}
@@ -0,0 +1,29 @@
package ru.otus.spring.repostory;
import org.springframework.data.keyvalue.core.KeyValueOperations;
import org.springframework.stereotype.Repository;
import ru.otus.spring.domain.Email;
import java.util.List;
import java.util.stream.StreamSupport;
@Repository
public class EmailRepositoryImpl implements EmailRepository {
final private KeyValueOperations keyValueTemplate;
public EmailRepositoryImpl(KeyValueOperations keyValueTemplate) {
this.keyValueTemplate = keyValueTemplate;
}
@Override
public List<Email> findAll() {
return StreamSupport.stream(keyValueTemplate.findAll(Email.class).spliterator(), false)
.toList();
}
@Override
public Email save(Email email) {
return keyValueTemplate.insert(email);
}
}
@@ -0,0 +1,13 @@
package ru.otus.spring.repostory;
import org.springframework.data.keyvalue.repository.KeyValueRepository;
import ru.otus.spring.domain.Person;
import java.util.List;
public interface PersonRepository extends KeyValueRepository<Person, Integer> {
Person save(Person person);
List<Person> findAll();
}
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>spring-data-mongo-class-work</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>spring-data-mongo-exercise</module>
<module>spring-data-mongo-solution</module>
</modules>
</project>
@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>spring-data-mongo-exercise</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.4</version>
<relativePath />
</parent>
<properties>
<java.version>17</java.version>
<maven.compiler.sourcre>17</maven.compiler.sourcre>
<maven.compiler.target>17</maven.compiler.target>
<mongock.version>4.3.8</mongock.version>
<flapdoodle.version>4.6.1</flapdoodle.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>${flapdoodle.version}</version>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo.spring30x</artifactId>
<version>${flapdoodle.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,26 @@
package ru.otus.spring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import ru.otus.spring.domain.Person;
import ru.otus.spring.repostory.PersonRepository;
@SpringBootApplication
public class Main {
public static void main(String[] args) throws InterruptedException {
ApplicationContext context = SpringApplication.run(Main.class);
PersonRepository repository = context.getBean(PersonRepository.class);
repository.save(new Person("Dostoevsky"));
Thread.sleep(3000);
System.out.println("\n\n\n----------------------------------------------\n\n");
System.out.println("Авторы в БД:");
repository.findAll().forEach(p -> System.out.println(p.getName()));
System.out.println("\n\n----------------------------------------------\n\n\n");
}
}
@@ -0,0 +1,27 @@
package ru.otus.spring.domain;
public class Person {
private String id;
private String name;
public Person(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@@ -0,0 +1,12 @@
package ru.otus.spring.repostory;
import org.springframework.data.repository.CrudRepository;
import ru.otus.spring.domain.Person;
import java.util.List;
public interface PersonRepository extends CrudRepository<Person, Integer> {
List<Person> findAll();
}
@@ -0,0 +1,11 @@
spring:
data:
mongodb:
port: 0 # when flapdoodle using
database: company
de:
flapdoodle:
mongodb:
embedded:
version: 4.0.2
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>spring-data-mongo-solution</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.4</version>
<relativePath />
</parent>
<properties>
<java.version>17</java.version>
<maven.compiler.sourcre>17</maven.compiler.sourcre>
<maven.compiler.target>17</maven.compiler.target>
<mongock.version>4.3.8</mongock.version>
<flapdoodle.version>4.6.1</flapdoodle.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>${flapdoodle.version}</version>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo.spring30x</artifactId>
<version>${flapdoodle.version}</version>
</dependency>
<dependency>
<groupId>com.github.cloudyrock.mongock</groupId>
<artifactId>mongock-spring-v5</artifactId>
<version>${mongock.version}</version>
</dependency>
<dependency>
<groupId>com.github.cloudyrock.mongock</groupId>
<artifactId>mongodb-springdata-v3-driver</artifactId>
<version>${mongock.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,30 @@
package ru.otus.spring;
import com.github.cloudyrock.spring.v5.EnableMongock;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import ru.otus.spring.domain.Person;
import ru.otus.spring.repostory.PersonRepository;
@EnableMongock
@EnableMongoRepositories
@SpringBootApplication
public class Main {
public static void main(String[] args) throws InterruptedException {
ApplicationContext context = SpringApplication.run(Main.class);
PersonRepository repository = context.getBean(PersonRepository.class);
repository.save(new Person("Dostoevsky"));
Thread.sleep(3000);
System.out.println("\n\n\n----------------------------------------------\n\n");
System.out.println("Авторы в БД:");
repository.findAll().forEach(p -> System.out.println(p.getName()));
System.out.println("\n\n----------------------------------------------\n\n\n");
}
}
@@ -0,0 +1,32 @@
package ru.otus.spring.domain;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "persons")
public class Person {
@Id
private String id;
private String name;
public Person(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@@ -0,0 +1,30 @@
package ru.otus.spring.mongock.changelog;
import com.github.cloudyrock.mongock.ChangeLog;
import com.github.cloudyrock.mongock.ChangeSet;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import ru.otus.spring.domain.Person;
import ru.otus.spring.repostory.PersonRepository;
@ChangeLog
public class DatabaseChangelog {
@ChangeSet(order = "001", id = "dropDb", author = "stvort", runAlways = true)
public void dropDb(MongoDatabase db) {
db.drop();
}
@ChangeSet(order = "002", id = "insertLermontov", author = "ydvorzhetskiy")
public void insertLermontov(MongoDatabase db) {
MongoCollection<Document> myCollection = db.getCollection("persons");
var doc = new Document().append("name", "Lermontov");
myCollection.insertOne(doc);
}
@ChangeSet(order = "003", id = "insertPushkin", author = "stvort")
public void insertPushkin(PersonRepository repository) {
repository.save(new Person("Pushkin"));
}
}
@@ -0,0 +1,12 @@
package ru.otus.spring.repostory;
import org.springframework.data.repository.CrudRepository;
import ru.otus.spring.domain.Person;
import java.util.List;
public interface PersonRepository extends CrudRepository<Person, Integer> {
List<Person> findAll();
}
@@ -0,0 +1,21 @@
spring:
data:
mongodb:
port: 0 # when flapdoodle using
database: company
de:
flapdoodle:
mongodb:
embedded:
version: 4.0.2
mongock:
runner-type: "ApplicationRunner" # default
#runner-type: "InitializingBean"
change-logs-scan-package:
- ru.otus.spring.mongock.changelog
mongo-db:
write-concern:
journal: false
read-concern: local