From 98f63f693a7eab001d760dcc4556b9aae3aacf73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=9E=D1=80=D1=83=D0=B4=D0=B6=D0=B5=D0=B2?= Date: Wed, 24 Mar 2021 15:55:32 +0400 Subject: [PATCH] 2021-02 spring-08-orm added --- .../spring-08-orm/demo-projects/.gitignore | 4 + .../demo-projects/mybatis-demo/.gitignore | 29 +++++ .../demo-projects/mybatis-demo/README.md | 2 + .../demo-projects/mybatis-demo/pom.xml | 73 +++++++++++++ .../mybatisdemo/MyBatisDemoApplication.java | 14 +++ .../example/mybatisdemo/models/Avatar.java | 13 +++ .../example/mybatisdemo/models/Course.java | 13 +++ .../example/mybatisdemo/models/EMail.java | 13 +++ .../mybatisdemo/models/OtusStudent.java | 18 +++ .../repositories/AvatarRepository.java | 18 +++ .../repositories/CourseRepository.java | 17 +++ .../repositories/EmailRepository.java | 14 +++ .../repositories/OtusStudentRepository.java | 42 +++++++ .../src/main/resources/schema.sql | 31 ++++++ .../OtusStudentRepositoryTest.java | 103 ++++++++++++++++++ .../src/test/resources/application.yml | 8 ++ .../mybatis-demo/src/test/resources/data.sql | 29 +++++ 2021-02/spring-08-orm/demo-projects/pom.xml | 17 +++ .../demo-projects/spring-jdbc-demo/.gitignore | 29 +++++ .../demo-projects/spring-jdbc-demo/README.md | 2 + .../demo-projects/spring-jdbc-demo/pom.xml | 71 ++++++++++++ .../SpringJdbcDemoApplication.java | 13 +++ .../example/springjdbcdemo/models/Avatar.java | 13 +++ .../example/springjdbcdemo/models/Course.java | 13 +++ .../example/springjdbcdemo/models/EMail.java | 13 +++ .../springjdbcdemo/models/OtusStudent.java | 18 +++ .../repositories/CourseRepositoryJdbc.java | 9 ++ .../CourseRepositoryJdbcImpl.java | 36 ++++++ .../OtusStudentRepositoryJdbc.java | 9 ++ .../OtusStudentRepositoryJdbcImpl.java | 50 +++++++++ .../ext/OtusStudentResultSetExtractor.java | 37 +++++++ .../ext/StudentCourseRelation.java | 11 ++ .../src/main/resources/schema.sql | 31 ++++++ .../OtusStudentRepositoryJdbcImplTest.java | 35 ++++++ .../src/test/resources/application.yml | 4 + .../src/test/resources/data.sql | 29 +++++ .../orm-class-work/orm-exercise/.gitignore | 29 +++++ .../orm-class-work/orm-exercise/pom.xml | 71 ++++++++++++ .../example/ormdemo/OrmDemoApplication.java | 17 +++ .../otus/example/ormdemo/models/Avatar.java | 15 +++ .../otus/example/ormdemo/models/Course.java | 15 +++ .../ru/otus/example/ormdemo/models/EMail.java | 15 +++ .../example/ormdemo/models/OtusStudent.java | 18 +++ .../src/main/resources/application.yml | 20 ++++ .../orm-class-work/orm-solution-01/.gitignore | 29 +++++ .../orm-class-work/orm-solution-01/pom.xml | 71 ++++++++++++ .../example/ormdemo/OrmDemoApplication.java | 17 +++ .../otus/example/ormdemo/models/Avatar.java | 17 +++ .../otus/example/ormdemo/models/Course.java | 17 +++ .../ru/otus/example/ormdemo/models/EMail.java | 17 +++ .../example/ormdemo/models/OtusStudent.java | 20 ++++ .../src/main/resources/application.yml | 20 ++++ .../orm-class-work/orm-solution-02/.gitignore | 29 +++++ .../orm-class-work/orm-solution-02/pom.xml | 71 ++++++++++++ .../example/ormdemo/OrmDemoApplication.java | 17 +++ .../otus/example/ormdemo/models/Avatar.java | 20 ++++ .../otus/example/ormdemo/models/Course.java | 20 ++++ .../ru/otus/example/ormdemo/models/EMail.java | 21 ++++ .../example/ormdemo/models/OtusStudent.java | 24 ++++ .../src/main/resources/application.yml | 20 ++++ .../orm-class-work/orm-solution-03/.gitignore | 29 +++++ .../orm-class-work/orm-solution-03/pom.xml | 71 ++++++++++++ .../example/ormdemo/OrmDemoApplication.java | 17 +++ .../otus/example/ormdemo/models/Avatar.java | 21 ++++ .../otus/example/ormdemo/models/Course.java | 21 ++++ .../ru/otus/example/ormdemo/models/EMail.java | 22 ++++ .../example/ormdemo/models/OtusStudent.java | 25 +++++ .../src/main/resources/application.yml | 20 ++++ .../orm-class-work/orm-solution-04/.gitignore | 29 +++++ .../orm-class-work/orm-solution-04/pom.xml | 71 ++++++++++++ .../example/ormdemo/OrmDemoApplication.java | 17 +++ .../otus/example/ormdemo/models/Avatar.java | 21 ++++ .../otus/example/ormdemo/models/Course.java | 21 ++++ .../ru/otus/example/ormdemo/models/EMail.java | 22 ++++ .../example/ormdemo/models/OtusStudent.java | 30 +++++ .../src/main/resources/application.yml | 20 ++++ .../orm-class-work/orm-solution-05/.gitignore | 29 +++++ .../orm-class-work/orm-solution-05/pom.xml | 71 ++++++++++++ .../example/ormdemo/OrmDemoApplication.java | 17 +++ .../otus/example/ormdemo/models/Avatar.java | 21 ++++ .../otus/example/ormdemo/models/Course.java | 21 ++++ .../ru/otus/example/ormdemo/models/EMail.java | 22 ++++ .../example/ormdemo/models/OtusStudent.java | 34 ++++++ .../src/main/resources/application.yml | 20 ++++ .../orm-solution-final/.gitignore | 29 +++++ .../orm-class-work/orm-solution-final/pom.xml | 71 ++++++++++++ .../example/ormdemo/OrmDemoApplication.java | 17 +++ .../otus/example/ormdemo/models/Avatar.java | 21 ++++ .../otus/example/ormdemo/models/Course.java | 21 ++++ .../ru/otus/example/ormdemo/models/EMail.java | 22 ++++ .../example/ormdemo/models/OtusStudent.java | 39 +++++++ .../src/main/resources/application.yml | 20 ++++ 2021-02/spring-08-orm/orm-class-work/pom.xml | 22 ++++ 93 files changed, 2465 insertions(+) create mode 100644 2021-02/spring-08-orm/demo-projects/.gitignore create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/.gitignore create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/README.md create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/pom.xml create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/MyBatisDemoApplication.java create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/Avatar.java create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/Course.java create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/EMail.java create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/OtusStudent.java create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/AvatarRepository.java create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/CourseRepository.java create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/EmailRepository.java create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/OtusStudentRepository.java create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/resources/schema.sql create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/src/test/java/ru/otus/example/mybatisdemo/repositories/OtusStudentRepositoryTest.java create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/src/test/resources/application.yml create mode 100644 2021-02/spring-08-orm/demo-projects/mybatis-demo/src/test/resources/data.sql create mode 100644 2021-02/spring-08-orm/demo-projects/pom.xml create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/.gitignore create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/README.md create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/pom.xml create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/SpringJdbcDemoApplication.java create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/Avatar.java create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/Course.java create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/EMail.java create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/OtusStudent.java create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/CourseRepositoryJdbc.java create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/CourseRepositoryJdbcImpl.java create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/OtusStudentRepositoryJdbc.java create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/OtusStudentRepositoryJdbcImpl.java create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/ext/OtusStudentResultSetExtractor.java create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/ext/StudentCourseRelation.java create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/resources/schema.sql create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/test/java/ru/otus/example/springjdbcdemo/repositories/OtusStudentRepositoryJdbcImplTest.java create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/test/resources/application.yml create mode 100644 2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/test/resources/data.sql create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-exercise/.gitignore create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-exercise/pom.xml create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/Avatar.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/Course.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/EMail.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/resources/application.yml create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-01/.gitignore create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-01/pom.xml create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/Avatar.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/Course.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/EMail.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/resources/application.yml create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-02/.gitignore create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-02/pom.xml create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/Avatar.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/Course.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/EMail.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/resources/application.yml create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-03/.gitignore create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-03/pom.xml create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/Avatar.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/Course.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/EMail.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/resources/application.yml create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-04/.gitignore create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-04/pom.xml create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/Avatar.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/Course.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/EMail.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/resources/application.yml create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-05/.gitignore create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-05/pom.xml create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/Avatar.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/Course.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/EMail.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/resources/application.yml create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-final/.gitignore create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-final/pom.xml create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/Avatar.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/Course.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/EMail.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java create mode 100644 2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/resources/application.yml create mode 100644 2021-02/spring-08-orm/orm-class-work/pom.xml diff --git a/2021-02/spring-08-orm/demo-projects/.gitignore b/2021-02/spring-08-orm/demo-projects/.gitignore new file mode 100644 index 00000000..e62c33c2 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/.gitignore @@ -0,0 +1,4 @@ +.idea/ +*.iml + +target/ diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/.gitignore b/2021-02/spring-08-orm/demo-projects/mybatis-demo/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/.gitignore @@ -0,0 +1,29 @@ +HELP.md +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +### VS Code ### +.vscode/ diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/README.md b/2021-02/spring-08-orm/demo-projects/mybatis-demo/README.md new file mode 100644 index 00000000..44635273 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/README.md @@ -0,0 +1,2 @@ +# mybatis-demo +Пример работы с БД через MyBatis \ No newline at end of file diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/pom.xml b/2021-02/spring-08-orm/demo-projects/mybatis-demo/pom.xml new file mode 100644 index 00000000..45cb72af --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.4 + + + ru.otus.example + mybatis-demo + 0.0.1-SNAPSHOT + mybatis-demo + MyBatis demo + + + 11 + 11 + 11 + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.4 + + + + com.h2database + h2 + runtime + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/MyBatisDemoApplication.java b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/MyBatisDemoApplication.java new file mode 100644 index 00000000..ab5f7513 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/MyBatisDemoApplication.java @@ -0,0 +1,14 @@ +package ru.otus.example.mybatisdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; + +@SpringBootApplication +public class MyBatisDemoApplication { + + public static void main(String[] args) { + SpringApplication.run(MyBatisDemoApplication.class, args); + } + +} diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/Avatar.java b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/Avatar.java new file mode 100644 index 00000000..5c8f4728 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/Avatar.java @@ -0,0 +1,13 @@ +package ru.otus.example.mybatisdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Avatar { + private long id; + private String photoUrl; +} diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/Course.java b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/Course.java new file mode 100644 index 00000000..6aa8cff7 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/Course.java @@ -0,0 +1,13 @@ +package ru.otus.example.mybatisdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Course { + private long id; + private String name; +} diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/EMail.java b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/EMail.java new file mode 100644 index 00000000..8fa43ebd --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/EMail.java @@ -0,0 +1,13 @@ +package ru.otus.example.mybatisdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class EMail { + private long id; + private String email; +} diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/OtusStudent.java b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/OtusStudent.java new file mode 100644 index 00000000..afb324fb --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/models/OtusStudent.java @@ -0,0 +1,18 @@ +package ru.otus.example.mybatisdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class OtusStudent { + private long id; + private String name; + private Avatar avatar; + private List emails; + private List courses; +} diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/AvatarRepository.java b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/AvatarRepository.java new file mode 100644 index 00000000..634d1aba --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/AvatarRepository.java @@ -0,0 +1,18 @@ +package ru.otus.example.mybatisdemo.repositories; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import ru.otus.example.mybatisdemo.models.Avatar; + +@Mapper +public interface AvatarRepository { + @Select("select * from avatars where id = #{id}") + @Results(value = { + @Result(property = "id", column = "id"), + @Result(property = "photoUrl", column = "photo_url") + }) + Avatar getAvatarById(long id); + +} diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/CourseRepository.java b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/CourseRepository.java new file mode 100644 index 00000000..20271981 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/CourseRepository.java @@ -0,0 +1,17 @@ +package ru.otus.example.mybatisdemo.repositories; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import ru.otus.example.mybatisdemo.models.Course; + +import java.util.List; + +@Mapper +public interface CourseRepository { + + @Select("select * " + + "from student_courses sc left join courses c on sc.course_id = c.id " + + "where sc.student_id = #{studentId}") + List getCoursesByStudentId(long studentId); + +} diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/EmailRepository.java b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/EmailRepository.java new file mode 100644 index 00000000..989b681d --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/EmailRepository.java @@ -0,0 +1,14 @@ +package ru.otus.example.mybatisdemo.repositories; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import ru.otus.example.mybatisdemo.models.EMail; + +import java.util.List; + +@Mapper +public interface EmailRepository { + + @Select("select * from emails where student_id = #{studentId}") + List getEmailsByStudentId(long studentId); +} diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/OtusStudentRepository.java b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/OtusStudentRepository.java new file mode 100644 index 00000000..82a8260b --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/java/ru/otus/example/mybatisdemo/repositories/OtusStudentRepository.java @@ -0,0 +1,42 @@ +package ru.otus.example.mybatisdemo.repositories; + +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.mapping.FetchType; +import ru.otus.example.mybatisdemo.models.Avatar; +import ru.otus.example.mybatisdemo.models.OtusStudent; + +import java.util.List; + +@Mapper +public interface OtusStudentRepository { + + @Select("select * from otus_students") + @Results(id = "studentAllMap", value = { + @Result(property = "id", column = "id"), + @Result(property = "name", column = "name"), + @Result(property = "avatar", column = "avatar_id", javaType = Avatar.class, + one = @One(select = "ru.otus.example.mybatisdemo.repositories.AvatarRepository.getAvatarById", fetchType = FetchType.EAGER)), + @Result(property = "emails", column = "id", javaType = List.class, + many = @Many(select = "ru.otus.example.mybatisdemo.repositories.EmailRepository.getEmailsByStudentId", fetchType = FetchType.EAGER)), + @Result(property = "courses", column = "id", javaType = List.class, + many = @Many(select = "ru.otus.example.mybatisdemo.repositories.CourseRepository.getCoursesByStudentId", fetchType = FetchType.EAGER)) + }) + List findAllWithAllInfo(); + + @Select("select * from otus_students where id = #{id}") + @ResultMap("studentAllMap") + OtusStudent findById(long id); + + @Select("select count(*) as students_count from otus_students") + long getStudentsCount(); + + @Insert("insert into otus_students(name, avatar_id) values (#{name}, #{avatar.id})") + void insert(OtusStudent student); + + @Update("update otus_students set name = #{name} where id = #{id}") + void updateName(OtusStudent student); + + @Delete("delete from otus_students where id = #{id}") + void deleteById(long id); + +} diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/resources/schema.sql b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/resources/schema.sql new file mode 100644 index 00000000..43a684bb --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/main/resources/schema.sql @@ -0,0 +1,31 @@ +create table avatars( + id bigserial, + photo_url varchar(8000), + primary key (id) +); + +create table courses( + id bigserial, + name varchar(255), + primary key (id) +); + +create table otus_students( + id bigserial, + name varchar(255), + avatar_id bigint references avatars (id), + primary key (id) +); + +create table emails( + id bigserial, + student_id bigint references otus_students(id) on delete cascade, + email varchar(255), + primary key (id) +); + +create table student_courses( + student_id bigint references otus_students(id) on delete cascade, + course_id bigint references courses(id), + primary key (student_id, course_id) +); \ No newline at end of file diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/test/java/ru/otus/example/mybatisdemo/repositories/OtusStudentRepositoryTest.java b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/test/java/ru/otus/example/mybatisdemo/repositories/OtusStudentRepositoryTest.java new file mode 100644 index 00000000..210924e6 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/test/java/ru/otus/example/mybatisdemo/repositories/OtusStudentRepositoryTest.java @@ -0,0 +1,103 @@ +package ru.otus.example.mybatisdemo.repositories; + +import lombok.val; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; +import ru.otus.example.mybatisdemo.models.Avatar; +import ru.otus.example.mybatisdemo.models.OtusStudent; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayName("Репозиторий на основе MyBatis для работы со студентами ") +@SpringBootTest +@Transactional +public class OtusStudentRepositoryTest { + + private static final String FIELD_ID = "id"; + private static final String FIELD_PHOTO_URL = "photoUrl"; + private static final String FIELD_NAME = "name"; + + private static final long FIRST_STUDENT_ID = 1L; + private static final long FIRST_AVATAR_ID = 1L; + private static final String FIRST_STUDENT_NAME = "student_01"; + private static final String FIRST_AVATAR_URL = "photoUrl_01"; + private static final String STUDENT_NEW_NAME = "Висусуалий"; + + private static final int EXPECTED_NUMBER_OF_STUDENTS = 10; + private static final long INSERTED_STUDENT_ID = 11L; + private static final int EXPECTED_EMAILS_COUNT = 2; + private static final int EXPECTED_COURSES_COUNT = 3; + + @Autowired + private OtusStudentRepository studentRepositoryMyBatis; + + @DisplayName("должен загружать список всех студентов с полной информацией о них") + @Test + void shouldReturnCorrectStudentsListWithAllInfo() { + val students = studentRepositoryMyBatis.findAllWithAllInfo(); + assertThat(students).isNotNull().hasSize(EXPECTED_NUMBER_OF_STUDENTS) + .allMatch(s -> !s.getName().equals("")) + .allMatch(s -> s.getCourses() != null && s.getCourses().size() > 0) + .allMatch(s -> s.getAvatar() != null) + .allMatch(s -> s.getEmails() != null && s.getEmails().size() > 0); + } + + @DisplayName("должен загружать число студентов в БД") + @Test + void shouldReturnCorrectStudentsCount() { + long studentsCount = studentRepositoryMyBatis.getStudentsCount(); + assertThat(studentsCount).isEqualTo(EXPECTED_NUMBER_OF_STUDENTS); + } + + @DisplayName(" должен загружать информацию о нужном студенте") + @Test + void shouldFindExpectedStudentById(){ + val actualStudent = studentRepositoryMyBatis.findById(FIRST_STUDENT_ID); + + assertThat(actualStudent).isNotNull(); + assertThat(actualStudent.getName()).isEqualTo(FIRST_STUDENT_NAME); + assertThat(actualStudent.getAvatar()).isNotNull() + .hasFieldOrPropertyWithValue(FIELD_ID, FIRST_STUDENT_ID) + .hasFieldOrPropertyWithValue(FIELD_PHOTO_URL, FIRST_AVATAR_URL); + assertThat(actualStudent.getEmails()).isNotNull().hasSize(EXPECTED_EMAILS_COUNT); + assertThat(actualStudent.getCourses()).isNotNull().hasSize(EXPECTED_COURSES_COUNT); + } + + @DisplayName(" должен сохранить, а потом загрузить информацию о нужном студенте") + @Test + void shouldSaveAndLoadCorrectStudent() { + val expectedStudent = new OtusStudent(); + expectedStudent.setName(STUDENT_NEW_NAME); + expectedStudent.setAvatar(new Avatar(FIRST_AVATAR_ID, FIRST_AVATAR_URL)); + studentRepositoryMyBatis.insert(expectedStudent); + val actualStudent = studentRepositoryMyBatis.findById(INSERTED_STUDENT_ID); + + assertThat(actualStudent).isNotNull().isEqualToComparingOnlyGivenFields(expectedStudent, FIELD_NAME); + } + + + @DisplayName(" должен обновлять имя студента в БД") + @Test + void shouldUpdateStudentName() { + val student = studentRepositoryMyBatis.findById(FIRST_STUDENT_ID); + student.setName(STUDENT_NEW_NAME); + studentRepositoryMyBatis.updateName(student); + val actualStudent = studentRepositoryMyBatis.findById(FIRST_STUDENT_ID); + + assertThat(actualStudent).isNotNull().hasFieldOrPropertyWithValue(FIELD_NAME, student.getName()); + } + + @DisplayName("должен удалять студента из БД по id") + @Test + void shouldDeleteStudentFromDbById() { + val studentsCountBefore = studentRepositoryMyBatis.getStudentsCount(); + studentRepositoryMyBatis.deleteById(FIRST_STUDENT_ID); + val studentsCountAfter = studentRepositoryMyBatis.getStudentsCount(); + + assertThat(studentsCountBefore - studentsCountAfter).isEqualTo(1); + } + +} diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/test/resources/application.yml b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/test/resources/application.yml new file mode 100644 index 00000000..dc237b00 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/test/resources/application.yml @@ -0,0 +1,8 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb + initialization-mode: always + +logging: + level: + ru.otus.example.mybatisdemo.repositories: TRACE \ No newline at end of file diff --git a/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/test/resources/data.sql b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/test/resources/data.sql new file mode 100644 index 00000000..a8db6b85 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/mybatis-demo/src/test/resources/data.sql @@ -0,0 +1,29 @@ +insert into avatars(photo_url) +values ('photoUrl_01'), ('photoUrl_02'), ('photoUrl_03'), ('photoUrl_04'), ('photoUrl_05'), + ('photoUrl_06'), ('photoUrl_07'), ('photoUrl_08'), ('photoUrl_09'), ('photoUrl_10'); + +insert into courses(name) +values ('course_name_01'), ('course_name_02'), ('course_name_03'), ('course_name_04'), ('course_name_05'), + ('course_name_06'), ('course_name_07'), ('course_name_08'), ('course_name_09'), ('course_name_10'), ('not_used_11'); + +insert into otus_students(name, avatar_id) +values ('student_01', 1), ('student_02', 2), ('student_03', 3), ('student_04', 4), ('student_05', 5), + ('student_06', 6), ('student_07', 7), ('student_08', 8), ('student_09', 9), ('student_10', 10); + + +insert into emails(email, student_id) +values ('email_01', 1), ('email_02', 1), ('email_03', 2), ('email_04', 2), ('email_05', 3), ('email_06', 4), + ('email_07', 5), ('email_08', 6), ('email_09', 7), ('email_10', 8), ('email_11', 9), ('email_12', 10); + + +insert into student_courses(student_id, course_id) +values (1, 1), (1, 2), (1, 3), + (2, 2), (2, 4), (2, 5), + (3, 3), (3, 6), (3, 7), + (4, 4), (4, 8), (4, 9), + (5, 5), (5, 10), (5, 1), + (6, 6), (6, 2), (6, 3), + (7, 7), (7, 4), (7, 5), + (8, 8), (8, 6), (8, 7), + (9, 9), (9, 8), (9, 10), + (10, 10), (10, 1), (10, 2); diff --git a/2021-02/spring-08-orm/demo-projects/pom.xml b/2021-02/spring-08-orm/demo-projects/pom.xml new file mode 100644 index 00000000..711fadf0 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + ru.otus + demo-projects + 1.0 + + pom + + + spring-jdbc-demo + mybatis-demo + + diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/.gitignore b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/.gitignore @@ -0,0 +1,29 @@ +HELP.md +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +### VS Code ### +.vscode/ diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/README.md b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/README.md new file mode 100644 index 00000000..462216c3 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/README.md @@ -0,0 +1,2 @@ +# spring-jdbc-demo +Пример работы с БД через jdbc \ No newline at end of file diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/pom.xml b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/pom.xml new file mode 100644 index 00000000..daca2df4 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.4 + + + ru.otus.example + spring-jdbc-demo + 0.0.1-SNAPSHOT + spring-jdbc-demo + Spring jdbc demo + + + 11 + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter-data-jdbc + + + + com.h2database + h2 + runtime + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/SpringJdbcDemoApplication.java b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/SpringJdbcDemoApplication.java new file mode 100644 index 00000000..28ebfec4 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/SpringJdbcDemoApplication.java @@ -0,0 +1,13 @@ +package ru.otus.example.springjdbcdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringJdbcDemoApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringJdbcDemoApplication.class, args); + } + +} diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/Avatar.java b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/Avatar.java new file mode 100644 index 00000000..a1963ea4 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/Avatar.java @@ -0,0 +1,13 @@ +package ru.otus.example.springjdbcdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Avatar { + private long id; + private String photoUrl; +} diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/Course.java b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/Course.java new file mode 100644 index 00000000..07b6e2c2 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/Course.java @@ -0,0 +1,13 @@ +package ru.otus.example.springjdbcdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Course { + private long id; + private String name; +} diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/EMail.java b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/EMail.java new file mode 100644 index 00000000..16985ad5 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/EMail.java @@ -0,0 +1,13 @@ +package ru.otus.example.springjdbcdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class EMail { + private long id; + private String email; +} diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/OtusStudent.java b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/OtusStudent.java new file mode 100644 index 00000000..5ae9167c --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/models/OtusStudent.java @@ -0,0 +1,18 @@ +package ru.otus.example.springjdbcdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class OtusStudent { + private long id; + private String name; + private Avatar avatar; + private List emails; + private List courses; +} diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/CourseRepositoryJdbc.java b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/CourseRepositoryJdbc.java new file mode 100644 index 00000000..716ab880 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/CourseRepositoryJdbc.java @@ -0,0 +1,9 @@ +package ru.otus.example.springjdbcdemo.repositories; + +import ru.otus.example.springjdbcdemo.models.Course; + +import java.util.List; + +public interface CourseRepositoryJdbc { + List findAllUsed(); +} diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/CourseRepositoryJdbcImpl.java b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/CourseRepositoryJdbcImpl.java new file mode 100644 index 00000000..53915e14 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/CourseRepositoryJdbcImpl.java @@ -0,0 +1,36 @@ +package ru.otus.example.springjdbcdemo.repositories; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; +import ru.otus.example.springjdbcdemo.models.Course; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class CourseRepositoryJdbcImpl implements CourseRepositoryJdbc { + + @Autowired + private final JdbcOperations op; + + @Override + public List findAllUsed() { + return op.query("select c.id, c.name " + + "from courses c inner join student_courses sc on c.id = sc.course_id " + + "group by c.id, c.name " + + "order by c.name", new CourseRowMapper()); + } + + private static class CourseRowMapper implements RowMapper { + @Override + public Course mapRow(ResultSet rs, int i) throws SQLException { + return new Course(rs.getLong(1), rs.getString(2)); + } + } + +} diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/OtusStudentRepositoryJdbc.java b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/OtusStudentRepositoryJdbc.java new file mode 100644 index 00000000..0761373d --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/OtusStudentRepositoryJdbc.java @@ -0,0 +1,9 @@ +package ru.otus.example.springjdbcdemo.repositories; + +import ru.otus.example.springjdbcdemo.models.OtusStudent; + +import java.util.List; + +public interface OtusStudentRepositoryJdbc { + List findAllWithAllInfo(); +} diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/OtusStudentRepositoryJdbcImpl.java b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/OtusStudentRepositoryJdbcImpl.java new file mode 100644 index 00000000..8946a187 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/OtusStudentRepositoryJdbcImpl.java @@ -0,0 +1,50 @@ +package ru.otus.example.springjdbcdemo.repositories; + +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.stereotype.Repository; +import ru.otus.example.springjdbcdemo.models.Course; +import ru.otus.example.springjdbcdemo.models.OtusStudent; +import ru.otus.example.springjdbcdemo.repositories.ext.OtusStudentResultSetExtractor; +import ru.otus.example.springjdbcdemo.repositories.ext.StudentCourseRelation; + +import java.util.*; +import java.util.stream.Collectors; + +@Repository +@RequiredArgsConstructor +public class OtusStudentRepositoryJdbcImpl implements OtusStudentRepositoryJdbc { + + private final CourseRepositoryJdbc courseRepository; + private final JdbcOperations op; + + @Override + public List findAllWithAllInfo() { + List courses = courseRepository.findAllUsed(); + List relations = getAllRelations(); + Map students = + op.query("select os.id, os.name, a.id avatar_id, a.photo_url, e.id email_id, e.email " + + "from (otus_students os left join avatars a on " + + "os.avatar_id = a.id) left join emails e on os.id = e.student_id", + new OtusStudentResultSetExtractor()); + + mergeStudentsInfo(students, courses, relations); + return new ArrayList<>(Objects.requireNonNull(students).values()); + } + + private List getAllRelations() { + return op.query("select student_id, course_id from student_courses sc order by student_id, course_id", + (rs, i) -> new StudentCourseRelation(rs.getLong(1), rs.getLong(2))); + } + + private void mergeStudentsInfo(Map students, List courses, List relations) { + Map coursesMap = courses.stream().collect(Collectors.toMap(Course::getId, c -> c)); + relations.forEach(r -> { + if (students.containsKey(r.getStudentId()) && coursesMap.containsKey(r.getCourseId())) { + students.get(r.getStudentId()).getCourses().add(coursesMap.get(r.getCourseId())); + } + }); + } + + +} diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/ext/OtusStudentResultSetExtractor.java b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/ext/OtusStudentResultSetExtractor.java new file mode 100644 index 00000000..778a46b7 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/ext/OtusStudentResultSetExtractor.java @@ -0,0 +1,37 @@ +package ru.otus.example.springjdbcdemo.repositories.ext; + +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.ResultSetExtractor; +import ru.otus.example.springjdbcdemo.models.Avatar; +import ru.otus.example.springjdbcdemo.models.EMail; +import ru.otus.example.springjdbcdemo.models.OtusStudent; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class OtusStudentResultSetExtractor implements + ResultSetExtractor> { + @Override + public Map extractData(ResultSet rs) throws SQLException, + DataAccessException { + + Map students = new HashMap<>(); + while (rs.next()) { + long id = rs.getLong("id"); + OtusStudent student = students.get(id); + if (student == null) { + student = new OtusStudent(id, rs.getString("name"), + new Avatar(rs.getLong("avatar_id"), rs.getString("photo_url")), + new ArrayList<>(), new ArrayList<>()); + students.put(student.getId(), student); + } + + student.getEmails().add(new EMail(rs.getLong("email_id"), + rs.getString("email"))); + } + return students; + } +} diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/ext/StudentCourseRelation.java b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/ext/StudentCourseRelation.java new file mode 100644 index 00000000..408c97d2 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/java/ru/otus/example/springjdbcdemo/repositories/ext/StudentCourseRelation.java @@ -0,0 +1,11 @@ +package ru.otus.example.springjdbcdemo.repositories.ext; + +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Data +@RequiredArgsConstructor +public class StudentCourseRelation { + private final long studentId; + private final long courseId; +} diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/resources/schema.sql b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/resources/schema.sql new file mode 100644 index 00000000..43a684bb --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/main/resources/schema.sql @@ -0,0 +1,31 @@ +create table avatars( + id bigserial, + photo_url varchar(8000), + primary key (id) +); + +create table courses( + id bigserial, + name varchar(255), + primary key (id) +); + +create table otus_students( + id bigserial, + name varchar(255), + avatar_id bigint references avatars (id), + primary key (id) +); + +create table emails( + id bigserial, + student_id bigint references otus_students(id) on delete cascade, + email varchar(255), + primary key (id) +); + +create table student_courses( + student_id bigint references otus_students(id) on delete cascade, + course_id bigint references courses(id), + primary key (student_id, course_id) +); \ No newline at end of file diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/test/java/ru/otus/example/springjdbcdemo/repositories/OtusStudentRepositoryJdbcImplTest.java b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/test/java/ru/otus/example/springjdbcdemo/repositories/OtusStudentRepositoryJdbcImplTest.java new file mode 100644 index 00000000..dab99810 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/test/java/ru/otus/example/springjdbcdemo/repositories/OtusStudentRepositoryJdbcImplTest.java @@ -0,0 +1,35 @@ +package ru.otus.example.springjdbcdemo.repositories; + +import lombok.val; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.context.annotation.Import; + + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayName("Репозиторий на основе Jdbc для работы со студентами ") +@JdbcTest +@Import({OtusStudentRepositoryJdbcImpl.class, CourseRepositoryJdbcImpl.class}) +class OtusStudentRepositoryJdbcImplTest { + + private static final int EXPECTED_NUMBER_OF_STUDENTS = 10; + + @Autowired + private OtusStudentRepositoryJdbcImpl repositoryJdbc; + + @DisplayName("должен загружать список всех студентов с полной информацией о них") + @Test + void shouldReturnCorrectStudentsListWithAllInfo() { + val students = repositoryJdbc.findAllWithAllInfo(); + assertThat(students).isNotNull().hasSize(EXPECTED_NUMBER_OF_STUDENTS) + .allMatch(s -> !s.getName().equals("")) + .allMatch(s -> s.getCourses() != null && s.getCourses().size() > 0) + .allMatch(s -> s.getAvatar() != null) + .allMatch(s -> s.getEmails() != null && s.getEmails().size() > 0); + students.forEach(System.out::println); + + } +} \ No newline at end of file diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/test/resources/application.yml b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/test/resources/application.yml new file mode 100644 index 00000000..e1e538a4 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/test/resources/application.yml @@ -0,0 +1,4 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb + initialization-mode: always \ No newline at end of file diff --git a/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/test/resources/data.sql b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/test/resources/data.sql new file mode 100644 index 00000000..a8db6b85 --- /dev/null +++ b/2021-02/spring-08-orm/demo-projects/spring-jdbc-demo/src/test/resources/data.sql @@ -0,0 +1,29 @@ +insert into avatars(photo_url) +values ('photoUrl_01'), ('photoUrl_02'), ('photoUrl_03'), ('photoUrl_04'), ('photoUrl_05'), + ('photoUrl_06'), ('photoUrl_07'), ('photoUrl_08'), ('photoUrl_09'), ('photoUrl_10'); + +insert into courses(name) +values ('course_name_01'), ('course_name_02'), ('course_name_03'), ('course_name_04'), ('course_name_05'), + ('course_name_06'), ('course_name_07'), ('course_name_08'), ('course_name_09'), ('course_name_10'), ('not_used_11'); + +insert into otus_students(name, avatar_id) +values ('student_01', 1), ('student_02', 2), ('student_03', 3), ('student_04', 4), ('student_05', 5), + ('student_06', 6), ('student_07', 7), ('student_08', 8), ('student_09', 9), ('student_10', 10); + + +insert into emails(email, student_id) +values ('email_01', 1), ('email_02', 1), ('email_03', 2), ('email_04', 2), ('email_05', 3), ('email_06', 4), + ('email_07', 5), ('email_08', 6), ('email_09', 7), ('email_10', 8), ('email_11', 9), ('email_12', 10); + + +insert into student_courses(student_id, course_id) +values (1, 1), (1, 2), (1, 3), + (2, 2), (2, 4), (2, 5), + (3, 3), (3, 6), (3, 7), + (4, 4), (4, 8), (4, 9), + (5, 5), (5, 10), (5, 1), + (6, 6), (6, 2), (6, 3), + (7, 7), (7, 4), (7, 5), + (8, 8), (8, 6), (8, 7), + (9, 9), (9, 8), (9, 10), + (10, 10), (10, 1), (10, 2); diff --git a/2021-02/spring-08-orm/orm-class-work/orm-exercise/.gitignore b/2021-02/spring-08-orm/orm-class-work/orm-exercise/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-exercise/.gitignore @@ -0,0 +1,29 @@ +HELP.md +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +### VS Code ### +.vscode/ diff --git a/2021-02/spring-08-orm/orm-class-work/orm-exercise/pom.xml b/2021-02/spring-08-orm/orm-class-work/orm-exercise/pom.xml new file mode 100644 index 00000000..26b73083 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-exercise/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.4 + + + ru.otus.example + orm-exercise + orm-exercise + 0.0.1-SNAPSHOT + + + 11 + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + 1.4.200 + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java b/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java new file mode 100644 index 00000000..cbf71df2 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java @@ -0,0 +1,17 @@ +package ru.otus.example.ormdemo; + +import org.h2.tools.Console; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.sql.SQLException; + +@SpringBootApplication +public class OrmDemoApplication { + + public static void main(String[] args) throws SQLException { + SpringApplication.run(OrmDemoApplication.class, args); + Console.main(args); + } + +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/Avatar.java b/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/Avatar.java new file mode 100644 index 00000000..52c8b747 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/Avatar.java @@ -0,0 +1,15 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Avatar { + private long id; + private String photoUrl; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/Course.java b/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/Course.java new file mode 100644 index 00000000..adbde731 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/Course.java @@ -0,0 +1,15 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Course { + private long id; + private String name; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/EMail.java b/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/EMail.java new file mode 100644 index 00000000..d7ed5610 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/EMail.java @@ -0,0 +1,15 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EMail { + private long id; + private String email; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java b/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java new file mode 100644 index 00000000..49d7bcba --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java @@ -0,0 +1,18 @@ +package ru.otus.example.ormdemo.models; + +import lombok.*; + +import javax.persistence.*; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OtusStudent { + private long id; + private String name; + + //private Avatar avatar; + //private List emails; + //private List courses; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/resources/application.yml b/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/resources/application.yml new file mode 100644 index 00000000..80d05f29 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-exercise/src/main/resources/application.yml @@ -0,0 +1,20 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb + initialization-mode: never + + jpa: + generate-ddl: true + hibernate: + ddl-auto: create + + properties: + hibernate: + format_sql: true + + show-sql: true + + +logging: + level: + ROOT: ERROR \ No newline at end of file diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-01/.gitignore b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/.gitignore @@ -0,0 +1,29 @@ +HELP.md +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +### VS Code ### +.vscode/ diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-01/pom.xml b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/pom.xml new file mode 100644 index 00000000..75f3a86f --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.4 + + + ru.otus.example + orm-solution-01 + orm-solution-01 + 0.0.1-SNAPSHOT + + + 11 + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + 1.4.200 + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java new file mode 100644 index 00000000..cbf71df2 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java @@ -0,0 +1,17 @@ +package ru.otus.example.ormdemo; + +import org.h2.tools.Console; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.sql.SQLException; + +@SpringBootApplication +public class OrmDemoApplication { + + public static void main(String[] args) throws SQLException { + SpringApplication.run(OrmDemoApplication.class, args); + Console.main(args); + } + +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/Avatar.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/Avatar.java new file mode 100644 index 00000000..d9cca2ca --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/Avatar.java @@ -0,0 +1,17 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +public class Avatar { + @Id + private long id; + private String photoUrl; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/Course.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/Course.java new file mode 100644 index 00000000..a02a15f8 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/Course.java @@ -0,0 +1,17 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +public class Course { + @Id + private long id; + private String name; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/EMail.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/EMail.java new file mode 100644 index 00000000..e71e8ac9 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/EMail.java @@ -0,0 +1,17 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +public class EMail { + @Id + private long id; + private String email; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java new file mode 100644 index 00000000..ec9dfaa5 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java @@ -0,0 +1,20 @@ +package ru.otus.example.ormdemo.models; + +import lombok.*; + +import javax.persistence.*; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity // Указывает, что данный класс является сущностью +public class OtusStudent { + @Id // Позволяет указать какое поле является идентификатором + private long id; + private String name; + + //private Avatar avatar; + //private List emails; + //private List courses; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/resources/application.yml b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/resources/application.yml new file mode 100644 index 00000000..80d05f29 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-01/src/main/resources/application.yml @@ -0,0 +1,20 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb + initialization-mode: never + + jpa: + generate-ddl: true + hibernate: + ddl-auto: create + + properties: + hibernate: + format_sql: true + + show-sql: true + + +logging: + level: + ROOT: ERROR \ No newline at end of file diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-02/.gitignore b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/.gitignore @@ -0,0 +1,29 @@ +HELP.md +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +### VS Code ### +.vscode/ diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-02/pom.xml b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/pom.xml new file mode 100644 index 00000000..d6f9a46e --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.4 + + + ru.otus.example + orm-solution-02 + orm-solution-02 + 0.0.1-SNAPSHOT + + + 11 + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + 1.4.200 + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java new file mode 100644 index 00000000..cbf71df2 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java @@ -0,0 +1,17 @@ +package ru.otus.example.ormdemo; + +import org.h2.tools.Console; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.sql.SQLException; + +@SpringBootApplication +public class OrmDemoApplication { + + public static void main(String[] args) throws SQLException { + SpringApplication.run(OrmDemoApplication.class, args); + Console.main(args); + } + +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/Avatar.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/Avatar.java new file mode 100644 index 00000000..d60a4f32 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/Avatar.java @@ -0,0 +1,20 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "avatars") +public class Avatar { + @Id + private long id; + + @Column(name = "photo_url") + private String photoUrl; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/Course.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/Course.java new file mode 100644 index 00000000..8a677513 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/Course.java @@ -0,0 +1,20 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "courses") +public class Course { + @Id + private long id; + + @Column(name = "name") + private String name; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/EMail.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/EMail.java new file mode 100644 index 00000000..8f15fd87 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/EMail.java @@ -0,0 +1,21 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "emails") +public class EMail { + + @Id + private long id; + + @Column(name = "email") + private String email; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java new file mode 100644 index 00000000..a509d959 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java @@ -0,0 +1,24 @@ +package ru.otus.example.ormdemo.models; + +import lombok.*; + +import javax.persistence.*; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity // Указывает, что данный класс является сущностью +@Table(name = "otus_students") // Задает имя таблицы, на которую будет отображаться сущность +public class OtusStudent { + @Id // Позволяет указать какое поле является идентификатором + private long id; + + // Задает имя и некоторые свойства поля таблицы, на которое будет отображаться поле сущности + @Column(name = "name") + private String name; + + //private Avatar avatar; + //private List emails; + //private List courses; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/resources/application.yml b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/resources/application.yml new file mode 100644 index 00000000..80d05f29 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-02/src/main/resources/application.yml @@ -0,0 +1,20 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb + initialization-mode: never + + jpa: + generate-ddl: true + hibernate: + ddl-auto: create + + properties: + hibernate: + format_sql: true + + show-sql: true + + +logging: + level: + ROOT: ERROR \ No newline at end of file diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-03/.gitignore b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/.gitignore @@ -0,0 +1,29 @@ +HELP.md +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +### VS Code ### +.vscode/ diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-03/pom.xml b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/pom.xml new file mode 100644 index 00000000..7260bb9b --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.4 + + + ru.otus.example + orm-solution-03 + orm-solution-03 + 0.0.1-SNAPSHOT + + + 11 + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + 1.4.200 + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java new file mode 100644 index 00000000..cbf71df2 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java @@ -0,0 +1,17 @@ +package ru.otus.example.ormdemo; + +import org.h2.tools.Console; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.sql.SQLException; + +@SpringBootApplication +public class OrmDemoApplication { + + public static void main(String[] args) throws SQLException { + SpringApplication.run(OrmDemoApplication.class, args); + Console.main(args); + } + +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/Avatar.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/Avatar.java new file mode 100644 index 00000000..6d7bc172 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/Avatar.java @@ -0,0 +1,21 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "avatars") +public class Avatar { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "photo_url") + private String photoUrl; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/Course.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/Course.java new file mode 100644 index 00000000..8fb4b707 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/Course.java @@ -0,0 +1,21 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "courses") +public class Course { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "name") + private String name; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/EMail.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/EMail.java new file mode 100644 index 00000000..9c999a97 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/EMail.java @@ -0,0 +1,22 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "emails") +public class EMail { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "email") + private String email; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java new file mode 100644 index 00000000..31d00f58 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java @@ -0,0 +1,25 @@ +package ru.otus.example.ormdemo.models; + +import lombok.*; + +import javax.persistence.*; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity // Указывает, что данный класс является сущностью +@Table(name = "otus_students") // Задает имя таблицы, на которую будет отображаться сущность +public class OtusStudent { + @Id // Позволяет указать какое поле является идентификатором + @GeneratedValue(strategy = GenerationType.IDENTITY) // Позволяет указать стратегию генерации id + private long id; + + // Задает имя и некоторые свойства поля таблицы, на которое будет отображаться поле сущности + @Column(name = "name") + private String name; + + //private Avatar avatar; + //private List emails; + //private List courses; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/resources/application.yml b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/resources/application.yml new file mode 100644 index 00000000..80d05f29 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-03/src/main/resources/application.yml @@ -0,0 +1,20 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb + initialization-mode: never + + jpa: + generate-ddl: true + hibernate: + ddl-auto: create + + properties: + hibernate: + format_sql: true + + show-sql: true + + +logging: + level: + ROOT: ERROR \ No newline at end of file diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-04/.gitignore b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/.gitignore @@ -0,0 +1,29 @@ +HELP.md +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +### VS Code ### +.vscode/ diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-04/pom.xml b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/pom.xml new file mode 100644 index 00000000..3a046300 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.4 + + + ru.otus.example + orm-solution-04 + orm-solution-04 + 0.0.1-SNAPSHOT + + + 11 + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + 1.4.200 + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java new file mode 100644 index 00000000..cbf71df2 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java @@ -0,0 +1,17 @@ +package ru.otus.example.ormdemo; + +import org.h2.tools.Console; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.sql.SQLException; + +@SpringBootApplication +public class OrmDemoApplication { + + public static void main(String[] args) throws SQLException { + SpringApplication.run(OrmDemoApplication.class, args); + Console.main(args); + } + +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/Avatar.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/Avatar.java new file mode 100644 index 00000000..6d7bc172 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/Avatar.java @@ -0,0 +1,21 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "avatars") +public class Avatar { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "photo_url") + private String photoUrl; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/Course.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/Course.java new file mode 100644 index 00000000..8fb4b707 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/Course.java @@ -0,0 +1,21 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "courses") +public class Course { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "name") + private String name; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/EMail.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/EMail.java new file mode 100644 index 00000000..9c999a97 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/EMail.java @@ -0,0 +1,22 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "emails") +public class EMail { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "email") + private String email; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java new file mode 100644 index 00000000..44eef5ed --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java @@ -0,0 +1,30 @@ +package ru.otus.example.ormdemo.models; + +import lombok.*; + +import javax.persistence.*; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity // Указывает, что данный класс является сущностью +@Table(name = "otus_students") // Задает имя таблицы, на которую будет отображаться сущность +public class OtusStudent { + @Id // Позволяет указать какое поле является идентификатором + @GeneratedValue(strategy = GenerationType.IDENTITY) // Стратегия генерации идентификаторов + private long id; + + // Задает имя и некоторые свойства поля таблицы, на которое будет отображаться поле сущности + @Column(name = "name", nullable = false, unique = true) + private String name; + + // Указывает на связь между таблицами "один к одному" + @OneToOne(targetEntity = Avatar.class, cascade = CascadeType.ALL) + // Задает поле, по которому происходит объединение с таблицей для хранения связанной сущности + @JoinColumn(name = "avatar_id") + private Avatar avatar; + + //private List emails; + //private List courses; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/resources/application.yml b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/resources/application.yml new file mode 100644 index 00000000..80d05f29 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-04/src/main/resources/application.yml @@ -0,0 +1,20 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb + initialization-mode: never + + jpa: + generate-ddl: true + hibernate: + ddl-auto: create + + properties: + hibernate: + format_sql: true + + show-sql: true + + +logging: + level: + ROOT: ERROR \ No newline at end of file diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-05/.gitignore b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/.gitignore @@ -0,0 +1,29 @@ +HELP.md +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +### VS Code ### +.vscode/ diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-05/pom.xml b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/pom.xml new file mode 100644 index 00000000..01355b03 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.4 + + + ru.otus.example + orm-solution-05 + orm-solution-05 + 0.0.1-SNAPSHOT + + + 11 + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + 1.4.200 + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java new file mode 100644 index 00000000..cbf71df2 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java @@ -0,0 +1,17 @@ +package ru.otus.example.ormdemo; + +import org.h2.tools.Console; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.sql.SQLException; + +@SpringBootApplication +public class OrmDemoApplication { + + public static void main(String[] args) throws SQLException { + SpringApplication.run(OrmDemoApplication.class, args); + Console.main(args); + } + +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/Avatar.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/Avatar.java new file mode 100644 index 00000000..6d7bc172 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/Avatar.java @@ -0,0 +1,21 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "avatars") +public class Avatar { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "photo_url") + private String photoUrl; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/Course.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/Course.java new file mode 100644 index 00000000..8fb4b707 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/Course.java @@ -0,0 +1,21 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "courses") +public class Course { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "name") + private String name; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/EMail.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/EMail.java new file mode 100644 index 00000000..9c999a97 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/EMail.java @@ -0,0 +1,22 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "emails") +public class EMail { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "email") + private String email; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java new file mode 100644 index 00000000..c14e85a5 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java @@ -0,0 +1,34 @@ +package ru.otus.example.ormdemo.models; + +import lombok.*; + +import javax.persistence.*; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity // Указывает, что данный класс является сущностью +@Table(name = "otus_students") // Задает имя таблицы, на которую будет отображаться сущность +public class OtusStudent { + @Id // Позволяет указать какое поле является идентификатором + @GeneratedValue(strategy = GenerationType.IDENTITY) // Стратегия генерации идентификаторов + private long id; + + // Задает имя и некоторые свойства поля таблицы, на которое будет отображаться поле сущности + @Column(name = "name", nullable = false, unique = true) + private String name; + + // Указывает на связь между таблицами "один к одному" + @OneToOne(targetEntity = Avatar.class, cascade = CascadeType.ALL) + // Задает поле, по которому происходит объединение с таблицей для хранения связанной сущности + @JoinColumn(name = "avatar_id") + private Avatar avatar; + + // Указывает на связь между таблицами "один ко многим" + @OneToMany(targetEntity = EMail.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @JoinColumn(name = "student_id") + private List emails; + + //private List courses; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/resources/application.yml b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/resources/application.yml new file mode 100644 index 00000000..80d05f29 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-05/src/main/resources/application.yml @@ -0,0 +1,20 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb + initialization-mode: never + + jpa: + generate-ddl: true + hibernate: + ddl-auto: create + + properties: + hibernate: + format_sql: true + + show-sql: true + + +logging: + level: + ROOT: ERROR \ No newline at end of file diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-final/.gitignore b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/.gitignore @@ -0,0 +1,29 @@ +HELP.md +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +### VS Code ### +.vscode/ diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-final/pom.xml b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/pom.xml new file mode 100644 index 00000000..65adaa56 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.4 + + + ru.otus.example + orm-solution-final + orm-solution-final + 0.0.1-SNAPSHOT + + + 11 + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + 1.4.200 + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java new file mode 100644 index 00000000..cbf71df2 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/OrmDemoApplication.java @@ -0,0 +1,17 @@ +package ru.otus.example.ormdemo; + +import org.h2.tools.Console; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.sql.SQLException; + +@SpringBootApplication +public class OrmDemoApplication { + + public static void main(String[] args) throws SQLException { + SpringApplication.run(OrmDemoApplication.class, args); + Console.main(args); + } + +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/Avatar.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/Avatar.java new file mode 100644 index 00000000..6d7bc172 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/Avatar.java @@ -0,0 +1,21 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "avatars") +public class Avatar { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "photo_url") + private String photoUrl; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/Course.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/Course.java new file mode 100644 index 00000000..8fb4b707 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/Course.java @@ -0,0 +1,21 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "courses") +public class Course { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "name") + private String name; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/EMail.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/EMail.java new file mode 100644 index 00000000..9c999a97 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/EMail.java @@ -0,0 +1,22 @@ +package ru.otus.example.ormdemo.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "emails") +public class EMail { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "email") + private String email; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java new file mode 100644 index 00000000..0ec1e721 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/java/ru/otus/example/ormdemo/models/OtusStudent.java @@ -0,0 +1,39 @@ +package ru.otus.example.ormdemo.models; + +import lombok.*; + +import javax.persistence.*; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity // Указывает, что данный класс является сущностью +@Table(name = "otus_students") // Задает имя таблицы, на которую будет отображаться сущность +public class OtusStudent { + @Id // Позволяет указать какое поле является идентификатором + @GeneratedValue(strategy = GenerationType.IDENTITY) // Стратегия генерации идентификаторов + private long id; + + // Задает имя и некоторые свойства поля таблицы, на которое будет отображаться поле сущности + @Column(name = "name", nullable = false, unique = true) + private String name; + + // Указывает на связь между таблицами "один к одному" + @OneToOne(targetEntity = Avatar.class, cascade = CascadeType.ALL) + // Задает поле, по которому происходит объединение с таблицей для хранения связанной сущности + @JoinColumn(name = "avatar_id") + private Avatar avatar; + + // Указывает на связь между таблицами "один ко многим" + @OneToMany(targetEntity = EMail.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @JoinColumn(name = "student_id") + private List emails; + + // Указывает на связь между таблицами "многие ко многим" + @ManyToMany(targetEntity = Course.class, fetch = FetchType.LAZY /*, cascade = CascadeType.ALL*/) + // Задает таблицу связей между таблицами для хранения родительской и связанной сущностью + @JoinTable(name = "student_courses", joinColumns = @JoinColumn(name = "student_id"), + inverseJoinColumns = @JoinColumn(name = "course_id")) + private List courses; +} diff --git a/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/resources/application.yml b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/resources/application.yml new file mode 100644 index 00000000..80d05f29 --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/orm-solution-final/src/main/resources/application.yml @@ -0,0 +1,20 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb + initialization-mode: never + + jpa: + generate-ddl: true + hibernate: + ddl-auto: create + + properties: + hibernate: + format_sql: true + + show-sql: true + + +logging: + level: + ROOT: ERROR \ No newline at end of file diff --git a/2021-02/spring-08-orm/orm-class-work/pom.xml b/2021-02/spring-08-orm/orm-class-work/pom.xml new file mode 100644 index 00000000..3226fdcc --- /dev/null +++ b/2021-02/spring-08-orm/orm-class-work/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + ru.otus + orm-class-work + 1.0 + + pom + + + orm-exercise + orm-solution-01 + orm-solution-02 + orm-solution-03 + orm-solution-04 + orm-solution-05 + orm-solution-final + +