From eb9b06e694e83561c4d95d5bd9acb033b4cb815c Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Tue, 21 Apr 2020 13:20:16 +0800 Subject: [PATCH 001/160] update --- README.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 246c35d5..b11d78b3 100644 --- a/README.md +++ b/README.md @@ -23,11 +23,6 @@ - - - + + + + + + + + + - - + + + + + -
- - - - @@ -38,13 +33,13 @@
From f5f1192498d2a4623d8a0ee7c2d0956a09b2b14c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 20 May 2020 18:04:52 +0800 Subject: [PATCH 002/160] update --- 2.1.x/README.md | 5 +++++ 2.1.x/README_zh.md | 5 +++++ README.md | 5 +++++ README_zh.md | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/2.1.x/README.md b/2.1.x/README.md index 853aa062..9bada33c 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -35,6 +35,11 @@
+ + + + diff --git a/2.1.x/README_zh.md b/2.1.x/README_zh.md index 45ac33b7..b01138aa 100644 --- a/2.1.x/README_zh.md +++ b/2.1.x/README_zh.md @@ -35,6 +35,11 @@
+ + + + diff --git a/README.md b/README.md index b11d78b3..917e90da 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,11 @@
+ + + + diff --git a/README_zh.md b/README_zh.md index ea69ea5f..29593630 100644 --- a/README_zh.md +++ b/README_zh.md @@ -40,6 +40,11 @@
+ + + + From 2ccecba063ca61ad8fa1a3c39a39002ae0357683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Fri, 19 Jun 2020 17:55:27 +0800 Subject: [PATCH 003/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9AJdbcTemplate=E7=9A=84=E5=A4=9A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/chapter3-7/.gitignore | 29 +++++++++ 2.1.x/chapter3-7/pom.xml | 59 +++++++++++++++++++ .../chapter37/Chapter37Application.java | 13 ++++ .../chapter37/DataSourceConfiguration.java | 39 ++++++++++++ .../src/main/resources/application.properties | 11 ++++ .../chapter37/Chapter37ApplicationTests.java | 48 +++++++++++++++ 6 files changed, 199 insertions(+) create mode 100644 2.1.x/chapter3-7/.gitignore create mode 100644 2.1.x/chapter3-7/pom.xml create mode 100644 2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/Chapter37Application.java create mode 100644 2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/DataSourceConfiguration.java create mode 100644 2.1.x/chapter3-7/src/main/resources/application.properties create mode 100644 2.1.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java diff --git a/2.1.x/chapter3-7/.gitignore b/2.1.x/chapter3-7/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.1.x/chapter3-7/.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/2.1.x/chapter3-7/pom.xml b/2.1.x/chapter3-7/pom.xml new file mode 100644 index 00000000..f8314a33 --- /dev/null +++ b/2.1.x/chapter3-7/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-7 + 0.0.1-SNAPSHOT + 使用JDBCTemplate的多数据源配置 + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/Chapter37Application.java b/2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/Chapter37Application.java new file mode 100644 index 00000000..92be7068 --- /dev/null +++ b/2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/Chapter37Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter37; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter37Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter37Application.class, args); + } + +} diff --git a/2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/DataSourceConfiguration.java b/2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/DataSourceConfiguration.java new file mode 100644 index 00000000..f821153b --- /dev/null +++ b/2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/DataSourceConfiguration.java @@ -0,0 +1,39 @@ +package com.didispace.chapter37; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.core.JdbcTemplate; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfiguration { + + @Primary + @Bean + @ConfigurationProperties(prefix = "spring.datasource.primary") + public DataSource primaryDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean + @ConfigurationProperties(prefix = "spring.datasource.secondary") + public DataSource secondaryDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean + public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource primaryDataSource) { + return new JdbcTemplate(primaryDataSource); + } + + @Bean + public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) { + return new JdbcTemplate(secondaryDataSource); + } + +} diff --git a/2.1.x/chapter3-7/src/main/resources/application.properties b/2.1.x/chapter3-7/src/main/resources/application.properties new file mode 100644 index 00000000..25937c84 --- /dev/null +++ b/2.1.x/chapter3-7/src/main/resources/application.properties @@ -0,0 +1,11 @@ +# pring boot 1.x的配置:spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1 +spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1 +spring.datasource.primary.username=root +spring.datasource.primary.password=123456 +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver + +# spring boot 1.x的配置:spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2 +spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2 +spring.datasource.secondary.username=root +spring.datasource.secondary.password=123456 +spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver \ No newline at end of file diff --git a/2.1.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java b/2.1.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java new file mode 100644 index 00000000..881e28f3 --- /dev/null +++ b/2.1.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java @@ -0,0 +1,48 @@ +package com.didispace.chapter37; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.junit4.SpringRunner; + + +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter37ApplicationTests { + + @Autowired + @Qualifier("primaryJdbcTemplate") + protected JdbcTemplate jdbcTemplate1; + + @Autowired + @Qualifier("secondaryJdbcTemplate") + protected JdbcTemplate jdbcTemplate2; + + @Before + public void setUp() { + jdbcTemplate1.update("DELETE FROM USER "); + jdbcTemplate2.update("DELETE FROM USER "); + } + + @Test + public void test() throws Exception { + // 往第一个数据源中插入 2 条数据 + jdbcTemplate1.update("insert into user(name,age) values(?, ?)", "aaa", 20); + jdbcTemplate1.update("insert into user(name,age) values(?, ?)", "bbb", 30); + + // 往第二个数据源中插入 1 条数据,若插入的是第一个数据源,则会主键冲突报错 + jdbcTemplate2.update("insert into user(name,age) values(?, ?)", "ccc", 20); + + // 查一下第一个数据源中是否有 2 条数据,验证插入是否成功 + Assert.assertEquals("2", jdbcTemplate1.queryForObject("select count(1) from user", String.class)); + + // 查一下第一个数据源中是否有 1 条数据,验证插入是否成功 + Assert.assertEquals("1", jdbcTemplate2.queryForObject("select count(1) from user", String.class)); + } + +} From e2fc129cbd0869e0757316ac49510389ec105d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Fri, 19 Jun 2020 18:47:37 +0800 Subject: [PATCH 004/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9AJdbcTemplate=E7=9A=84=E5=A4=9A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chapter37/Chapter37ApplicationTests.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/2.1.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java b/2.1.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java index 881e28f3..5aa8a72f 100644 --- a/2.1.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java +++ b/2.1.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java @@ -16,33 +16,31 @@ public class Chapter37ApplicationTests { @Autowired - @Qualifier("primaryJdbcTemplate") - protected JdbcTemplate jdbcTemplate1; + protected JdbcTemplate primaryJdbcTemplate; @Autowired - @Qualifier("secondaryJdbcTemplate") - protected JdbcTemplate jdbcTemplate2; + protected JdbcTemplate secondaryJdbcTemplate; @Before public void setUp() { - jdbcTemplate1.update("DELETE FROM USER "); - jdbcTemplate2.update("DELETE FROM USER "); + primaryJdbcTemplate.update("DELETE FROM USER "); + secondaryJdbcTemplate.update("DELETE FROM USER "); } @Test public void test() throws Exception { // 往第一个数据源中插入 2 条数据 - jdbcTemplate1.update("insert into user(name,age) values(?, ?)", "aaa", 20); - jdbcTemplate1.update("insert into user(name,age) values(?, ?)", "bbb", 30); + primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "aaa", 20); + primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "bbb", 30); // 往第二个数据源中插入 1 条数据,若插入的是第一个数据源,则会主键冲突报错 - jdbcTemplate2.update("insert into user(name,age) values(?, ?)", "ccc", 20); + secondaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "ccc", 20); // 查一下第一个数据源中是否有 2 条数据,验证插入是否成功 - Assert.assertEquals("2", jdbcTemplate1.queryForObject("select count(1) from user", String.class)); + Assert.assertEquals("2", primaryJdbcTemplate.queryForObject("select count(1) from user", String.class)); // 查一下第一个数据源中是否有 1 条数据,验证插入是否成功 - Assert.assertEquals("1", jdbcTemplate2.queryForObject("select count(1) from user", String.class)); + Assert.assertEquals("1", secondaryJdbcTemplate.queryForObject("select count(1) from user", String.class)); } } From 5f80be5912aa76f84baac3576e046d5888257f53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Fri, 19 Jun 2020 18:48:39 +0800 Subject: [PATCH 005/160] doing --- 2.1.x/chapter3-8/.gitignore | 29 +++++++++ 2.1.x/chapter3-8/pom.xml | 65 +++++++++++++++++++ .../chapter38/Chapter38Application.java | 25 +++++++ .../java/com/didispace/chapter38/User.java | 26 ++++++++ .../didispace/chapter38/UserRepository.java | 22 +++++++ .../src/main/resources/application.properties | 6 ++ .../chapter34/Chapter34ApplicationTests.java | 57 ++++++++++++++++ 2.1.x/chapter3-9/.gitignore | 29 +++++++++ 2.1.x/chapter3-9/pom.xml | 56 ++++++++++++++++ .../chapter39/Chapter39Application.java | 15 +++++ .../com/didispace/chapter39/entity/User.java | 20 ++++++ .../chapter39/mapper/UserMapper.java | 18 +++++ .../src/main/resources/application.properties | 6 ++ .../src/main/resources/mapper/UserMapper.xml | 13 ++++ .../chapter36/Chapter36ApplicationTests.java | 32 +++++++++ 15 files changed, 419 insertions(+) create mode 100644 2.1.x/chapter3-8/.gitignore create mode 100644 2.1.x/chapter3-8/pom.xml create mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java create mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/User.java create mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/UserRepository.java create mode 100644 2.1.x/chapter3-8/src/main/resources/application.properties create mode 100644 2.1.x/chapter3-8/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java create mode 100644 2.1.x/chapter3-9/.gitignore create mode 100644 2.1.x/chapter3-9/pom.xml create mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java create mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/entity/User.java create mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/mapper/UserMapper.java create mode 100644 2.1.x/chapter3-9/src/main/resources/application.properties create mode 100644 2.1.x/chapter3-9/src/main/resources/mapper/UserMapper.xml create mode 100644 2.1.x/chapter3-9/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java diff --git a/2.1.x/chapter3-8/.gitignore b/2.1.x/chapter3-8/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.1.x/chapter3-8/.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/2.1.x/chapter3-8/pom.xml b/2.1.x/chapter3-8/pom.xml new file mode 100644 index 00000000..cd677906 --- /dev/null +++ b/2.1.x/chapter3-8/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-8 + 0.0.1-SNAPSHOT + 使用spring-data-jpa的多数据源配置 + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java new file mode 100644 index 00000000..4b9e8193 --- /dev/null +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java @@ -0,0 +1,25 @@ +package com.didispace.chapter34; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +public class Chapter34Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter34Application.class, args); + } + + @RestController + static class TextController { + + @GetMapping("/hello") + public String hello() { + return "hello world"; + } + + } + +} diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/User.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/User.java new file mode 100644 index 00000000..701ed4d4 --- /dev/null +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/User.java @@ -0,0 +1,26 @@ +package com.didispace.chapter34; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +@Data +@NoArgsConstructor +public class User { + + @Id + @GeneratedValue + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/UserRepository.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/UserRepository.java new file mode 100644 index 00000000..17533dd3 --- /dev/null +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/UserRepository.java @@ -0,0 +1,22 @@ +package com.didispace.chapter34; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/2/15. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface UserRepository extends JpaRepository { + + User findByName(String name); + + User findByNameAndAge(String name, Integer age); + + @Query("from User u where u.name=:name") + User findUser(@Param("name") String name); + +} diff --git a/2.1.x/chapter3-8/src/main/resources/application.properties b/2.1.x/chapter3-8/src/main/resources/application.properties new file mode 100644 index 00000000..44c64de2 --- /dev/null +++ b/2.1.x/chapter3-8/src/main/resources/application.properties @@ -0,0 +1,6 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password= +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/2.1.x/chapter3-8/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java b/2.1.x/chapter3-8/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java new file mode 100644 index 00000000..e104e22c --- /dev/null +++ b/2.1.x/chapter3-8/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java @@ -0,0 +1,57 @@ +package com.didispace.chapter34; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.sql.DataSource; +import java.util.List; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter34ApplicationTests { + + @Autowired + private UserRepository userRepository; + + @Test + public void test() throws Exception { + // 创建10条记录 + userRepository.save(new User("AAA", 10)); + userRepository.save(new User("BBB", 20)); + userRepository.save(new User("CCC", 30)); + userRepository.save(new User("DDD", 40)); + userRepository.save(new User("EEE", 50)); + userRepository.save(new User("FFF", 60)); + userRepository.save(new User("GGG", 70)); + userRepository.save(new User("HHH", 80)); + userRepository.save(new User("III", 90)); + userRepository.save(new User("JJJ", 100)); + + // 测试findAll, 查询所有记录 + Assert.assertEquals(10, userRepository.findAll().size()); + + // 测试findByName, 查询姓名为FFF的User + Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue()); + + // 测试findUser, 查询姓名为FFF的User + Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue()); + + // 测试findByNameAndAge, 查询姓名为FFF并且年龄为60的User + Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName()); + + // 测试删除姓名为AAA的User + userRepository.delete(userRepository.findByName("AAA")); + + // 测试findAll, 查询所有记录, 验证上面的删除是否成功 + Assert.assertEquals(9, userRepository.findAll().size()); + + } + +} diff --git a/2.1.x/chapter3-9/.gitignore b/2.1.x/chapter3-9/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.1.x/chapter3-9/.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/2.1.x/chapter3-9/pom.xml b/2.1.x/chapter3-9/pom.xml new file mode 100644 index 00000000..f8572620 --- /dev/null +++ b/2.1.x/chapter3-9/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-9 + 0.0.1-SNAPSHOT + 使用MyBatis的多数据源配置 + + + 1.8 + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.1 + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java new file mode 100644 index 00000000..2ce02b15 --- /dev/null +++ b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter36; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@MapperScan("com.didispace.chapter36.mapper") +@SpringBootApplication +public class Chapter36Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter36Application.class, args); + } + +} diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/entity/User.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/entity/User.java new file mode 100644 index 00000000..6196ed6d --- /dev/null +++ b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/entity/User.java @@ -0,0 +1,20 @@ +package com.didispace.chapter36.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor +public class User { + + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/mapper/UserMapper.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/mapper/UserMapper.java new file mode 100644 index 00000000..cd361f46 --- /dev/null +++ b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/mapper/UserMapper.java @@ -0,0 +1,18 @@ +package com.didispace.chapter36.mapper; + +import com.didispace.chapter36.entity.User; +import org.apache.ibatis.annotations.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/2/28. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface UserMapper { + + User findByName(@Param("name") String name); + + int insert(@Param("name") String name, @Param("age") Integer age); + +} diff --git a/2.1.x/chapter3-9/src/main/resources/application.properties b/2.1.x/chapter3-9/src/main/resources/application.properties new file mode 100644 index 00000000..ec5cde49 --- /dev/null +++ b/2.1.x/chapter3-9/src/main/resources/application.properties @@ -0,0 +1,6 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=12345678 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +mybatis.mapper-locations=classpath:mapper/*.xml diff --git a/2.1.x/chapter3-9/src/main/resources/mapper/UserMapper.xml b/2.1.x/chapter3-9/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 00000000..520d290e --- /dev/null +++ b/2.1.x/chapter3-9/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,13 @@ + + + + + + + INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age}) + + \ No newline at end of file diff --git a/2.1.x/chapter3-9/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java b/2.1.x/chapter3-9/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java new file mode 100644 index 00000000..aab8acb1 --- /dev/null +++ b/2.1.x/chapter3-9/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java @@ -0,0 +1,32 @@ +package com.didispace.chapter36; + +import com.didispace.chapter36.entity.User; +import com.didispace.chapter36.mapper.UserMapper; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +@Transactional +public class Chapter36ApplicationTests { + + @Autowired + private UserMapper userMapper; + + @Test + @Rollback + public void test() throws Exception { + userMapper.insert("AAA", 20); + User u = userMapper.findByName("AAA"); + Assert.assertEquals(20, u.getAge().intValue()); + } + +} From 78eaaf4f3ef6b63a8bdc2f9232800d5c0e2603e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Fri, 19 Jun 2020 19:17:37 +0800 Subject: [PATCH 006/160] doing --- 2.1.x/pom.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/2.1.x/pom.xml b/2.1.x/pom.xml index b468ab87..8d34c948 100644 --- a/2.1.x/pom.xml +++ b/2.1.x/pom.xml @@ -21,12 +21,13 @@ chapter2-6 - chapter3-1 - chapter3-2 - chapter3-3 - chapter3-4 + chapter3-1 + chapter3-2 + chapter3-3 + chapter3-4 chapter3-5 chapter3-6 + chapter3-7 chapter4-1 From 6d06a02ba03a530dba41e7c914fcf4af887c7317 Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Sun, 21 Jun 2020 21:06:35 +0800 Subject: [PATCH 007/160] =?UTF-8?q?Spring=20Data=20JPA=E7=9A=84=E5=A4=9A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chapter38/Chapter38Application.java | 6 +- .../chapter38/DataSourceConfiguration.java | 29 ++++++++++ .../didispace/chapter38/PrimaryConfig.java | 56 +++++++++++++++++++ .../didispace/chapter38/SecondaryConfig.java | 50 +++++++++++++++++ .../com/didispace/chapter38/{ => p}/User.java | 2 +- .../chapter38/{ => p}/UserRepository.java | 2 +- .../java/com/didispace/chapter38/s/User.java | 26 +++++++++ .../didispace/chapter38/s/UserRepository.java | 23 ++++++++ .../src/main/resources/application.properties | 19 +++++-- .../Chapter38ApplicationTests.java} | 10 ++-- 2.1.x/pom.xml | 1 + 11 files changed, 208 insertions(+), 16 deletions(-) create mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java create mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java create mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java rename 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/{ => p}/User.java (92%) rename 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/{ => p}/UserRepository.java (94%) create mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/User.java create mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/UserRepository.java rename 2.1.x/chapter3-8/src/test/java/com/didispace/{chapter34/Chapter34ApplicationTests.java => chapter38/Chapter38ApplicationTests.java} (91%) diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java index 4b9e8193..05a262aa 100644 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java @@ -1,4 +1,4 @@ -package com.didispace.chapter34; +package com.didispace.chapter38; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -6,10 +6,10 @@ import org.springframework.web.bind.annotation.RestController; @SpringBootApplication -public class Chapter34Application { +public class Chapter38Application { public static void main(String[] args) { - SpringApplication.run(Chapter34Application.class, args); + SpringApplication.run(Chapter38Application.class, args); } @RestController diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java new file mode 100644 index 00000000..5d02e41b --- /dev/null +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java @@ -0,0 +1,29 @@ +package com.didispace.chapter37; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.core.JdbcTemplate; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfiguration { + + @Primary + @Bean + @ConfigurationProperties(prefix = "spring.datasource.primary") + public DataSource primaryDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean + @ConfigurationProperties(prefix = "spring.datasource.secondary") + public DataSource secondaryDataSource() { + return DataSourceBuilder.create().build(); + } + +} diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java new file mode 100644 index 00000000..fa4361e4 --- /dev/null +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java @@ -0,0 +1,56 @@ +package com.didispace.chapter38; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; +import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManager; +import javax.sql.DataSource; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories( + entityManagerFactoryRef="entityManagerFactoryPrimary", + transactionManagerRef="transactionManagerPrimary", + basePackages= { "com.didispace.chapter38.p" }) //设置Repository所在位置 +public class PrimaryConfig { + + @Autowired + @Qualifier("primaryDataSource") + private DataSource primaryDataSource; + + @Primary + @Bean(name = "entityManagerPrimary") + public EntityManager entityManager(EntityManagerFactoryBuilder builder) { + return entityManagerFactoryPrimary(builder).getObject().createEntityManager(); + } + + @Primary + @Bean(name = "entityManagerFactoryPrimary") + public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) { + HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); + jpaVendorAdapter.setGenerateDdl(true); + return builder + .dataSource(primaryDataSource) + .packages("com.didispace.domain.p") //设置实体类所在位置 + .persistenceUnit("primaryPersistenceUnit") + .build(); + } + + @Primary + @Bean(name = "transactionManagerPrimary") + public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { + return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); + } + +} \ No newline at end of file diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java new file mode 100644 index 00000000..838ee6c2 --- /dev/null +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java @@ -0,0 +1,50 @@ +package com.didispace.chapter38; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; +import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManager; +import javax.sql.DataSource; +import java.util.Map; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories( + entityManagerFactoryRef="entityManagerFactorySecondary", + transactionManagerRef="transactionManagerSecondary", + basePackages= { "com.didispace.chapter38.s" }) //设置Repository所在位置 +public class SecondaryConfig { + + @Autowired + @Qualifier("secondaryDataSource") + private DataSource secondaryDataSource; + + @Bean(name = "entityManagerSecondary") + public EntityManager entityManager(EntityManagerFactoryBuilder builder) { + return entityManagerFactorySecondary(builder).getObject().createEntityManager(); + } + + @Bean(name = "entityManagerFactorySecondary") + public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) { + return builder + .dataSource(secondaryDataSource) + .packages("com.didispace.chapter38.s") //设置实体类所在位置 + .persistenceUnit("secondaryPersistenceUnit") + .build(); + } + + @Bean(name = "transactionManagerSecondary") + PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) { + return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject()); + } + +} \ No newline at end of file diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/User.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java similarity index 92% rename from 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/User.java rename to 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java index 701ed4d4..63b1e429 100644 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/User.java +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java @@ -1,4 +1,4 @@ -package com.didispace.chapter34; +package com.didispace.chapter38.p; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/UserRepository.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java similarity index 94% rename from 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/UserRepository.java rename to 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java index 17533dd3..84f5a90e 100644 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/UserRepository.java +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java @@ -1,4 +1,4 @@ -package com.didispace.chapter34; +package com.didispace.chapter38.p; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/User.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/User.java new file mode 100644 index 00000000..f3f55d35 --- /dev/null +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/User.java @@ -0,0 +1,26 @@ +package com.didispace.chapter38.s; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +@Data +@NoArgsConstructor +public class User { + + @Id + @GeneratedValue + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/UserRepository.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/UserRepository.java new file mode 100644 index 00000000..6eb5e7e7 --- /dev/null +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/UserRepository.java @@ -0,0 +1,23 @@ +package com.didispace.chapter38.s; + +import com.didispace.chapter38.p.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/2/15. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface UserRepository extends JpaRepository { + + com.didispace.chapter38.s.User findByName(String name); + + com.didispace.chapter38.s.User findByNameAndAge(String name, Integer age); + + @Query("from User u where u.name=:name") + com.didispace.chapter38.s.User findUser(@Param("name") String name); + +} diff --git a/2.1.x/chapter3-8/src/main/resources/application.properties b/2.1.x/chapter3-8/src/main/resources/application.properties index 44c64de2..f62afca5 100644 --- a/2.1.x/chapter3-8/src/main/resources/application.properties +++ b/2.1.x/chapter3-8/src/main/resources/application.properties @@ -1,6 +1,15 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/test -spring.datasource.username=root -spring.datasource.password= -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +# pring boot 1.x的配置:spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1 +spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1 +spring.datasource.primary.username=root +spring.datasource.primary.password=123456 +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver -spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop \ No newline at end of file +# spring boot 1.x的配置:spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2 +spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2 +spring.datasource.secondary.username=root +spring.datasource.secondary.password=123456 +spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=create-drop \ No newline at end of file diff --git a/2.1.x/chapter3-8/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java b/2.1.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java similarity index 91% rename from 2.1.x/chapter3-8/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java rename to 2.1.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java index e104e22c..9cb1d7ef 100644 --- a/2.1.x/chapter3-8/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java +++ b/2.1.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java @@ -1,21 +1,19 @@ -package com.didispace.chapter34; +package com.didispace.chapter38; +import com.didispace.chapter38.p.User; +import com.didispace.chapter38.p.UserRepository; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import javax.sql.DataSource; -import java.util.List; - @Slf4j @RunWith(SpringRunner.class) @SpringBootTest -public class Chapter34ApplicationTests { +public class Chapter38ApplicationTests { @Autowired private UserRepository userRepository; diff --git a/2.1.x/pom.xml b/2.1.x/pom.xml index 8d34c948..0af8de78 100644 --- a/2.1.x/pom.xml +++ b/2.1.x/pom.xml @@ -28,6 +28,7 @@ chapter3-5 chapter3-6 chapter3-7 + chapter3-8 chapter4-1 From 5615863d87dfafbba973be7693dc1aa5a933a4f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Mon, 22 Jun 2020 15:48:45 +0800 Subject: [PATCH 008/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9ASpring=20Data=20JPA=E7=9A=84?= =?UTF-8?q?=E5=A4=9A=E6=95=B0=E6=8D=AE=E6=BA=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chapter38/Chapter38Application.java | 10 ----- .../chapter38/DataSourceConfiguration.java | 2 +- .../didispace/chapter38/PrimaryConfig.java | 20 +++++++-- .../didispace/chapter38/SecondaryConfig.java | 12 ++++++ .../java/com/didispace/chapter38/p/User.java | 1 + .../didispace/chapter38/p/UserRepository.java | 9 +--- .../chapter38/s/{User.java => Message.java} | 15 ++++--- .../chapter38/s/MessageRepository.java | 14 +++++++ .../didispace/chapter38/s/UserRepository.java | 23 ----------- .../src/main/resources/application.properties | 9 ++-- .../chapter38/Chapter38ApplicationTests.java | 41 +++++++------------ 11 files changed, 74 insertions(+), 82 deletions(-) rename 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/{User.java => Message.java} (52%) create mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/MessageRepository.java delete mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/UserRepository.java diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java index 05a262aa..d2e5f499 100644 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java @@ -12,14 +12,4 @@ public static void main(String[] args) { SpringApplication.run(Chapter38Application.class, args); } - @RestController - static class TextController { - - @GetMapping("/hello") - public String hello() { - return "hello world"; - } - - } - } diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java index 5d02e41b..6470beb6 100644 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java @@ -1,4 +1,4 @@ -package com.didispace.chapter37; +package com.didispace.chapter38; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java index fa4361e4..3bcfadc0 100644 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java @@ -2,6 +2,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; @@ -16,6 +18,7 @@ import javax.persistence.EntityManager; import javax.sql.DataSource; +import java.util.Map; @Configuration @EnableTransactionManagement @@ -29,6 +32,15 @@ public class PrimaryConfig { @Qualifier("primaryDataSource") private DataSource primaryDataSource; + @Autowired + private JpaProperties jpaProperties; + @Autowired + private HibernateProperties hibernateProperties; + + private Map getVendorProperties() { + return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()); + } + @Primary @Bean(name = "entityManagerPrimary") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { @@ -38,12 +50,13 @@ public EntityManager entityManager(EntityManagerFactoryBuilder builder) { @Primary @Bean(name = "entityManagerFactoryPrimary") public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) { - HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); - jpaVendorAdapter.setGenerateDdl(true); +// HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); +// jpaVendorAdapter.setGenerateDdl(true); return builder .dataSource(primaryDataSource) - .packages("com.didispace.domain.p") //设置实体类所在位置 + .packages("com.didispace.chapter38.p") //设置实体类所在位置 .persistenceUnit("primaryPersistenceUnit") + .properties(getVendorProperties()) .build(); } @@ -53,4 +66,5 @@ public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactory return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); } + } \ No newline at end of file diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java index 838ee6c2..7b8df6a3 100644 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java @@ -2,6 +2,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; @@ -28,6 +30,15 @@ public class SecondaryConfig { @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; + @Autowired + private JpaProperties jpaProperties; + @Autowired + private HibernateProperties hibernateProperties; + + private Map getVendorProperties() { + return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()); + } + @Bean(name = "entityManagerSecondary") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactorySecondary(builder).getObject().createEntityManager(); @@ -39,6 +50,7 @@ public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (Ent .dataSource(secondaryDataSource) .packages("com.didispace.chapter38.s") //设置实体类所在位置 .persistenceUnit("secondaryPersistenceUnit") + .properties(getVendorProperties()) .build(); } diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java index 63b1e429..83aaf3c9 100644 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java @@ -5,6 +5,7 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; import javax.persistence.Id; @Entity diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java index 84f5a90e..e91080e1 100644 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java @@ -5,18 +5,11 @@ import org.springframework.data.repository.query.Param; /** - * Created by 程序猿DD/翟永超 on 2020/2/15. + * Created by 程序猿DD/翟永超 on 2020/6/22. *

* Blog: http://blog.didispace.com/ * Github: https://github.com/dyc87112/ */ public interface UserRepository extends JpaRepository { - User findByName(String name); - - User findByNameAndAge(String name, Integer age); - - @Query("from User u where u.name=:name") - User findUser(@Param("name") String name); - } diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/User.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/Message.java similarity index 52% rename from 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/User.java rename to 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/Message.java index f3f55d35..956178b8 100644 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/User.java +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/Message.java @@ -1,26 +1,29 @@ package com.didispace.chapter38.s; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import javax.persistence.Entity; import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; import javax.persistence.Id; @Entity @Data @NoArgsConstructor -public class User { +public class Message { @Id @GeneratedValue private Long id; - private String name; - private Integer age; + private String title; + private String message; - public User(String name, Integer age) { - this.name = name; - this.age = age; + public Message(String title, String message) { + this.title = title; + this.message = message; } + } \ No newline at end of file diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/MessageRepository.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/MessageRepository.java new file mode 100644 index 00000000..13360488 --- /dev/null +++ b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/MessageRepository.java @@ -0,0 +1,14 @@ +package com.didispace.chapter38.s; + +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * Created by 程序猿DD/翟永超 on 2020/6/22. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface MessageRepository extends JpaRepository { + + +} diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/UserRepository.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/UserRepository.java deleted file mode 100644 index 6eb5e7e7..00000000 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/UserRepository.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.didispace.chapter38.s; - -import com.didispace.chapter38.p.User; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -/** - * Created by 程序猿DD/翟永超 on 2020/2/15. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -public interface UserRepository extends JpaRepository { - - com.didispace.chapter38.s.User findByName(String name); - - com.didispace.chapter38.s.User findByNameAndAge(String name, Integer age); - - @Query("from User u where u.name=:name") - com.didispace.chapter38.s.User findUser(@Param("name") String name); - -} diff --git a/2.1.x/chapter3-8/src/main/resources/application.properties b/2.1.x/chapter3-8/src/main/resources/application.properties index f62afca5..0d82f6cd 100644 --- a/2.1.x/chapter3-8/src/main/resources/application.properties +++ b/2.1.x/chapter3-8/src/main/resources/application.properties @@ -1,15 +1,16 @@ # pring boot 1.x的配置:spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1 spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1 spring.datasource.primary.username=root -spring.datasource.primary.password=123456 +spring.datasource.primary.password=12345678 spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver # spring boot 1.x的配置:spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2 spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2 spring.datasource.secondary.username=root -spring.datasource.secondary.password=123456 +spring.datasource.secondary.password=12345678 spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver -spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect +# 日志打印执行的SQL spring.jpa.show-sql=true -spring.jpa.hibernate.ddl-auto=create-drop \ No newline at end of file +# Hibernate的DDL策略 +spring.jpa.hibernate.ddl-auto=create-drop diff --git a/2.1.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java b/2.1.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java index 9cb1d7ef..9c9ef3e7 100644 --- a/2.1.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java +++ b/2.1.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java @@ -2,6 +2,8 @@ import com.didispace.chapter38.p.User; import com.didispace.chapter38.p.UserRepository; +import com.didispace.chapter38.s.Message; +import com.didispace.chapter38.s.MessageRepository; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.Test; @@ -17,39 +19,24 @@ public class Chapter38ApplicationTests { @Autowired private UserRepository userRepository; + @Autowired + private MessageRepository messageRepository; @Test public void test() throws Exception { - // 创建10条记录 - userRepository.save(new User("AAA", 10)); - userRepository.save(new User("BBB", 20)); - userRepository.save(new User("CCC", 30)); - userRepository.save(new User("DDD", 40)); - userRepository.save(new User("EEE", 50)); - userRepository.save(new User("FFF", 60)); - userRepository.save(new User("GGG", 70)); - userRepository.save(new User("HHH", 80)); - userRepository.save(new User("III", 90)); - userRepository.save(new User("JJJ", 100)); - - // 测试findAll, 查询所有记录 - Assert.assertEquals(10, userRepository.findAll().size()); - - // 测试findByName, 查询姓名为FFF的User - Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue()); - - // 测试findUser, 查询姓名为FFF的User - Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue()); - - // 测试findByNameAndAge, 查询姓名为FFF并且年龄为60的User - Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName()); + userRepository.save(new User("aaa", 10)); + userRepository.save(new User("bbb", 20)); + userRepository.save(new User("ccc", 30)); + userRepository.save(new User("ddd", 40)); + userRepository.save(new User("eee", 50)); - // 测试删除姓名为AAA的User - userRepository.delete(userRepository.findByName("AAA")); + Assert.assertEquals(5, userRepository.findAll().size()); - // 测试findAll, 查询所有记录, 验证上面的删除是否成功 - Assert.assertEquals(9, userRepository.findAll().size()); + messageRepository.save(new Message("o1", "aaaaaaaaaa")); + messageRepository.save(new Message("o2", "bbbbbbbbbb")); + messageRepository.save(new Message("o3", "cccccccccc")); + Assert.assertEquals(3, messageRepository.findAll().size()); } } From cc1771dd7b47fcba1fafdf3cc05877bdebbf5d85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 24 Jun 2020 12:30:07 +0800 Subject: [PATCH 009/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9AMyBatis=E7=9A=84=E5=A4=9A=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chapter39/Chapter39Application.java | 8 +-- .../chapter39/DataSourceConfiguration.java | 27 +++++++++ .../didispace/chapter39/PrimaryConfig.java | 39 ++++++++++++ .../didispace/chapter39/SecondaryConfig.java | 39 ++++++++++++ .../chapter39/mapper/UserMapper.java | 18 ------ .../User.java => p/entity/UserPrimary.java} | 6 +- .../chapter39/p/mapper/UserMapperPrimary.java | 26 ++++++++ .../chapter39/s/entity/UserSecondary.java | 20 +++++++ .../s/mapper/UserMapperSecondary.java | 25 ++++++++ .../src/main/resources/application.properties | 17 ++++-- .../{mapper => mapper.primary}/UserMapper.xml | 6 +- .../resources/mapper.secondary/UserMapper.xml | 16 +++++ .../chapter36/Chapter36ApplicationTests.java | 32 ---------- .../chapter39/Chapter39ApplicationTests.java | 60 +++++++++++++++++++ 14 files changed, 274 insertions(+), 65 deletions(-) create mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/DataSourceConfiguration.java create mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java create mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java delete mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/mapper/UserMapper.java rename 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/{entity/User.java => p/entity/UserPrimary.java} (63%) create mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/mapper/UserMapperPrimary.java create mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/entity/UserSecondary.java create mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/mapper/UserMapperSecondary.java rename 2.1.x/chapter3-9/src/main/resources/{mapper => mapper.primary}/UserMapper.xml (67%) create mode 100644 2.1.x/chapter3-9/src/main/resources/mapper.secondary/UserMapper.xml delete mode 100644 2.1.x/chapter3-9/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java create mode 100644 2.1.x/chapter3-9/src/test/java/com/didispace/chapter39/Chapter39ApplicationTests.java diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java index 2ce02b15..eb46b057 100644 --- a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java +++ b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java @@ -1,15 +1,13 @@ -package com.didispace.chapter36; +package com.didispace.chapter39; -import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@MapperScan("com.didispace.chapter36.mapper") @SpringBootApplication -public class Chapter36Application { +public class Chapter39Application { public static void main(String[] args) { - SpringApplication.run(Chapter36Application.class, args); + SpringApplication.run(Chapter39Application.class, args); } } diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/DataSourceConfiguration.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/DataSourceConfiguration.java new file mode 100644 index 00000000..6eaae095 --- /dev/null +++ b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/DataSourceConfiguration.java @@ -0,0 +1,27 @@ +package com.didispace.chapter39; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfiguration { + + @Primary + @Bean + @ConfigurationProperties(prefix = "spring.datasource.primary") + public DataSource primaryDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean + @ConfigurationProperties(prefix = "spring.datasource.secondary") + public DataSource secondaryDataSource() { + return DataSourceBuilder.create().build(); + } + +} diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java new file mode 100644 index 00000000..687cff8c --- /dev/null +++ b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java @@ -0,0 +1,39 @@ +package com.didispace.chapter39; + +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +@Configuration +@MapperScan( + basePackages = "com.didispace.chapter39.p", + sqlSessionFactoryRef = "sqlSessionFactoryPrimary", + sqlSessionTemplateRef = "sqlSessionTemplatePrimary") +public class PrimaryConfig { + + private DataSource primaryDataSource; + + public PrimaryConfig(@Qualifier("primaryDataSource") DataSource primaryDataSource) { + this.primaryDataSource = primaryDataSource; + } + + @Bean + public SqlSessionFactory sqlSessionFactoryPrimary() throws Exception { + SqlSessionFactory sessionFactory = null; + SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); + bean.setDataSource(primaryDataSource); + return bean.getObject(); + } + + @Bean + public SqlSessionTemplate sqlSessionTemplatePrimary() throws Exception { + return new SqlSessionTemplate(sqlSessionFactoryPrimary()); + } + +} \ No newline at end of file diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java new file mode 100644 index 00000000..4f03569b --- /dev/null +++ b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java @@ -0,0 +1,39 @@ +package com.didispace.chapter39; + +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +@Configuration +@MapperScan( + basePackages = "com.didispace.chapter39.s", + sqlSessionFactoryRef = "sqlSessionFactorySecondary", + sqlSessionTemplateRef = "sqlSessionTemplateSecondary") +public class SecondaryConfig { + + private DataSource secondaryDataSource; + + public SecondaryConfig(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) { + this.secondaryDataSource = secondaryDataSource; + } + + @Bean + public SqlSessionFactory sqlSessionFactorySecondary() throws Exception { + SqlSessionFactory sessionFactory = null; + SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); + bean.setDataSource(secondaryDataSource); + return bean.getObject(); + } + + @Bean + public SqlSessionTemplate sqlSessionTemplateSecondary() throws Exception { + return new SqlSessionTemplate(sqlSessionFactorySecondary()); + } + +} \ No newline at end of file diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/mapper/UserMapper.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/mapper/UserMapper.java deleted file mode 100644 index cd361f46..00000000 --- a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/mapper/UserMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.didispace.chapter36.mapper; - -import com.didispace.chapter36.entity.User; -import org.apache.ibatis.annotations.Param; - -/** - * Created by 程序猿DD/翟永超 on 2020/2/28. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -public interface UserMapper { - - User findByName(@Param("name") String name); - - int insert(@Param("name") String name, @Param("age") Integer age); - -} diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/entity/User.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/entity/UserPrimary.java similarity index 63% rename from 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/entity/User.java rename to 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/entity/UserPrimary.java index 6196ed6d..f4c2a299 100644 --- a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/entity/User.java +++ b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/entity/UserPrimary.java @@ -1,4 +1,4 @@ -package com.didispace.chapter36.entity; +package com.didispace.chapter39.p.entity; import lombok.Data; import lombok.NoArgsConstructor; @@ -6,14 +6,14 @@ @Data @NoArgsConstructor -public class User { +public class UserPrimary { private Long id; private String name; private Integer age; - public User(String name, Integer age) { + public UserPrimary(String name, Integer age) { this.name = name; this.age = age; } diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/mapper/UserMapperPrimary.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/mapper/UserMapperPrimary.java new file mode 100644 index 00000000..869ab546 --- /dev/null +++ b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/mapper/UserMapperPrimary.java @@ -0,0 +1,26 @@ +package com.didispace.chapter39.p.mapper; + +import com.didispace.chapter39.p.entity.UserPrimary; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * Created by 程序猿DD/翟永超 on 2020/2/28. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface UserMapperPrimary { + + @Select("SELECT * FROM USER WHERE NAME = #{name}") + UserPrimary findByName(@Param("name") String name); + + @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})") + int insert(@Param("name") String name, @Param("age") Integer age); + + @Delete("DELETE FROM USER") + int deleteAll(); + +} diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/entity/UserSecondary.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/entity/UserSecondary.java new file mode 100644 index 00000000..fdd64dff --- /dev/null +++ b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/entity/UserSecondary.java @@ -0,0 +1,20 @@ +package com.didispace.chapter39.s.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor +public class UserSecondary { + + private Long id; + + private String name; + private Integer age; + + public UserSecondary(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/mapper/UserMapperSecondary.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/mapper/UserMapperSecondary.java new file mode 100644 index 00000000..bb4b004c --- /dev/null +++ b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/mapper/UserMapperSecondary.java @@ -0,0 +1,25 @@ +package com.didispace.chapter39.s.mapper; + +import com.didispace.chapter39.s.entity.UserSecondary; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * Created by 程序猿DD/翟永超 on 2020/2/28. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface UserMapperSecondary { + + @Select("SELECT * FROM USER WHERE NAME = #{name}") + UserSecondary findByName(@Param("name") String name); + + @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})") + int insert(@Param("name") String name, @Param("age") Integer age); + + @Delete("DELETE FROM USER") + int deleteAll(); +} diff --git a/2.1.x/chapter3-9/src/main/resources/application.properties b/2.1.x/chapter3-9/src/main/resources/application.properties index ec5cde49..87777023 100644 --- a/2.1.x/chapter3-9/src/main/resources/application.properties +++ b/2.1.x/chapter3-9/src/main/resources/application.properties @@ -1,6 +1,13 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/test -spring.datasource.username=root -spring.datasource.password=12345678 -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +# pring boot 1.x的配置:spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1 +spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1 +spring.datasource.primary.username=root +spring.datasource.primary.password=12345678 +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver -mybatis.mapper-locations=classpath:mapper/*.xml +# spring boot 1.x的配置:spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2 +spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2 +spring.datasource.secondary.username=root +spring.datasource.secondary.password=12345678 +spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver + +#mybatis.mapper-locations=classpath:mapper/*.xml diff --git a/2.1.x/chapter3-9/src/main/resources/mapper/UserMapper.xml b/2.1.x/chapter3-9/src/main/resources/mapper.primary/UserMapper.xml similarity index 67% rename from 2.1.x/chapter3-9/src/main/resources/mapper/UserMapper.xml rename to 2.1.x/chapter3-9/src/main/resources/mapper.primary/UserMapper.xml index 520d290e..6eae360b 100644 --- a/2.1.x/chapter3-9/src/main/resources/mapper/UserMapper.xml +++ b/2.1.x/chapter3-9/src/main/resources/mapper.primary/UserMapper.xml @@ -2,12 +2,14 @@ - - SELECT * FROM USER WHERE NAME = #{name} INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age}) + \ No newline at end of file diff --git a/2.1.x/chapter3-9/src/main/resources/mapper.secondary/UserMapper.xml b/2.1.x/chapter3-9/src/main/resources/mapper.secondary/UserMapper.xml new file mode 100644 index 00000000..361cd16e --- /dev/null +++ b/2.1.x/chapter3-9/src/main/resources/mapper.secondary/UserMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age}) + + + \ No newline at end of file diff --git a/2.1.x/chapter3-9/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java b/2.1.x/chapter3-9/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java deleted file mode 100644 index aab8acb1..00000000 --- a/2.1.x/chapter3-9/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.didispace.chapter36; - -import com.didispace.chapter36.entity.User; -import com.didispace.chapter36.mapper.UserMapper; -import lombok.extern.slf4j.Slf4j; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; - -@Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest -@Transactional -public class Chapter36ApplicationTests { - - @Autowired - private UserMapper userMapper; - - @Test - @Rollback - public void test() throws Exception { - userMapper.insert("AAA", 20); - User u = userMapper.findByName("AAA"); - Assert.assertEquals(20, u.getAge().intValue()); - } - -} diff --git a/2.1.x/chapter3-9/src/test/java/com/didispace/chapter39/Chapter39ApplicationTests.java b/2.1.x/chapter3-9/src/test/java/com/didispace/chapter39/Chapter39ApplicationTests.java new file mode 100644 index 00000000..a1bd3a81 --- /dev/null +++ b/2.1.x/chapter3-9/src/test/java/com/didispace/chapter39/Chapter39ApplicationTests.java @@ -0,0 +1,60 @@ +package com.didispace.chapter39; + +import com.didispace.chapter39.p.entity.UserPrimary; +import com.didispace.chapter39.p.mapper.UserMapperPrimary; +import com.didispace.chapter39.s.entity.UserSecondary; +import com.didispace.chapter39.s.mapper.UserMapperSecondary; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +@Transactional +public class Chapter39ApplicationTests { + + @Autowired + private UserMapperPrimary userMapperPrimary; + @Autowired + private UserMapperSecondary userMapperSecondary; + + @Before + public void setUp() { + // 清空测试表,保证每次结果一样 + userMapperPrimary.deleteAll(); + userMapperSecondary.deleteAll(); + } + + @Test + public void test() throws Exception { + // 往Primary数据源插入一条数据 + userMapperPrimary.insert("AAA", 20); + + // 从Primary数据源查询刚才插入的数据,配置正确就可以查询到 + UserPrimary userPrimary = userMapperPrimary.findByName("AAA"); + Assert.assertEquals(20, userPrimary.getAge().intValue()); + + // 从Secondary数据源查询刚才插入的数据,配置正确应该是查询不到的 + UserSecondary userSecondary = userMapperSecondary.findByName("AAA"); + Assert.assertNull(userSecondary); + + // 往Secondary数据源插入一条数据 + userMapperSecondary.insert("BBB", 20); + + // 从Primary数据源查询刚才插入的数据,配置正确应该是查询不到的 + userPrimary = userMapperPrimary.findByName("BBB"); + Assert.assertNull(userPrimary); + + // 从Secondary数据源查询刚才插入的数据,配置正确就可以查询到 + userSecondary = userMapperSecondary.findByName("BBB"); + Assert.assertEquals(20, userSecondary.getAge().intValue()); + } + +} From c7e5aa242a7fbad221ef5df698275d75eb3928fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 24 Jun 2020 12:30:15 +0800 Subject: [PATCH 010/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9AMyBatis=E7=9A=84=E5=A4=9A=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.1.x/pom.xml b/2.1.x/pom.xml index 0af8de78..f645790e 100644 --- a/2.1.x/pom.xml +++ b/2.1.x/pom.xml @@ -29,6 +29,7 @@ chapter3-6 chapter3-7 chapter3-8 + chapter3-9 chapter4-1 From 388c338b1abe33f06c6e6452db346965fbfeb7e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 24 Jun 2020 12:53:33 +0800 Subject: [PATCH 011/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9AMyBatis=E7=9A=84=E5=A4=9A=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/didispace/chapter39/PrimaryConfig.java | 1 - .../src/main/java/com/didispace/chapter39/SecondaryConfig.java | 1 - 2 files changed, 2 deletions(-) diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java index 687cff8c..f6d1bbe5 100644 --- a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java +++ b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java @@ -25,7 +25,6 @@ public PrimaryConfig(@Qualifier("primaryDataSource") DataSource primaryDataSourc @Bean public SqlSessionFactory sqlSessionFactoryPrimary() throws Exception { - SqlSessionFactory sessionFactory = null; SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(primaryDataSource); return bean.getObject(); diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java index 4f03569b..bdb17fba 100644 --- a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java +++ b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java @@ -25,7 +25,6 @@ public SecondaryConfig(@Qualifier("secondaryDataSource") DataSource secondaryDat @Bean public SqlSessionFactory sqlSessionFactorySecondary() throws Exception { - SqlSessionFactory sessionFactory = null; SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(secondaryDataSource); return bean.getObject(); From a0fa87a0977323def08e4129e7449cb13ba7f980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 9 Jul 2020 13:09:18 +0800 Subject: [PATCH 012/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BA=8B=E5=8A=A1=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=85=A5=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/chapter3-10/.gitignore | 29 +++++++++ 2.1.x/chapter3-10/pom.xml | 64 +++++++++++++++++++ .../chapter310/Chapter310Application.java | 25 ++++++++ .../java/com/didispace/chapter310/User.java | 27 ++++++++ .../didispace/chapter310/UserRepository.java | 22 +++++++ .../src/main/resources/application.properties | 7 ++ .../Chapter310ApplicationTests.java | 56 ++++++++++++++++ 2.1.x/pom.xml | 14 +++- 8 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 2.1.x/chapter3-10/.gitignore create mode 100644 2.1.x/chapter3-10/pom.xml create mode 100644 2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/Chapter310Application.java create mode 100644 2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/User.java create mode 100644 2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/UserRepository.java create mode 100644 2.1.x/chapter3-10/src/main/resources/application.properties create mode 100644 2.1.x/chapter3-10/src/test/java/com/didispace/chapter310/Chapter310ApplicationTests.java diff --git a/2.1.x/chapter3-10/.gitignore b/2.1.x/chapter3-10/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.1.x/chapter3-10/.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/2.1.x/chapter3-10/pom.xml b/2.1.x/chapter3-10/pom.xml new file mode 100644 index 00000000..9b2abc07 --- /dev/null +++ b/2.1.x/chapter3-10/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-10 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/Chapter310Application.java b/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/Chapter310Application.java new file mode 100644 index 00000000..72a7dd3e --- /dev/null +++ b/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/Chapter310Application.java @@ -0,0 +1,25 @@ +package com.didispace.chapter310; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +public class Chapter310Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter310Application.class, args); + } + + @RestController + static class TextController { + + @GetMapping("/hello") + public String hello() { + return "hello world"; + } + + } + +} diff --git a/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/User.java b/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/User.java new file mode 100644 index 00000000..a2347ea8 --- /dev/null +++ b/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/User.java @@ -0,0 +1,27 @@ +package com.didispace.chapter310; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import javax.validation.constraints.Max; + +@Entity +@Data +@NoArgsConstructor +public class User { + + @Id + @GeneratedValue + private Long id; + + private String name; + @Max(50) + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } + +} \ No newline at end of file diff --git a/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/UserRepository.java b/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/UserRepository.java new file mode 100644 index 00000000..366e1d21 --- /dev/null +++ b/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/UserRepository.java @@ -0,0 +1,22 @@ +package com.didispace.chapter310; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/7/9. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface UserRepository extends JpaRepository { + + User findByName(String name); + + User findByNameAndAge(String name, Integer age); + + @Query("from User u where u.name=:name") + User findUser(@Param("name") String name); + +} diff --git a/2.1.x/chapter3-10/src/main/resources/application.properties b/2.1.x/chapter3-10/src/main/resources/application.properties new file mode 100644 index 00000000..7238387a --- /dev/null +++ b/2.1.x/chapter3-10/src/main/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=12345678 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.hibernate.ddl-auto=create diff --git a/2.1.x/chapter3-10/src/test/java/com/didispace/chapter310/Chapter310ApplicationTests.java b/2.1.x/chapter3-10/src/test/java/com/didispace/chapter310/Chapter310ApplicationTests.java new file mode 100644 index 00000000..02fee65b --- /dev/null +++ b/2.1.x/chapter3-10/src/test/java/com/didispace/chapter310/Chapter310ApplicationTests.java @@ -0,0 +1,56 @@ +package com.didispace.chapter310; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; + + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter310ApplicationTests { + + @Autowired + private UserRepository userRepository; + + @Test + @Transactional + public void test() throws Exception { + // 创建10条记录 + userRepository.save(new User("AAA", 10)); + userRepository.save(new User("BBB", 20)); + userRepository.save(new User("CCC", 30)); + userRepository.save(new User("DDD", 40)); + userRepository.save(new User("EEE", 50)); + userRepository.save(new User("FFF", 60)); + userRepository.save(new User("GGG", 70)); + userRepository.save(new User("HHH", 80)); + userRepository.save(new User("III", 90)); + userRepository.save(new User("JJJ", 100)); + + // 测试findAll, 查询所有记录 + Assert.assertEquals(10, userRepository.findAll().size()); + + // 测试findByName, 查询姓名为FFF的User + Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue()); + + // 测试findUser, 查询姓名为FFF的User + Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue()); + + // 测试findByNameAndAge, 查询姓名为FFF并且年龄为60的User + Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName()); + + // 测试删除姓名为AAA的User + userRepository.delete(userRepository.findByName("AAA")); + + // 测试findAll, 查询所有记录, 验证上面的删除是否成功 + Assert.assertEquals(9, userRepository.findAll().size()); + + } + +} diff --git a/2.1.x/pom.xml b/2.1.x/pom.xml index f645790e..cb088f5b 100644 --- a/2.1.x/pom.xml +++ b/2.1.x/pom.xml @@ -20,7 +20,7 @@ chapter2-5 chapter2-6 - + chapter3-1 chapter3-2 chapter3-3 @@ -30,11 +30,23 @@ chapter3-7 chapter3-8 chapter3-9 + chapter3-10 + + + chapter4-1 chapter4-2 + + + + + + + + From c0bd348858699aa191f06a126fe932929e232c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 9 Jul 2020 13:10:56 +0800 Subject: [PATCH 013/160] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/README.md | 7 ++++--- 2.1.x/README_zh.md | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/2.1.x/README.md b/2.1.x/README.md index 9bada33c..507fbc26 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -86,9 +86,10 @@ - [Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL](http://blog.didispace.com/spring-boot-learning-21-3-4/) - [Spring Boot 2.x基础教程:使用MyBatis访问MySQL](http://blog.didispace.com/spring-boot-learning-21-3-5/) - [Spring Boot 2.x基础教程:使用MyBatis的XML配置方式](http://blog.didispace.com/spring-boot-learning-21-3-6/) - -- [Spring Boot 2.x基础教程:多数据源配置] -- [Spring Boot 2.x基础教程:数据库管理Flyway] +- [Spring Boot 2.x基础教程:JdbcTemplate的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-7/) +- [Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-8/) +- [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) +- [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) **其他数据存储** diff --git a/2.1.x/README_zh.md b/2.1.x/README_zh.md index b01138aa..b46ad2d9 100644 --- a/2.1.x/README_zh.md +++ b/2.1.x/README_zh.md @@ -81,9 +81,10 @@ - [Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL](http://blog.didispace.com/spring-boot-learning-21-3-4/) - [Spring Boot 2.x基础教程:使用MyBatis访问MySQL](http://blog.didispace.com/spring-boot-learning-21-3-5/) - [Spring Boot 2.x基础教程:使用MyBatis的XML配置方式](http://blog.didispace.com/spring-boot-learning-21-3-6/) - -- [Spring Boot 2.x基础教程:多数据源配置] -- [Spring Boot 2.x基础教程:数据库管理Flyway] +- [Spring Boot 2.x基础教程:JdbcTemplate的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-7/) +- [Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-8/) +- [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) +- [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) **其他数据存储** From fb4c73975f1d373ce66c8dd63cbf9b341fff98ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Tue, 14 Jul 2020 09:58:19 +0800 Subject: [PATCH 014/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E8=BF=9B=E7=A8=8B=E5=86=85=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E7=9A=84=E4=BD=BF=E7=94=A8=E4=B8=8ECache=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=E8=AF=A6=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/chapter5-1/.gitignore | 29 ++++++++ 2.1.x/chapter5-1/pom.xml | 69 +++++++++++++++++++ .../chapter51/Chapter51Application.java | 15 ++++ .../java/com/didispace/chapter51/User.java | 26 +++++++ .../didispace/chapter51/UserRepository.java | 26 +++++++ .../src/main/resources/application.properties | 7 ++ .../chapter51/Chapter51ApplicationTests.java | 34 +++++++++ 2.1.x/pom.xml | 20 +++--- 8 files changed, 217 insertions(+), 9 deletions(-) create mode 100644 2.1.x/chapter5-1/.gitignore create mode 100644 2.1.x/chapter5-1/pom.xml create mode 100644 2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/Chapter51Application.java create mode 100644 2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/User.java create mode 100644 2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/UserRepository.java create mode 100644 2.1.x/chapter5-1/src/main/resources/application.properties create mode 100644 2.1.x/chapter5-1/src/test/java/com/didispace/chapter51/Chapter51ApplicationTests.java diff --git a/2.1.x/chapter5-1/.gitignore b/2.1.x/chapter5-1/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.1.x/chapter5-1/.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/2.1.x/chapter5-1/pom.xml b/2.1.x/chapter5-1/pom.xml new file mode 100644 index 00000000..2af64776 --- /dev/null +++ b/2.1.x/chapter5-1/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter5-1 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-cache + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/Chapter51Application.java b/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/Chapter51Application.java new file mode 100644 index 00000000..b855c592 --- /dev/null +++ b/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/Chapter51Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter51; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; + +@EnableCaching +@SpringBootApplication +public class Chapter51Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter51Application.class, args); + } + +} diff --git a/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/User.java b/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/User.java new file mode 100644 index 00000000..55ae4a76 --- /dev/null +++ b/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/User.java @@ -0,0 +1,26 @@ +package com.didispace.chapter51; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +@Data +@NoArgsConstructor +public class User { + + @Id + @GeneratedValue + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/UserRepository.java b/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/UserRepository.java new file mode 100644 index 00000000..2785e7ae --- /dev/null +++ b/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/UserRepository.java @@ -0,0 +1,26 @@ +package com.didispace.chapter51; + +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/7/13. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +@CacheConfig(cacheNames = "users") +public interface UserRepository extends JpaRepository { + + @Cacheable + User findByName(String name); + + User findByNameAndAge(String name, Integer age); + + @Query("from User u where u.name=:name") + User findUser(@Param("name") String name); + +} diff --git a/2.1.x/chapter5-1/src/main/resources/application.properties b/2.1.x/chapter5-1/src/main/resources/application.properties new file mode 100644 index 00000000..ba1e5990 --- /dev/null +++ b/2.1.x/chapter5-1/src/main/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=12345678 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=create-drop \ No newline at end of file diff --git a/2.1.x/chapter5-1/src/test/java/com/didispace/chapter51/Chapter51ApplicationTests.java b/2.1.x/chapter5-1/src/test/java/com/didispace/chapter51/Chapter51ApplicationTests.java new file mode 100644 index 00000000..3d4dabbd --- /dev/null +++ b/2.1.x/chapter5-1/src/test/java/com/didispace/chapter51/Chapter51ApplicationTests.java @@ -0,0 +1,34 @@ +package com.didispace.chapter51; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cache.CacheManager; +import org.springframework.test.context.junit4.SpringRunner; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter51ApplicationTests { + + @Autowired + private UserRepository userRepository; + + @Autowired + private CacheManager cacheManager; + + @Test + public void test() throws Exception { + // 创建1条记录 + userRepository.save(new User("AAA", 10)); + + User u1 = userRepository.findByName("AAA"); + System.out.println("第一次查询:" + u1.getAge()); + + User u2 = userRepository.findByName("AAA"); + System.out.println("第二次查询:" + u2.getAge()); + } + +} diff --git a/2.1.x/pom.xml b/2.1.x/pom.xml index cb088f5b..79e0649c 100644 --- a/2.1.x/pom.xml +++ b/2.1.x/pom.xml @@ -31,20 +31,22 @@ chapter3-8 chapter3-9 chapter3-10 - - - + + + chapter4-1 chapter4-2 - - - - - - + + chapter5-1 + + + + + + From b6e21fb210e772a1d40fc6870ac3001f33429715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 15 Jul 2020 11:27:32 +0800 Subject: [PATCH 015/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9AEhCache=E7=BC=93=E5=AD=98=E7=9A=84?= =?UTF-8?q?=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/chapter5-2/.gitignore | 29 ++++++++ 2.1.x/chapter5-2/pom.xml | 74 +++++++++++++++++++ .../chapter52/Chapter52Application.java | 15 ++++ .../java/com/didispace/chapter52/User.java | 26 +++++++ .../didispace/chapter52/UserRepository.java | 21 ++++++ .../src/main/resources/application.properties | 7 ++ .../chapter5-2/src/main/resources/ehcache.xml | 9 +++ .../chapter52/Chapter52ApplicationTests.java | 36 +++++++++ 2.1.x/pom.xml | 1 + 9 files changed, 218 insertions(+) create mode 100644 2.1.x/chapter5-2/.gitignore create mode 100644 2.1.x/chapter5-2/pom.xml create mode 100644 2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/Chapter52Application.java create mode 100644 2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/User.java create mode 100644 2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/UserRepository.java create mode 100644 2.1.x/chapter5-2/src/main/resources/application.properties create mode 100644 2.1.x/chapter5-2/src/main/resources/ehcache.xml create mode 100644 2.1.x/chapter5-2/src/test/java/com/didispace/chapter52/Chapter52ApplicationTests.java diff --git a/2.1.x/chapter5-2/.gitignore b/2.1.x/chapter5-2/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.1.x/chapter5-2/.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/2.1.x/chapter5-2/pom.xml b/2.1.x/chapter5-2/pom.xml new file mode 100644 index 00000000..bb82477e --- /dev/null +++ b/2.1.x/chapter5-2/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter5-2 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-cache + + + + net.sf.ehcache + ehcache + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/Chapter52Application.java b/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/Chapter52Application.java new file mode 100644 index 00000000..e4842885 --- /dev/null +++ b/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/Chapter52Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter52; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; + +@EnableCaching +@SpringBootApplication +public class Chapter52Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter52Application.class, args); + } + +} diff --git a/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/User.java b/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/User.java new file mode 100644 index 00000000..9fb641f0 --- /dev/null +++ b/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/User.java @@ -0,0 +1,26 @@ +package com.didispace.chapter52; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +@Data +@NoArgsConstructor +public class User { + + @Id + @GeneratedValue + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/UserRepository.java b/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/UserRepository.java new file mode 100644 index 00000000..4dad3d06 --- /dev/null +++ b/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/UserRepository.java @@ -0,0 +1,21 @@ +package com.didispace.chapter52; + +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/7/14. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +@CacheConfig(cacheNames = "users") +public interface UserRepository extends JpaRepository { + + @Cacheable + User findByName(String name); + +} diff --git a/2.1.x/chapter5-2/src/main/resources/application.properties b/2.1.x/chapter5-2/src/main/resources/application.properties new file mode 100644 index 00000000..ba1e5990 --- /dev/null +++ b/2.1.x/chapter5-2/src/main/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=12345678 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=create-drop \ No newline at end of file diff --git a/2.1.x/chapter5-2/src/main/resources/ehcache.xml b/2.1.x/chapter5-2/src/main/resources/ehcache.xml new file mode 100644 index 00000000..c178cc9f --- /dev/null +++ b/2.1.x/chapter5-2/src/main/resources/ehcache.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/2.1.x/chapter5-2/src/test/java/com/didispace/chapter52/Chapter52ApplicationTests.java b/2.1.x/chapter5-2/src/test/java/com/didispace/chapter52/Chapter52ApplicationTests.java new file mode 100644 index 00000000..76c505c9 --- /dev/null +++ b/2.1.x/chapter5-2/src/test/java/com/didispace/chapter52/Chapter52ApplicationTests.java @@ -0,0 +1,36 @@ +package com.didispace.chapter52; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cache.CacheManager; +import org.springframework.test.context.junit4.SpringRunner; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter52ApplicationTests { + + @Autowired + private UserRepository userRepository; + + @Autowired + private CacheManager cacheManager; + + @Test + public void test() throws Exception { + System.out.println("CacheManager type : " + cacheManager.getClass()); + + // 创建1条记录 + userRepository.save(new User("AAA", 10)); + + User u1 = userRepository.findByName("AAA"); + System.out.println("第一次查询:" + u1.getAge()); + + User u2 = userRepository.findByName("AAA"); + System.out.println("第二次查询:" + u2.getAge()); + } + +} diff --git a/2.1.x/pom.xml b/2.1.x/pom.xml index 79e0649c..0940c488 100644 --- a/2.1.x/pom.xml +++ b/2.1.x/pom.xml @@ -41,6 +41,7 @@ chapter5-1 + chapter5-2 From 0b625fb0b381a1d2d7064596ff36ed7f6456217b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 16 Jul 2020 11:32:49 +0800 Subject: [PATCH 016/160] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/README.md | 8 +++----- 2.1.x/README_zh.md | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/2.1.x/README.md b/2.1.x/README.md index 507fbc26..9451b857 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -91,12 +91,10 @@ - [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) - [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) -**其他数据存储** +**加速利器:各种缓存的使用** -- [Spring Boot 2.x基础教程:使用Redis] -- [Spring Boot 2.x基础教程:使用MongoDB] -- [Spring Boot 2.x基础教程:使用ElasticSearch] -- [Spring Boot 2.x基础教程:使用LDAP] +- [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) +- [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) ### Web开发 diff --git a/2.1.x/README_zh.md b/2.1.x/README_zh.md index b46ad2d9..329edeef 100644 --- a/2.1.x/README_zh.md +++ b/2.1.x/README_zh.md @@ -86,12 +86,10 @@ - [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) - [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) -**其他数据存储** +**加速利器:各种缓存的使用** -- [Spring Boot 2.x基础教程:使用Redis] -- [Spring Boot 2.x基础教程:使用MongoDB] -- [Spring Boot 2.x基础教程:使用ElasticSearch] -- [Spring Boot 2.x基础教程:使用LDAP] +- [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) +- [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) ### Web开发 From 0c4a3afc96ada1eda8196e55b2e50833d0974c3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 16 Jul 2020 16:35:00 +0800 Subject: [PATCH 017/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8EhCache=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E9=9B=86=E7=BE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/chapter5-3/.gitignore | 29 ++++++++ 2.1.x/chapter5-3/pom.xml | 74 +++++++++++++++++++ .../chapter53/Chapter53Application.java | 50 +++++++++++++ .../java/com/didispace/chapter53/User.java | 27 +++++++ .../didispace/chapter53/UserRepository.java | 21 ++++++ .../src/main/resources/application.properties | 15 ++++ .../src/main/resources/ehcache-1.xml | 25 +++++++ .../src/main/resources/ehcache-2.xml | 24 ++++++ .../chapter53/Chapter53ApplicationTests.java | 36 +++++++++ 9 files changed, 301 insertions(+) create mode 100644 2.1.x/chapter5-3/.gitignore create mode 100644 2.1.x/chapter5-3/pom.xml create mode 100644 2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/Chapter53Application.java create mode 100644 2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/User.java create mode 100644 2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/UserRepository.java create mode 100644 2.1.x/chapter5-3/src/main/resources/application.properties create mode 100644 2.1.x/chapter5-3/src/main/resources/ehcache-1.xml create mode 100644 2.1.x/chapter5-3/src/main/resources/ehcache-2.xml create mode 100644 2.1.x/chapter5-3/src/test/java/com/didispace/chapter53/Chapter53ApplicationTests.java diff --git a/2.1.x/chapter5-3/.gitignore b/2.1.x/chapter5-3/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.1.x/chapter5-3/.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/2.1.x/chapter5-3/pom.xml b/2.1.x/chapter5-3/pom.xml new file mode 100644 index 00000000..c0bb21fd --- /dev/null +++ b/2.1.x/chapter5-3/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter5-3 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-cache + + + + net.sf.ehcache + ehcache + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/Chapter53Application.java b/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/Chapter53Application.java new file mode 100644 index 00000000..3abe9f33 --- /dev/null +++ b/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/Chapter53Application.java @@ -0,0 +1,50 @@ +package com.didispace.chapter53; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.rmi.registry.LocateRegistry; + +@EnableCaching +@SpringBootApplication +public class Chapter53Application { + + public static void main(String[] args) throws Exception { +// LocateRegistry.createRegistry(Integer.valueOf(System.getProperty("rmi.port"))); + SpringApplication.run(Chapter53Application.class, args); + } + + @RestController + static class HelloController { + + @Autowired + private UserRepository userRepository; + + @GetMapping("/create") + public void create() { + userRepository.save(new User("AAA", 10)); + } + + @GetMapping("/update") + public User update() { + User u1 = userRepository.findByName("AAA"); + u1.setAge(20); + u1 = userRepository.save(u1); + return u1; + } + + @GetMapping("/find") + public User find() { + User u1 = userRepository.findByName("AAA"); + System.out.println("查询AAA用户:" + u1.getAge()); + return u1; + } + + } + +} diff --git a/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/User.java b/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/User.java new file mode 100644 index 00000000..2986b7d4 --- /dev/null +++ b/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/User.java @@ -0,0 +1,27 @@ +package com.didispace.chapter53; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import java.io.Serializable; + +@Entity +@Data +@NoArgsConstructor +public class User implements Serializable { + + @Id + @GeneratedValue + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} diff --git a/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/UserRepository.java b/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/UserRepository.java new file mode 100644 index 00000000..4d52745e --- /dev/null +++ b/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/UserRepository.java @@ -0,0 +1,21 @@ +package com.didispace.chapter53; + +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/7/16. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +@CacheConfig(cacheNames = "users") +public interface UserRepository extends JpaRepository { + + @Cacheable + User findByName(String name); + +} diff --git a/2.1.x/chapter5-3/src/main/resources/application.properties b/2.1.x/chapter5-3/src/main/resources/application.properties new file mode 100644 index 00000000..7ad81182 --- /dev/null +++ b/2.1.x/chapter5-3/src/main/resources/application.properties @@ -0,0 +1,15 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=12345678 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=create + +# 不同实例的配置 +#spring.cache.ehcache.config=classpath:ehcache-1.xml +#spring.cache.ehcache.config=classpath:ehcache-2.xml + +# 用不同命令启动不同实例 +# -Dspring.cache.ehcache.config=classpath:ehcache-1.xml +# -Dspring.cache.ehcache.config=classpath:ehcache-2.xml diff --git a/2.1.x/chapter5-3/src/main/resources/ehcache-1.xml b/2.1.x/chapter5-3/src/main/resources/ehcache-1.xml new file mode 100644 index 00000000..d113fbbb --- /dev/null +++ b/2.1.x/chapter5-3/src/main/resources/ehcache-1.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/2.1.x/chapter5-3/src/main/resources/ehcache-2.xml b/2.1.x/chapter5-3/src/main/resources/ehcache-2.xml new file mode 100644 index 00000000..b0fc10e9 --- /dev/null +++ b/2.1.x/chapter5-3/src/main/resources/ehcache-2.xml @@ -0,0 +1,24 @@ + + + + + + + + + \ No newline at end of file diff --git a/2.1.x/chapter5-3/src/test/java/com/didispace/chapter53/Chapter53ApplicationTests.java b/2.1.x/chapter5-3/src/test/java/com/didispace/chapter53/Chapter53ApplicationTests.java new file mode 100644 index 00000000..0e9c2939 --- /dev/null +++ b/2.1.x/chapter5-3/src/test/java/com/didispace/chapter53/Chapter53ApplicationTests.java @@ -0,0 +1,36 @@ +package com.didispace.chapter53; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cache.CacheManager; +import org.springframework.test.context.junit4.SpringRunner; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter53ApplicationTests { + + @Autowired + private UserRepository userRepository; + + @Autowired + private CacheManager cacheManager; + + @Test + public void test() throws Exception { + System.out.println("CacheManager type : " + cacheManager.getClass()); + + // 创建1条记录 + userRepository.save(new User("AAA", 10)); + + User u1 = userRepository.findByName("AAA"); + System.out.println("第一次查询:" + u1.getAge()); + + User u2 = userRepository.findByName("AAA"); + System.out.println("第二次查询:" + u2.getAge()); + } + +} From 9ccc10e127b764a911bb6d529da9d30ce73b74cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 16 Jul 2020 16:38:08 +0800 Subject: [PATCH 018/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8EhCache=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E9=9B=86=E7=BE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/README.md | 1 + 2.1.x/README_zh.md | 1 + 2.1.x/pom.xml | 1 + 3 files changed, 3 insertions(+) diff --git a/2.1.x/README.md b/2.1.x/README.md index 9451b857..d167afb9 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -95,6 +95,7 @@ - [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) - [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) +- [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) ### Web开发 diff --git a/2.1.x/README_zh.md b/2.1.x/README_zh.md index 329edeef..c57fe794 100644 --- a/2.1.x/README_zh.md +++ b/2.1.x/README_zh.md @@ -90,6 +90,7 @@ - [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) - [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) +- [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) ### Web开发 diff --git a/2.1.x/pom.xml b/2.1.x/pom.xml index 0940c488..53a916ce 100644 --- a/2.1.x/pom.xml +++ b/2.1.x/pom.xml @@ -42,6 +42,7 @@ chapter5-1 chapter5-2 + chapter5-3 From f65e3e051eac65a4c0af31adc839c1ee7a0062b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 16 Jul 2020 17:55:50 +0800 Subject: [PATCH 019/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8EhCache=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E9=9B=86=E7=BE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.properties | 6 ++++-- 2.1.x/chapter5-3/src/main/resources/ehcache-1.xml | 10 +++++++--- 2.1.x/chapter5-3/src/main/resources/ehcache-2.xml | 9 +++++++-- 2.1.x/pom.xml | 1 + 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/2.1.x/chapter5-3/src/main/resources/application.properties b/2.1.x/chapter5-3/src/main/resources/application.properties index 7ad81182..43e74c79 100644 --- a/2.1.x/chapter5-3/src/main/resources/application.properties +++ b/2.1.x/chapter5-3/src/main/resources/application.properties @@ -6,10 +6,12 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=create +#logging.level.net.sf.ehcache=debug + # 不同实例的配置 #spring.cache.ehcache.config=classpath:ehcache-1.xml #spring.cache.ehcache.config=classpath:ehcache-2.xml # 用不同命令启动不同实例 -# -Dspring.cache.ehcache.config=classpath:ehcache-1.xml -# -Dspring.cache.ehcache.config=classpath:ehcache-2.xml +#-Dserver.port=8001 -Dspring.cache.ehcache.config=classpath:ehcache-1.xml +#-Dserver.port=8002 -Dspring.cache.ehcache.config=classpath:ehcache-2.xml diff --git a/2.1.x/chapter5-3/src/main/resources/ehcache-1.xml b/2.1.x/chapter5-3/src/main/resources/ehcache-1.xml index d113fbbb..fbc88162 100644 --- a/2.1.x/chapter5-3/src/main/resources/ehcache-1.xml +++ b/2.1.x/chapter5-3/src/main/resources/ehcache-1.xml @@ -1,10 +1,11 @@ + + - + + + rmiUrls=//10.10.0.102:40001/users" /> \ No newline at end of file diff --git a/2.1.x/chapter5-3/src/main/resources/ehcache-2.xml b/2.1.x/chapter5-3/src/main/resources/ehcache-2.xml index b0fc10e9..878b6be2 100644 --- a/2.1.x/chapter5-3/src/main/resources/ehcache-2.xml +++ b/2.1.x/chapter5-3/src/main/resources/ehcache-2.xml @@ -1,6 +1,8 @@ + + @@ -11,14 +13,17 @@ replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true "/> + + + rmiUrls=//10.10.0.101:40001/users" /> \ No newline at end of file diff --git a/2.1.x/pom.xml b/2.1.x/pom.xml index 53a916ce..39b9ee7a 100644 --- a/2.1.x/pom.xml +++ b/2.1.x/pom.xml @@ -43,6 +43,7 @@ chapter5-1 chapter5-2 chapter5-3 + From 71fa1bc963d44cf85977bdc361df2de22d90b958 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 16 Jul 2020 20:53:20 +0800 Subject: [PATCH 020/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8SpringFox3?= =?UTF-8?q?=E7=94=9F=E6=88=90Swagger=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/chapter2-7/.gitignore | 24 +++++++ 2.1.x/chapter2-7/pom.xml | 67 +++++++++++++++++++ .../chapter27/Chapter27Application.java | 15 +++++ .../java/com/didispace/chapter27/User.java | 29 ++++++++ .../didispace/chapter27/UserController.java | 45 +++++++++++++ .../src/main/resources/application.properties | 2 + 2.1.x/pom.xml | 15 +++-- 7 files changed, 191 insertions(+), 6 deletions(-) create mode 100644 2.1.x/chapter2-7/.gitignore create mode 100644 2.1.x/chapter2-7/pom.xml create mode 100644 2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/Chapter27Application.java create mode 100644 2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/User.java create mode 100644 2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/UserController.java create mode 100644 2.1.x/chapter2-7/src/main/resources/application.properties diff --git a/2.1.x/chapter2-7/.gitignore b/2.1.x/chapter2-7/.gitignore new file mode 100644 index 00000000..2af7cefb --- /dev/null +++ b/2.1.x/chapter2-7/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/2.1.x/chapter2-7/pom.xml b/2.1.x/chapter2-7/pom.xml new file mode 100644 index 00000000..882a8176 --- /dev/null +++ b/2.1.x/chapter2-7/pom.xml @@ -0,0 +1,67 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.2.3.RELEASE + + + + com.didispace + chapter2-7 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + io.springfox + springfox-boot-starter + 3.0.0 + + + + org.projectlombok + lombok + provided + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + + false + + jcenter-releases + jcenter + http://jcenter.bintray.com + + + + diff --git a/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/Chapter27Application.java b/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/Chapter27Application.java new file mode 100644 index 00000000..7a6a667b --- /dev/null +++ b/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/Chapter27Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter27; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import springfox.documentation.oas.annotations.EnableOpenApi; + +@EnableOpenApi +@SpringBootApplication +public class Chapter27Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter27Application.class, args); + } + +} diff --git a/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/User.java b/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/User.java new file mode 100644 index 00000000..25c99ae8 --- /dev/null +++ b/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/User.java @@ -0,0 +1,29 @@ +package com.didispace.demo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("用户基本信息") +public class User { + + @ApiModelProperty("姓名") + @Size(max = 20) + private String name; + @ApiModelProperty("年龄") + @Max(150) + @Min(1) + private Integer age; + @NotNull + private String address; + @Pattern(regexp = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$") + private String email; + +} \ No newline at end of file diff --git a/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/UserController.java b/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/UserController.java new file mode 100644 index 00000000..fcfb546d --- /dev/null +++ b/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/UserController.java @@ -0,0 +1,45 @@ +package com.didispace.demo; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; + +@Api(tags="用户管理") +@RestController +public class UserController { + + @ApiOperation("创建用户") + @PostMapping("/users") + public User create(@RequestBody @Valid User user) { + return user; + } + + @ApiOperation("用户详情") + @GetMapping("/users/{id}") + public User findById(@PathVariable Long id) { + return new User("bbb", 21, "上海", "aaa@bbb.com"); + } + + @ApiOperation("用户列表") + @GetMapping("/users") + public List list(@ApiParam("查看第几页") @RequestParam int pageIndex, + @ApiParam("每页多少条") @RequestParam int pageSize) { + List result = new ArrayList<>(); + result.add(new User("aaa", 50, "北京", "aaa@ccc.com")); + result.add(new User("bbb", 21, "广州", "aaa@ddd.com")); + return result; + } + + @ApiIgnore + @DeleteMapping("/users/{id}") + public String deleteById(@PathVariable Long id) { + return "delete user : " + id; + } + +} \ No newline at end of file diff --git a/2.1.x/chapter2-7/src/main/resources/application.properties b/2.1.x/chapter2-7/src/main/resources/application.properties new file mode 100644 index 00000000..d910c856 --- /dev/null +++ b/2.1.x/chapter2-7/src/main/resources/application.properties @@ -0,0 +1,2 @@ +logging.level.org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping=trace + diff --git a/2.1.x/pom.xml b/2.1.x/pom.xml index 39b9ee7a..9646d1a7 100644 --- a/2.1.x/pom.xml +++ b/2.1.x/pom.xml @@ -13,12 +13,14 @@ chapter1-1 - chapter2-1 - chapter2-2 - chapter2-3 - chapter2-4 - chapter2-5 - chapter2-6 + chapter2-1 + chapter2-2 + chapter2-3 + chapter2-4 + chapter2-5 + chapter2-6 + chapter2-7 + chapter3-1 @@ -44,6 +46,7 @@ chapter5-2 chapter5-3 + From fc7fb95f81e9d7fe6d6f5ce03d36ec5fada43086 Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Sun, 26 Jul 2020 15:36:23 +0800 Subject: [PATCH 021/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8=E9=9B=86=E4=B8=AD?= =?UTF-8?q?=E5=BC=8F=E7=BC=93=E5=AD=98Redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/chapter5-4/.gitignore | 29 ++++++++ 2.1.x/chapter5-4/pom.xml | 69 +++++++++++++++++++ .../chapter54/Chapter54Application.java | 15 ++++ .../java/com/didispace/chapter54/User.java | 27 ++++++++ .../didispace/chapter54/UserRepository.java | 26 +++++++ .../src/main/resources/application.properties | 8 +++ .../chapter54/Chapter54ApplicationTests.java | 34 +++++++++ 7 files changed, 208 insertions(+) create mode 100644 2.1.x/chapter5-4/.gitignore create mode 100644 2.1.x/chapter5-4/pom.xml create mode 100644 2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/Chapter54Application.java create mode 100644 2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/User.java create mode 100644 2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/UserRepository.java create mode 100644 2.1.x/chapter5-4/src/main/resources/application.properties create mode 100644 2.1.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java diff --git a/2.1.x/chapter5-4/.gitignore b/2.1.x/chapter5-4/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.1.x/chapter5-4/.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/2.1.x/chapter5-4/pom.xml b/2.1.x/chapter5-4/pom.xml new file mode 100644 index 00000000..04b4b50f --- /dev/null +++ b/2.1.x/chapter5-4/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter5-4 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/Chapter54Application.java b/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/Chapter54Application.java new file mode 100644 index 00000000..f2789f8b --- /dev/null +++ b/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/Chapter54Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter54; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; + +@EnableCaching +@SpringBootApplication +public class Chapter54Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter54Application.class, args); + } + +} diff --git a/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/User.java b/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/User.java new file mode 100644 index 00000000..11e2dc13 --- /dev/null +++ b/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/User.java @@ -0,0 +1,27 @@ +package com.didispace.chapter54; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import java.io.Serializable; + +@Entity +@Data +@NoArgsConstructor +public class User implements Serializable { + + @Id + @GeneratedValue + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/UserRepository.java b/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/UserRepository.java new file mode 100644 index 00000000..4b14b113 --- /dev/null +++ b/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/UserRepository.java @@ -0,0 +1,26 @@ +package com.didispace.chapter54; + +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/7/26. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +@CacheConfig(cacheNames = "users") +public interface UserRepository extends JpaRepository { + + @Cacheable + User findByName(String name); + + User findByNameAndAge(String name, Integer age); + + @Query("from User u where u.name=:name") + User findUser(@Param("name") String name); + +} diff --git a/2.1.x/chapter5-4/src/main/resources/application.properties b/2.1.x/chapter5-4/src/main/resources/application.properties new file mode 100644 index 00000000..2b650ce3 --- /dev/null +++ b/2.1.x/chapter5-4/src/main/resources/application.properties @@ -0,0 +1,8 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password= +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=create-drop + diff --git a/2.1.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java b/2.1.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java new file mode 100644 index 00000000..37acba9f --- /dev/null +++ b/2.1.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java @@ -0,0 +1,34 @@ +package com.didispace.chapter54; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cache.CacheManager; +import org.springframework.test.context.junit4.SpringRunner; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter54ApplicationTests { + + @Autowired + private UserRepository userRepository; + + @Autowired + private CacheManager cacheManager; + + @Test + public void test() throws Exception { + // 创建1条记录 + userRepository.save(new User("AAA", 10)); + + User u1 = userRepository.findByName("AAA"); + System.out.println("第一次查询:" + u1.getAge()); + + User u2 = userRepository.findByName("AAA"); + System.out.println("第二次查询:" + u2.getAge()); + } + +} From bcfd83b7c09ca023be1dabad1c116fa6152080df Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Sun, 26 Jul 2020 15:36:33 +0800 Subject: [PATCH 022/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8=E9=9B=86=E4=B8=AD?= =?UTF-8?q?=E5=BC=8F=E7=BC=93=E5=AD=98Redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.1.x/pom.xml b/2.1.x/pom.xml index 9646d1a7..26b0293f 100644 --- a/2.1.x/pom.xml +++ b/2.1.x/pom.xml @@ -45,7 +45,7 @@ chapter5-1 chapter5-2 chapter5-3 - + chapter5-4 From 3147a0f01e02e9f6b1dc3af1e7c7e9615ea20339 Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Sun, 26 Jul 2020 16:13:54 +0800 Subject: [PATCH 023/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8=E9=9B=86=E4=B8=AD?= =?UTF-8?q?=E5=BC=8F=E7=BC=93=E5=AD=98Redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/chapter5-4/src/main/resources/application.properties | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/2.1.x/chapter5-4/src/main/resources/application.properties b/2.1.x/chapter5-4/src/main/resources/application.properties index 2b650ce3..4572dd72 100644 --- a/2.1.x/chapter5-4/src/main/resources/application.properties +++ b/2.1.x/chapter5-4/src/main/resources/application.properties @@ -6,3 +6,10 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=create-drop +spring.redis.host=localhost +spring.redis.port=6379 +spring.redis.lettuce.pool.max-idle=8 +spring.redis.lettuce.pool.max-active=8 +spring.redis.lettuce.pool.max-wait=-1ms +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms From fb554930bc5974c26b5880d9e9af0e5f81deac65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 12 Aug 2020 16:45:09 +0800 Subject: [PATCH 024/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8=E9=9B=86=E4=B8=AD?= =?UTF-8?q?=E5=BC=8F=E7=BC=93=E5=AD=98Redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/README.md | 1 + 2.1.x/README_zh.md | 1 + 2.1.x/chapter5-4/pom.xml | 5 +++++ 2.1.x/chapter5-4/src/main/resources/application.properties | 3 ++- .../com/didispace/chapter54/Chapter54ApplicationTests.java | 2 ++ 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/2.1.x/README.md b/2.1.x/README.md index d167afb9..74d34681 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -96,6 +96,7 @@ - [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) - [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) - [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) +- [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/)) ### Web开发 diff --git a/2.1.x/README_zh.md b/2.1.x/README_zh.md index c57fe794..ef318f9d 100644 --- a/2.1.x/README_zh.md +++ b/2.1.x/README_zh.md @@ -91,6 +91,7 @@ - [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) - [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) - [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) +- [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/)) ### Web开发 diff --git a/2.1.x/chapter5-4/pom.xml b/2.1.x/chapter5-4/pom.xml index 04b4b50f..c33d2854 100644 --- a/2.1.x/chapter5-4/pom.xml +++ b/2.1.x/chapter5-4/pom.xml @@ -34,6 +34,11 @@ spring-boot-starter-data-redis + + org.apache.commons + commons-pool2 + + org.springframework.boot spring-boot-starter-actuator diff --git a/2.1.x/chapter5-4/src/main/resources/application.properties b/2.1.x/chapter5-4/src/main/resources/application.properties index 4572dd72..7136291e 100644 --- a/2.1.x/chapter5-4/src/main/resources/application.properties +++ b/2.1.x/chapter5-4/src/main/resources/application.properties @@ -1,8 +1,9 @@ spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root -spring.datasource.password= +spring.datasource.password=12345678 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=create-drop diff --git a/2.1.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java b/2.1.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java index 37acba9f..de5a7185 100644 --- a/2.1.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java +++ b/2.1.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java @@ -21,6 +21,8 @@ public class Chapter54ApplicationTests { @Test public void test() throws Exception { + System.out.println("CacheManager type : " + cacheManager.getClass()); + // 创建1条记录 userRepository.save(new User("AAA", 10)); From dc2b4306710901b5d9305d6f9f438008bb7ee130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 12 Aug 2020 17:03:44 +0800 Subject: [PATCH 025/160] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/README.md | 2 +- 2.1.x/README_zh.md | 2 +- README_zh.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/2.1.x/README.md b/2.1.x/README.md index 74d34681..da396a71 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -96,7 +96,7 @@ - [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) - [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) - [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) -- [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/)) +- [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/) ### Web开发 diff --git a/2.1.x/README_zh.md b/2.1.x/README_zh.md index ef318f9d..c276674d 100644 --- a/2.1.x/README_zh.md +++ b/2.1.x/README_zh.md @@ -91,7 +91,7 @@ - [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) - [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) - [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) -- [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/)) +- [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/) ### Web开发 diff --git a/README_zh.md b/README_zh.md index 29593630..59a3e2d8 100644 --- a/README_zh.md +++ b/README_zh.md @@ -14,7 +14,7 @@ ## 教程目录 - [Spring Boot 1.x 版本教程](./1.x) -- [Spring Boot 2.1.x 版本教程](./2.1.x) +- [Spring Boot 2.x 版本教程](./2.1.x) > **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
From 5974053202b13916531012e8e11a9b6ba54ba8f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 20 Aug 2020 14:42:04 +0800 Subject: [PATCH 026/160] update --- 2.1.x/README.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/2.1.x/README.md b/2.1.x/README.md index da396a71..4764e800 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -19,37 +19,37 @@

- - - + + + - - + + + + + +
-
- - - - - - - -
From 350f834f23b067d5ec7a4d0a714b8a86b506ea9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 20 Aug 2020 14:44:42 +0800 Subject: [PATCH 027/160] update --- 2.1.x/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.1.x/README.md b/2.1.x/README.md index 4764e800..891ff48f 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -30,7 +30,7 @@ - + From 68da1cc64d346fd513dc89e9f03b7b9ede2020ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 20 Aug 2020 14:46:28 +0800 Subject: [PATCH 028/160] update --- 1.x/README.md | 26 ++++++++++++++++++-------- README.md | 35 ++++++++++++++++++++--------------- 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/1.x/README.md b/1.x/README.md index 5223c2f3..1a98427e 100644 --- a/1.x/README.md +++ b/1.x/README.md @@ -20,22 +20,32 @@ - - - + + + - - + + + + + + + + + - - - + + + + + + diff --git a/README.md b/README.md index 917e90da..dba755c7 100644 --- a/README.md +++ b/README.md @@ -24,33 +24,38 @@ - - + + + + + + + + + + + + + + - + + + + + + - - - - - - - - - - - - From 4c8f2b6868fdbae81c01c8e595d3be811282c5b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Thu, 20 Aug 2020 15:14:05 +0800 Subject: [PATCH 029/160] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dba755c7..040ec0f2 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ - + From c4e6bfefd2a01cff8cfe6c4a1330b616ee43d0b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Thu, 20 Aug 2020 15:14:58 +0800 Subject: [PATCH 030/160] Update README.md --- 2.1.x/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.1.x/README.md b/2.1.x/README.md index 891ff48f..35b5d51b 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -24,7 +24,7 @@ - + From 967f2439a4e756b71fa0ac46c74c29bcd084b070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 26 Aug 2020 10:20:08 +0800 Subject: [PATCH 031/160] update --- 1.x/README.md | 2 +- 2.1.x/README.md | 2 +- README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/1.x/README.md b/1.x/README.md index 1a98427e..f503a3df 100644 --- a/1.x/README.md +++ b/1.x/README.md @@ -25,7 +25,7 @@ - + diff --git a/2.1.x/README.md b/2.1.x/README.md index 35b5d51b..dd8bc1a3 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -24,7 +24,7 @@ - + diff --git a/README.md b/README.md index 040ec0f2..5e14a692 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ - + From de135b19a28194fa29a3b9f657bb7f66ffa24908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Fri, 30 Oct 2020 12:10:44 +0800 Subject: [PATCH 032/160] Update README.md --- README.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 5e14a692..84af7336 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,8 @@ - - + + @@ -40,11 +40,6 @@ - - - - - @@ -55,6 +50,8 @@ + + From 322fc7bb7c2248d7d0f5df29cc3993015e468d3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Fri, 30 Oct 2020 12:11:33 +0800 Subject: [PATCH 033/160] Update README.md --- 2.1.x/README.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/2.1.x/README.md b/2.1.x/README.md index dd8bc1a3..df822eee 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -24,8 +24,8 @@ - - + + @@ -35,11 +35,6 @@ - - - - - @@ -50,6 +45,8 @@ + + From e11ae1fcedd8736c9df4b59680c36a9d5fe4a333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Fri, 30 Oct 2020 12:13:51 +0800 Subject: [PATCH 034/160] Update README.md --- 1.x/README.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/1.x/README.md b/1.x/README.md index f503a3df..4aba132e 100644 --- a/1.x/README.md +++ b/1.x/README.md @@ -25,8 +25,8 @@ - - + + @@ -36,11 +36,6 @@ - - - - - @@ -51,6 +46,8 @@ + + From 707f93e0bc3eb414334986fbe634702653a5561e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Thu, 26 Nov 2020 11:10:21 +0800 Subject: [PATCH 035/160] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 84af7336..b439beed 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,6 @@ 2. 点个`Star`并`Follow`我 3. 把该仓库分享给更多的朋友 -如果您对文字类教程不感冒或者想要通过综合案例学习Spring,那么给您推荐这个我觉得目前内容与价格最良心的视频课程:["玩转Spring全家桶"](https://time.geekbang.org/course/intro/100023501?code=d1se%2F7ugeBEyuU%2FIYp1ynfSZa6ulbGhhDK%2Fkpn3-lFc%3D) ## 教程目录 From a24e6652ade15aebca7bfded39f17b3be0ebd6a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Thu, 26 Nov 2020 11:11:22 +0800 Subject: [PATCH 036/160] Update README.md --- 2.1.x/README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/2.1.x/README.md b/2.1.x/README.md index df822eee..1099743e 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -5,14 +5,11 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! **如何支持**: + 1. 关注我的公众号”**程序猿DD**“ 2. 点个`Star`并`Follow`我 3. 把该仓库分享给更多的朋友 -如果您对文字类教程不感冒或者想要通过综合案例学习Spring,那么给您推荐这个我觉得目前内容与价格最良心的视频课程:["玩转Spring全家桶"](https://time.geekbang.org/course/intro/100023501?code=d1se%2F7ugeBEyuU%2FIYp1ynfSZa6ulbGhhDK%2Fkpn3-lFc%3D) - -> **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
- ## 特别赞助商 From a48e2cb2a6e96d567e62e601984cc731942f8980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 16 Dec 2020 15:17:37 +0800 Subject: [PATCH 037/160] =?UTF-8?q?2.1.x=E5=86=85=E5=AE=B9=E5=B9=B6?= =?UTF-8?q?=E5=85=A52.x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 121 ++ 2.x/README_zh.md | 125 ++ 2.x/chapter1-1/.gitignore | 29 + 2.x/chapter1-1/pom.xml | 43 + .../chapter11/Chapter11Application.java | 13 + .../didispace/chapter11/HelloController.java | 14 + .../src/main/resources/application.properties | 1 + .../chapter11/Chapter11ApplicationTests.java | 36 + 2.x/chapter2-1/.gitignore | 29 + 2.x/chapter2-1/pom.xml | 50 + .../chapter21/Chapter21Application.java | 13 + .../java/com/didispace/chapter21/User.java | 12 + .../didispace/chapter21/UserController.java | 79 + .../src/main/resources/application.properties | 1 + .../chapter21/Chapter21ApplicationTests.java | 79 + 2.x/chapter2-2/.gitignore | 29 + 2.x/chapter2-2/pom.xml | 56 + .../chapter22/Chapter22Application.java | 15 + .../java/com/didispace/chapter22/User.java | 18 + .../didispace/chapter22/UserController.java | 56 + .../src/main/resources/application.properties | 13 + 2.x/chapter2-3/.gitignore | 29 + 2.x/chapter2-3/pom.xml | 56 + .../chapter23/Chapter23Application.java | 15 + .../java/com/didispace/chapter23/User.java | 32 + .../didispace/chapter23/UserController.java | 57 + .../src/main/resources/application.properties | 13 + 2.x/chapter2-4/.gitignore | 29 + 2.x/chapter2-4/pom.xml | 56 + .../chapter24/Chapter24Application.java | 61 + .../java/com/didispace/chapter24/User.java | 32 + .../didispace/chapter24/UserController.java | 57 + .../src/main/resources/application.properties | 16 + 2.x/chapter2-5/.gitignore | 29 + 2.x/chapter2-5/pom.xml | 102 ++ .../generated-by-plugin/definitions.adoc | 22 + .../generated-by-plugin/overview.adoc | 38 + .../asciidoc/generated-by-plugin/paths.adoc | 265 ++++ .../generated-by-plugin/security.adoc | 13 + .../docs/asciidoc/generated/definitions.adoc | 22 + .../src/docs/asciidoc/generated/overview.adoc | 38 + .../src/docs/asciidoc/generated/paths.adoc | 265 ++++ .../src/docs/asciidoc/generated/security.adoc | 13 + .../src/docs/asciidoc/html/definitions.html | 603 +++++++ .../src/docs/asciidoc/html/overview.html | 591 +++++++ .../src/docs/asciidoc/html/paths.html | 1379 +++++++++++++++++ .../src/docs/asciidoc/html/security.html | 553 +++++++ .../docs/confluence/generated/definitions.txt | 14 + .../docs/confluence/generated/overview.txt | 33 + .../src/docs/confluence/generated/paths.txt | 212 +++ .../docs/confluence/generated/security.txt | 10 + .../docs/markdown/generated/definitions.md | 17 + .../src/docs/markdown/generated/overview.md | 34 + .../src/docs/markdown/generated/paths.md | 232 +++ .../src/docs/markdown/generated/security.md | 12 + .../chapter25/Chapter25Application.java | 15 + .../java/com/didispace/chapter25/User.java | 18 + .../didispace/chapter25/UserController.java | 56 + .../src/main/resources/application.properties | 13 + .../chapter25/DemoApplicationTests.java | 71 + 2.x/chapter2-6/.gitignore | 29 + 2.x/chapter2-6/pom.xml | 49 + .../chapter26/Chapter26Application.java | 13 + .../java/com/didispace/chapter26/User.java | 12 + .../didispace/chapter26/UserController.java | 46 + .../src/main/resources/application.properties | 3 + 2.x/chapter2-7/.gitignore | 24 + 2.x/chapter2-7/pom.xml | 67 + .../chapter27/Chapter27Application.java | 15 + .../java/com/didispace/chapter27/User.java | 29 + .../didispace/chapter27/UserController.java | 45 + .../src/main/resources/application.properties | 2 + 2.x/chapter3-1/.gitignore | 29 + 2.x/chapter3-1/pom.xml | 58 + .../chapter31/Chapter31Application.java | 13 + .../java/com/didispace/chapter31/User.java | 13 + .../com/didispace/chapter31/UserService.java | 40 + .../didispace/chapter31/UserServiceImpl.java | 52 + .../src/main/resources/application.properties | 4 + .../chapter31/Chapter31ApplicationTests.java | 63 + 2.x/chapter3-10/.gitignore | 29 + 2.x/chapter3-10/pom.xml | 64 + .../chapter310/Chapter310Application.java | 25 + .../java/com/didispace/chapter310/User.java | 27 + .../didispace/chapter310/UserRepository.java | 22 + .../src/main/resources/application.properties | 7 + .../Chapter310ApplicationTests.java | 56 + 2.x/chapter3-2/.gitignore | 29 + 2.x/chapter3-2/pom.xml | 58 + .../chapter32/Chapter32Application.java | 13 + .../java/com/didispace/chapter32/User.java | 13 + .../com/didispace/chapter32/UserService.java | 40 + .../didispace/chapter32/UserServiceImpl.java | 52 + .../src/main/resources/application.properties | 17 + .../chapter32/Chapter32ApplicationTests.java | 69 + 2.x/chapter3-3/.gitignore | 29 + 2.x/chapter3-3/pom.xml | 70 + .../chapter33/Chapter33Application.java | 25 + .../java/com/didispace/chapter33/User.java | 13 + .../didispace/chapter33/UserController.java | 47 + .../com/didispace/chapter33/UserService.java | 40 + .../didispace/chapter33/UserServiceImpl.java | 52 + .../src/main/resources/application.properties | 29 + .../chapter33/Chapter33ApplicationTests.java | 69 + 2.x/chapter3-4/.gitignore | 29 + 2.x/chapter3-4/pom.xml | 64 + .../chapter34/Chapter34Application.java | 25 + .../java/com/didispace/chapter34/User.java | 26 + .../didispace/chapter34/UserRepository.java | 22 + .../src/main/resources/application.properties | 6 + .../chapter34/Chapter34ApplicationTests.java | 57 + 2.x/chapter3-5/.gitignore | 29 + 2.x/chapter3-5/pom.xml | 55 + .../chapter35/Chapter35Application.java | 13 + .../java/com/didispace/chapter35/User.java | 20 + .../com/didispace/chapter35/UserMapper.java | 23 + .../src/main/resources/application.properties | 4 + .../chapter35/Chapter35ApplicationTests.java | 33 + 2.x/chapter3-6/.gitignore | 29 + 2.x/chapter3-6/pom.xml | 55 + .../chapter36/Chapter36Application.java | 15 + .../com/didispace/chapter36/entity/User.java | 20 + .../chapter36/mapper/UserMapper.java | 18 + .../src/main/resources/application.properties | 6 + .../src/main/resources/mapper/UserMapper.xml | 13 + .../chapter36/Chapter36ApplicationTests.java | 32 + 2.x/chapter3-7/.gitignore | 29 + 2.x/chapter3-7/pom.xml | 59 + .../chapter37/Chapter37Application.java | 13 + .../chapter37/DataSourceConfiguration.java | 39 + .../src/main/resources/application.properties | 11 + .../chapter37/Chapter37ApplicationTests.java | 46 + 2.x/chapter3-8/.gitignore | 29 + 2.x/chapter3-8/pom.xml | 65 + .../chapter38/Chapter38Application.java | 15 + .../chapter38/DataSourceConfiguration.java | 29 + .../didispace/chapter38/PrimaryConfig.java | 70 + .../didispace/chapter38/SecondaryConfig.java | 62 + .../java/com/didispace/chapter38/p/User.java | 27 + .../didispace/chapter38/p/UserRepository.java | 15 + .../com/didispace/chapter38/s/Message.java | 29 + .../chapter38/s/MessageRepository.java | 14 + .../src/main/resources/application.properties | 16 + .../chapter38/Chapter38ApplicationTests.java | 42 + 2.x/chapter3-9/.gitignore | 29 + 2.x/chapter3-9/pom.xml | 56 + .../chapter39/Chapter39Application.java | 13 + .../chapter39/DataSourceConfiguration.java | 27 + .../didispace/chapter39/PrimaryConfig.java | 38 + .../didispace/chapter39/SecondaryConfig.java | 38 + .../chapter39/p/entity/UserPrimary.java | 20 + .../chapter39/p/mapper/UserMapperPrimary.java | 26 + .../chapter39/s/entity/UserSecondary.java | 20 + .../s/mapper/UserMapperSecondary.java | 25 + .../src/main/resources/application.properties | 13 + .../resources/mapper.primary/UserMapper.xml | 15 + .../resources/mapper.secondary/UserMapper.xml | 16 + .../chapter39/Chapter39ApplicationTests.java | 60 + 2.x/chapter4-1/.gitignore | 29 + 2.x/chapter4-1/pom.xml | 54 + .../chapter41/Chapter41Application.java | 13 + .../didispace/chapter41/HelloController.java | 19 + .../src/main/resources/application.properties | 1 + .../src/main/resources/templates/index.html | 10 + 2.x/chapter4-2/.gitignore | 29 + 2.x/chapter4-2/pom.xml | 54 + .../chapter42/Chapter42Application.java | 13 + .../didispace/chapter42/HelloController.java | 16 + .../src/main/resources/application.properties | 1 + .../src/main/resources/templates/index.html | 30 + 2.x/chapter5-1/.gitignore | 29 + 2.x/chapter5-1/pom.xml | 69 + .../chapter51/Chapter51Application.java | 15 + .../java/com/didispace/chapter51/User.java | 26 + .../didispace/chapter51/UserRepository.java | 26 + .../src/main/resources/application.properties | 7 + .../chapter51/Chapter51ApplicationTests.java | 34 + 2.x/chapter5-2/.gitignore | 29 + 2.x/chapter5-2/pom.xml | 74 + .../chapter52/Chapter52Application.java | 15 + .../java/com/didispace/chapter52/User.java | 26 + .../didispace/chapter52/UserRepository.java | 21 + .../src/main/resources/application.properties | 7 + 2.x/chapter5-2/src/main/resources/ehcache.xml | 9 + .../chapter52/Chapter52ApplicationTests.java | 36 + 2.x/chapter5-3/.gitignore | 29 + 2.x/chapter5-3/pom.xml | 74 + .../chapter53/Chapter53Application.java | 50 + .../java/com/didispace/chapter53/User.java | 27 + .../didispace/chapter53/UserRepository.java | 21 + .../src/main/resources/application.properties | 17 + .../src/main/resources/ehcache-1.xml | 29 + .../src/main/resources/ehcache-2.xml | 29 + .../chapter53/Chapter53ApplicationTests.java | 36 + 2.x/chapter5-4/.gitignore | 29 + 2.x/chapter5-4/pom.xml | 74 + .../chapter54/Chapter54Application.java | 15 + .../java/com/didispace/chapter54/User.java | 27 + .../didispace/chapter54/UserRepository.java | 26 + .../src/main/resources/application.properties | 16 + .../chapter54/Chapter54ApplicationTests.java | 36 + 2.x/pom.xml | 60 + 202 files changed, 10343 insertions(+) create mode 100644 2.x/README.md create mode 100644 2.x/README_zh.md create mode 100644 2.x/chapter1-1/.gitignore create mode 100644 2.x/chapter1-1/pom.xml create mode 100644 2.x/chapter1-1/src/main/java/com/didispace/chapter11/Chapter11Application.java create mode 100644 2.x/chapter1-1/src/main/java/com/didispace/chapter11/HelloController.java create mode 100644 2.x/chapter1-1/src/main/resources/application.properties create mode 100644 2.x/chapter1-1/src/test/java/com/didispace/chapter11/Chapter11ApplicationTests.java create mode 100644 2.x/chapter2-1/.gitignore create mode 100644 2.x/chapter2-1/pom.xml create mode 100644 2.x/chapter2-1/src/main/java/com/didispace/chapter21/Chapter21Application.java create mode 100644 2.x/chapter2-1/src/main/java/com/didispace/chapter21/User.java create mode 100644 2.x/chapter2-1/src/main/java/com/didispace/chapter21/UserController.java create mode 100644 2.x/chapter2-1/src/main/resources/application.properties create mode 100644 2.x/chapter2-1/src/test/java/com/didispace/chapter21/Chapter21ApplicationTests.java create mode 100644 2.x/chapter2-2/.gitignore create mode 100644 2.x/chapter2-2/pom.xml create mode 100644 2.x/chapter2-2/src/main/java/com/didispace/chapter22/Chapter22Application.java create mode 100644 2.x/chapter2-2/src/main/java/com/didispace/chapter22/User.java create mode 100644 2.x/chapter2-2/src/main/java/com/didispace/chapter22/UserController.java create mode 100644 2.x/chapter2-2/src/main/resources/application.properties create mode 100644 2.x/chapter2-3/.gitignore create mode 100644 2.x/chapter2-3/pom.xml create mode 100644 2.x/chapter2-3/src/main/java/com/didispace/chapter23/Chapter23Application.java create mode 100644 2.x/chapter2-3/src/main/java/com/didispace/chapter23/User.java create mode 100644 2.x/chapter2-3/src/main/java/com/didispace/chapter23/UserController.java create mode 100644 2.x/chapter2-3/src/main/resources/application.properties create mode 100644 2.x/chapter2-4/.gitignore create mode 100644 2.x/chapter2-4/pom.xml create mode 100644 2.x/chapter2-4/src/main/java/com/didispace/chapter24/Chapter24Application.java create mode 100644 2.x/chapter2-4/src/main/java/com/didispace/chapter24/User.java create mode 100644 2.x/chapter2-4/src/main/java/com/didispace/chapter24/UserController.java create mode 100644 2.x/chapter2-4/src/main/resources/application.properties create mode 100644 2.x/chapter2-5/.gitignore create mode 100644 2.x/chapter2-5/pom.xml create mode 100644 2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/definitions.adoc create mode 100644 2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/overview.adoc create mode 100644 2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/paths.adoc create mode 100644 2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/security.adoc create mode 100644 2.x/chapter2-5/src/docs/asciidoc/generated/definitions.adoc create mode 100644 2.x/chapter2-5/src/docs/asciidoc/generated/overview.adoc create mode 100644 2.x/chapter2-5/src/docs/asciidoc/generated/paths.adoc create mode 100644 2.x/chapter2-5/src/docs/asciidoc/generated/security.adoc create mode 100644 2.x/chapter2-5/src/docs/asciidoc/html/definitions.html create mode 100644 2.x/chapter2-5/src/docs/asciidoc/html/overview.html create mode 100644 2.x/chapter2-5/src/docs/asciidoc/html/paths.html create mode 100644 2.x/chapter2-5/src/docs/asciidoc/html/security.html create mode 100644 2.x/chapter2-5/src/docs/confluence/generated/definitions.txt create mode 100644 2.x/chapter2-5/src/docs/confluence/generated/overview.txt create mode 100644 2.x/chapter2-5/src/docs/confluence/generated/paths.txt create mode 100644 2.x/chapter2-5/src/docs/confluence/generated/security.txt create mode 100644 2.x/chapter2-5/src/docs/markdown/generated/definitions.md create mode 100644 2.x/chapter2-5/src/docs/markdown/generated/overview.md create mode 100644 2.x/chapter2-5/src/docs/markdown/generated/paths.md create mode 100644 2.x/chapter2-5/src/docs/markdown/generated/security.md create mode 100644 2.x/chapter2-5/src/main/java/com/didispace/chapter25/Chapter25Application.java create mode 100644 2.x/chapter2-5/src/main/java/com/didispace/chapter25/User.java create mode 100644 2.x/chapter2-5/src/main/java/com/didispace/chapter25/UserController.java create mode 100644 2.x/chapter2-5/src/main/resources/application.properties create mode 100644 2.x/chapter2-5/src/test/java/com/didispace/chapter25/DemoApplicationTests.java create mode 100644 2.x/chapter2-6/.gitignore create mode 100644 2.x/chapter2-6/pom.xml create mode 100644 2.x/chapter2-6/src/main/java/com/didispace/chapter26/Chapter26Application.java create mode 100644 2.x/chapter2-6/src/main/java/com/didispace/chapter26/User.java create mode 100644 2.x/chapter2-6/src/main/java/com/didispace/chapter26/UserController.java create mode 100644 2.x/chapter2-6/src/main/resources/application.properties create mode 100644 2.x/chapter2-7/.gitignore create mode 100644 2.x/chapter2-7/pom.xml create mode 100644 2.x/chapter2-7/src/main/java/com/didispace/chapter27/Chapter27Application.java create mode 100644 2.x/chapter2-7/src/main/java/com/didispace/chapter27/User.java create mode 100644 2.x/chapter2-7/src/main/java/com/didispace/chapter27/UserController.java create mode 100644 2.x/chapter2-7/src/main/resources/application.properties create mode 100644 2.x/chapter3-1/.gitignore create mode 100644 2.x/chapter3-1/pom.xml create mode 100644 2.x/chapter3-1/src/main/java/com/didispace/chapter31/Chapter31Application.java create mode 100644 2.x/chapter3-1/src/main/java/com/didispace/chapter31/User.java create mode 100644 2.x/chapter3-1/src/main/java/com/didispace/chapter31/UserService.java create mode 100644 2.x/chapter3-1/src/main/java/com/didispace/chapter31/UserServiceImpl.java create mode 100644 2.x/chapter3-1/src/main/resources/application.properties create mode 100644 2.x/chapter3-1/src/test/java/com/didispace/chapter31/Chapter31ApplicationTests.java create mode 100644 2.x/chapter3-10/.gitignore create mode 100644 2.x/chapter3-10/pom.xml create mode 100644 2.x/chapter3-10/src/main/java/com/didispace/chapter310/Chapter310Application.java create mode 100644 2.x/chapter3-10/src/main/java/com/didispace/chapter310/User.java create mode 100644 2.x/chapter3-10/src/main/java/com/didispace/chapter310/UserRepository.java create mode 100644 2.x/chapter3-10/src/main/resources/application.properties create mode 100644 2.x/chapter3-10/src/test/java/com/didispace/chapter310/Chapter310ApplicationTests.java create mode 100644 2.x/chapter3-2/.gitignore create mode 100644 2.x/chapter3-2/pom.xml create mode 100644 2.x/chapter3-2/src/main/java/com/didispace/chapter32/Chapter32Application.java create mode 100644 2.x/chapter3-2/src/main/java/com/didispace/chapter32/User.java create mode 100644 2.x/chapter3-2/src/main/java/com/didispace/chapter32/UserService.java create mode 100644 2.x/chapter3-2/src/main/java/com/didispace/chapter32/UserServiceImpl.java create mode 100644 2.x/chapter3-2/src/main/resources/application.properties create mode 100644 2.x/chapter3-2/src/test/java/com/didispace/chapter32/Chapter32ApplicationTests.java create mode 100644 2.x/chapter3-3/.gitignore create mode 100644 2.x/chapter3-3/pom.xml create mode 100644 2.x/chapter3-3/src/main/java/com/didispace/chapter33/Chapter33Application.java create mode 100644 2.x/chapter3-3/src/main/java/com/didispace/chapter33/User.java create mode 100644 2.x/chapter3-3/src/main/java/com/didispace/chapter33/UserController.java create mode 100644 2.x/chapter3-3/src/main/java/com/didispace/chapter33/UserService.java create mode 100644 2.x/chapter3-3/src/main/java/com/didispace/chapter33/UserServiceImpl.java create mode 100644 2.x/chapter3-3/src/main/resources/application.properties create mode 100644 2.x/chapter3-3/src/test/java/com/didispace/chapter33/Chapter33ApplicationTests.java create mode 100644 2.x/chapter3-4/.gitignore create mode 100644 2.x/chapter3-4/pom.xml create mode 100644 2.x/chapter3-4/src/main/java/com/didispace/chapter34/Chapter34Application.java create mode 100644 2.x/chapter3-4/src/main/java/com/didispace/chapter34/User.java create mode 100644 2.x/chapter3-4/src/main/java/com/didispace/chapter34/UserRepository.java create mode 100644 2.x/chapter3-4/src/main/resources/application.properties create mode 100644 2.x/chapter3-4/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java create mode 100644 2.x/chapter3-5/.gitignore create mode 100644 2.x/chapter3-5/pom.xml create mode 100644 2.x/chapter3-5/src/main/java/com/didispace/chapter35/Chapter35Application.java create mode 100644 2.x/chapter3-5/src/main/java/com/didispace/chapter35/User.java create mode 100644 2.x/chapter3-5/src/main/java/com/didispace/chapter35/UserMapper.java create mode 100644 2.x/chapter3-5/src/main/resources/application.properties create mode 100644 2.x/chapter3-5/src/test/java/com/didispace/chapter35/Chapter35ApplicationTests.java create mode 100644 2.x/chapter3-6/.gitignore create mode 100644 2.x/chapter3-6/pom.xml create mode 100644 2.x/chapter3-6/src/main/java/com/didispace/chapter36/Chapter36Application.java create mode 100644 2.x/chapter3-6/src/main/java/com/didispace/chapter36/entity/User.java create mode 100644 2.x/chapter3-6/src/main/java/com/didispace/chapter36/mapper/UserMapper.java create mode 100644 2.x/chapter3-6/src/main/resources/application.properties create mode 100644 2.x/chapter3-6/src/main/resources/mapper/UserMapper.xml create mode 100644 2.x/chapter3-6/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java create mode 100644 2.x/chapter3-7/.gitignore create mode 100644 2.x/chapter3-7/pom.xml create mode 100644 2.x/chapter3-7/src/main/java/com/didispace/chapter37/Chapter37Application.java create mode 100644 2.x/chapter3-7/src/main/java/com/didispace/chapter37/DataSourceConfiguration.java create mode 100644 2.x/chapter3-7/src/main/resources/application.properties create mode 100644 2.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java create mode 100644 2.x/chapter3-8/.gitignore create mode 100644 2.x/chapter3-8/pom.xml create mode 100644 2.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java create mode 100644 2.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java create mode 100644 2.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java create mode 100644 2.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java create mode 100644 2.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java create mode 100644 2.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java create mode 100644 2.x/chapter3-8/src/main/java/com/didispace/chapter38/s/Message.java create mode 100644 2.x/chapter3-8/src/main/java/com/didispace/chapter38/s/MessageRepository.java create mode 100644 2.x/chapter3-8/src/main/resources/application.properties create mode 100644 2.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java create mode 100644 2.x/chapter3-9/.gitignore create mode 100644 2.x/chapter3-9/pom.xml create mode 100644 2.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java create mode 100644 2.x/chapter3-9/src/main/java/com/didispace/chapter39/DataSourceConfiguration.java create mode 100644 2.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java create mode 100644 2.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java create mode 100644 2.x/chapter3-9/src/main/java/com/didispace/chapter39/p/entity/UserPrimary.java create mode 100644 2.x/chapter3-9/src/main/java/com/didispace/chapter39/p/mapper/UserMapperPrimary.java create mode 100644 2.x/chapter3-9/src/main/java/com/didispace/chapter39/s/entity/UserSecondary.java create mode 100644 2.x/chapter3-9/src/main/java/com/didispace/chapter39/s/mapper/UserMapperSecondary.java create mode 100644 2.x/chapter3-9/src/main/resources/application.properties create mode 100644 2.x/chapter3-9/src/main/resources/mapper.primary/UserMapper.xml create mode 100644 2.x/chapter3-9/src/main/resources/mapper.secondary/UserMapper.xml create mode 100644 2.x/chapter3-9/src/test/java/com/didispace/chapter39/Chapter39ApplicationTests.java create mode 100644 2.x/chapter4-1/.gitignore create mode 100644 2.x/chapter4-1/pom.xml create mode 100644 2.x/chapter4-1/src/main/java/com/didispace/chapter41/Chapter41Application.java create mode 100644 2.x/chapter4-1/src/main/java/com/didispace/chapter41/HelloController.java create mode 100644 2.x/chapter4-1/src/main/resources/application.properties create mode 100644 2.x/chapter4-1/src/main/resources/templates/index.html create mode 100644 2.x/chapter4-2/.gitignore create mode 100644 2.x/chapter4-2/pom.xml create mode 100644 2.x/chapter4-2/src/main/java/com/didispace/chapter42/Chapter42Application.java create mode 100644 2.x/chapter4-2/src/main/java/com/didispace/chapter42/HelloController.java create mode 100644 2.x/chapter4-2/src/main/resources/application.properties create mode 100644 2.x/chapter4-2/src/main/resources/templates/index.html create mode 100644 2.x/chapter5-1/.gitignore create mode 100644 2.x/chapter5-1/pom.xml create mode 100644 2.x/chapter5-1/src/main/java/com/didispace/chapter51/Chapter51Application.java create mode 100644 2.x/chapter5-1/src/main/java/com/didispace/chapter51/User.java create mode 100644 2.x/chapter5-1/src/main/java/com/didispace/chapter51/UserRepository.java create mode 100644 2.x/chapter5-1/src/main/resources/application.properties create mode 100644 2.x/chapter5-1/src/test/java/com/didispace/chapter51/Chapter51ApplicationTests.java create mode 100644 2.x/chapter5-2/.gitignore create mode 100644 2.x/chapter5-2/pom.xml create mode 100644 2.x/chapter5-2/src/main/java/com/didispace/chapter52/Chapter52Application.java create mode 100644 2.x/chapter5-2/src/main/java/com/didispace/chapter52/User.java create mode 100644 2.x/chapter5-2/src/main/java/com/didispace/chapter52/UserRepository.java create mode 100644 2.x/chapter5-2/src/main/resources/application.properties create mode 100644 2.x/chapter5-2/src/main/resources/ehcache.xml create mode 100644 2.x/chapter5-2/src/test/java/com/didispace/chapter52/Chapter52ApplicationTests.java create mode 100644 2.x/chapter5-3/.gitignore create mode 100644 2.x/chapter5-3/pom.xml create mode 100644 2.x/chapter5-3/src/main/java/com/didispace/chapter53/Chapter53Application.java create mode 100644 2.x/chapter5-3/src/main/java/com/didispace/chapter53/User.java create mode 100644 2.x/chapter5-3/src/main/java/com/didispace/chapter53/UserRepository.java create mode 100644 2.x/chapter5-3/src/main/resources/application.properties create mode 100644 2.x/chapter5-3/src/main/resources/ehcache-1.xml create mode 100644 2.x/chapter5-3/src/main/resources/ehcache-2.xml create mode 100644 2.x/chapter5-3/src/test/java/com/didispace/chapter53/Chapter53ApplicationTests.java create mode 100644 2.x/chapter5-4/.gitignore create mode 100644 2.x/chapter5-4/pom.xml create mode 100644 2.x/chapter5-4/src/main/java/com/didispace/chapter54/Chapter54Application.java create mode 100644 2.x/chapter5-4/src/main/java/com/didispace/chapter54/User.java create mode 100644 2.x/chapter5-4/src/main/java/com/didispace/chapter54/UserRepository.java create mode 100644 2.x/chapter5-4/src/main/resources/application.properties create mode 100644 2.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java create mode 100644 2.x/pom.xml diff --git a/2.x/README.md b/2.x/README.md new file mode 100644 index 00000000..1099743e --- /dev/null +++ b/2.x/README.md @@ -0,0 +1,121 @@ +# Spring Boot基础教程(2.x版本) + +本项目内容为[《Spring Boot基础教程》](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 + +**专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! + +**如何支持**: + +1. 关注我的公众号”**程序猿DD**“ +2. 点个`Star`并`Follow`我 +3. 把该仓库分享给更多的朋友 + +## 特别赞助商 + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + +
+ +> 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` + +## 教程目录(2.x版本) + +连载中...Star关注支持一下,随时获得更新信息! + +### 基础知识 + +- [Spring Boot 2.x基础教程:版本关系](http://blog.didispace.com/spring-cloud-alibaba-version/) +- [Spring Boot 2.x基础教程:快速入门](http://blog.didispace.com/spring-boot-learning-21-1-1/) +- [Spring Boot 2.x基础教程:工程结构推荐](http://blog.didispace.com/spring-boot-learning-21-1-2/) +- [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) + +### Web开发 + +- [Spring Boot 2.x基础教程:构建RESTful API与单元测试](http://blog.didispace.com/spring-boot-learning-21-2-1/) +- [Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档](http://blog.didispace.com/spring-boot-learning-21-2-2/) +- [Spring Boot 2.x基础教程:JSR-303实现请求参数校验](http://blog.didispace.com/spring-boot-learning-21-2-3/) +- [Spring Boot 2.x基础教程:Swagger接口分类与各元素排序问题详解](http://blog.didispace.com/spring-boot-learning-21-2-4/) +- [Spring Boot 2.x基础教程:Swagger静态文档的生成](http://blog.didispace.com/spring-boot-learning-21-2-5/) +- [Spring Boot 2.x基础教程:找回启动日志中的请求路径列表](http://blog.didispace.com/spring-boot-learning-21-2-6/) + +### 数据访问 + +**关系型数据库** + +- [Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库](http://blog.didispace.com/spring-boot-learning-21-3-1/) +- [Spring Boot 2.x基础教程:默认数据源Hikari的配置详解](http://blog.didispace.com/spring-boot-learning-21-3-2/) +- [Spring Boot 2.x基础教程:使用国产数据库连接池Druid](http://blog.didispace.com/spring-boot-learning-21-3-3/) +- [Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL](http://blog.didispace.com/spring-boot-learning-21-3-4/) +- [Spring Boot 2.x基础教程:使用MyBatis访问MySQL](http://blog.didispace.com/spring-boot-learning-21-3-5/) +- [Spring Boot 2.x基础教程:使用MyBatis的XML配置方式](http://blog.didispace.com/spring-boot-learning-21-3-6/) +- [Spring Boot 2.x基础教程:JdbcTemplate的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-7/) +- [Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-8/) +- [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) +- [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) + +**加速利器:各种缓存的使用** + +- [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) +- [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) +- [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) +- [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/) + +### Web开发 + +- [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) +- [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) + +### 1.x到2.x + +- [Spring Boot 2.0 正式发布,升还是不升呢?](http://blog.didispace.com/spring-boot-2-release/) +- [Spring Boot 2.0 新特性和发展方向](http://blog.didispace.com/Spring-Boot-2-0-%E6%96%B0%E7%89%B9%E6%80%A7%E5%92%8C%E5%8F%91%E5%B1%95%E6%96%B9%E5%90%91/) +- [Spring Boot 2.0 与 Java 9](http://blog.didispace.com/Spring-Boot-2.0%E4%B8%8EJava-9/) +- [Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析](http://blog.didispace.com/Spring-Boot-2-0-feature-1-relaxed-binding-2/) +- [Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent](http://blog.didispace.com/Spring-Boot-2-0-feature-2-ApplicationStartedEvent/) + +## 推荐内容 + +- [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 +- [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 +- [GitHub](https://github.com/dyc87112/SpringBoot-Learning):Star支持一下呗 +- [Gitee](https://gitee.com/didispace/SpringBoot-Learning):Star支持一下呗 +- [Spring问答社区](http://www.spring4all.com/):如果您有什么问题,可以去这里发帖 +- [Spring Boot基础教程](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 +- [Spring Cloud基础教程](http://blog.didispace.com/Spring-Cloud%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网最早最全的免费Spring Cloud基础教程 + +## 我的公众号 + + + diff --git a/2.x/README_zh.md b/2.x/README_zh.md new file mode 100644 index 00000000..c276674d --- /dev/null +++ b/2.x/README_zh.md @@ -0,0 +1,125 @@ +# Spring Boot基础教程(2.x版本) + +本项目内容为[《Spring Boot基础教程》](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 + +**专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! + +**如何支持**: +1. 关注我的公众号”**程序猿DD**“ +2. 点个`Star`并`Follow`我 +3. 把该仓库分享给更多的朋友 + +如果您对文字类教程不感冒或者想要通过综合案例学习Spring,那么给您推荐这个我觉得目前内容与价格最良心的视频课程:["玩转Spring全家桶"](https://time.geekbang.org/course/intro/100023501?code=d1se%2F7ugeBEyuU%2FIYp1ynfSZa6ulbGhhDK%2Fkpn3-lFc%3D) + +> **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
+ +## 特别赞助商 + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + +
+ +> 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` + +## 教程目录(2.x版本) + +连载中...Star关注支持一下,随时获得更新信息! + +### 基础知识 + +- [Spring Boot 2.x基础教程:版本关系](http://blog.didispace.com/spring-cloud-alibaba-version/) +- [Spring Boot 2.x基础教程:快速入门](http://blog.didispace.com/spring-boot-learning-21-1-1/) +- [Spring Boot 2.x基础教程:工程结构推荐](http://blog.didispace.com/spring-boot-learning-21-1-2/) +- [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) + +### Web开发 + +- [Spring Boot 2.x基础教程:构建RESTful API与单元测试](http://blog.didispace.com/spring-boot-learning-21-2-1/) +- [Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档](http://blog.didispace.com/spring-boot-learning-21-2-2/) +- [Spring Boot 2.x基础教程:JSR-303实现请求参数校验](http://blog.didispace.com/spring-boot-learning-21-2-3/) +- [Spring Boot 2.x基础教程:Swagger接口分类与各元素排序问题详解](http://blog.didispace.com/spring-boot-learning-21-2-4/) +- [Spring Boot 2.x基础教程:Swagger静态文档的生成](http://blog.didispace.com/spring-boot-learning-21-2-5/) +- [Spring Boot 2.x基础教程:找回启动日志中的请求路径列表](http://blog.didispace.com/spring-boot-learning-21-2-6/) + +### 数据访问 + +**关系型数据库** + +- [Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库](http://blog.didispace.com/spring-boot-learning-21-3-1/) +- [Spring Boot 2.x基础教程:默认数据源Hikari的配置详解](http://blog.didispace.com/spring-boot-learning-21-3-2/) +- [Spring Boot 2.x基础教程:使用国产数据库连接池Druid](http://blog.didispace.com/spring-boot-learning-21-3-3/) +- [Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL](http://blog.didispace.com/spring-boot-learning-21-3-4/) +- [Spring Boot 2.x基础教程:使用MyBatis访问MySQL](http://blog.didispace.com/spring-boot-learning-21-3-5/) +- [Spring Boot 2.x基础教程:使用MyBatis的XML配置方式](http://blog.didispace.com/spring-boot-learning-21-3-6/) +- [Spring Boot 2.x基础教程:JdbcTemplate的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-7/) +- [Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-8/) +- [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) +- [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) + +**加速利器:各种缓存的使用** + +- [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) +- [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) +- [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) +- [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/) + +### Web开发 + +- [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) +- [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) + +### 1.x到2.x + +- [Spring Boot 2.0 正式发布,升还是不升呢?](http://blog.didispace.com/spring-boot-2-release/) +- [Spring Boot 2.0 新特性和发展方向](http://blog.didispace.com/Spring-Boot-2-0-%E6%96%B0%E7%89%B9%E6%80%A7%E5%92%8C%E5%8F%91%E5%B1%95%E6%96%B9%E5%90%91/) +- [Spring Boot 2.0 与 Java 9](http://blog.didispace.com/Spring-Boot-2.0%E4%B8%8EJava-9/) +- [Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析](http://blog.didispace.com/Spring-Boot-2-0-feature-1-relaxed-binding-2/) +- [Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent](http://blog.didispace.com/Spring-Boot-2-0-feature-2-ApplicationStartedEvent/) + +## 推荐内容 + +- [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 +- [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 +- [GitHub](https://github.com/dyc87112/SpringBoot-Learning):Star支持一下呗 +- [Gitee](https://gitee.com/didispace/SpringBoot-Learning):Star支持一下呗 +- [Spring问答社区](http://www.spring4all.com/):如果您有什么问题,可以去这里发帖 +- [Spring Boot基础教程](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 +- [Spring Cloud基础教程](http://blog.didispace.com/Spring-Cloud%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网最早最全的免费Spring Cloud基础教程 + +## 我的公众号 + + + +## 我出版的书 + +![输入图片说明](https://git.oschina.net/uploads/images/2017/0416/233656_dd3bce94_437188.png "在这里输入图片标题") diff --git a/2.x/chapter1-1/.gitignore b/2.x/chapter1-1/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter1-1/.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/2.x/chapter1-1/pom.xml b/2.x/chapter1-1/pom.xml new file mode 100644 index 00000000..d849128d --- /dev/null +++ b/2.x/chapter1-1/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + com.didispace + chapter1-1 + 0.0.1-SNAPSHOT + chapter1-1 + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter1-1/src/main/java/com/didispace/chapter11/Chapter11Application.java b/2.x/chapter1-1/src/main/java/com/didispace/chapter11/Chapter11Application.java new file mode 100644 index 00000000..17cd4a7c --- /dev/null +++ b/2.x/chapter1-1/src/main/java/com/didispace/chapter11/Chapter11Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter11; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter11Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter11Application.class, args); + } + +} diff --git a/2.x/chapter1-1/src/main/java/com/didispace/chapter11/HelloController.java b/2.x/chapter1-1/src/main/java/com/didispace/chapter11/HelloController.java new file mode 100644 index 00000000..d19b5ef6 --- /dev/null +++ b/2.x/chapter1-1/src/main/java/com/didispace/chapter11/HelloController.java @@ -0,0 +1,14 @@ +package com.didispace.chapter11; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloController { + + @RequestMapping("/hello") + public String index() { + return "Hello World"; + } + +} \ No newline at end of file diff --git a/2.x/chapter1-1/src/main/resources/application.properties b/2.x/chapter1-1/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/2.x/chapter1-1/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/2.x/chapter1-1/src/test/java/com/didispace/chapter11/Chapter11ApplicationTests.java b/2.x/chapter1-1/src/test/java/com/didispace/chapter11/Chapter11ApplicationTests.java new file mode 100644 index 00000000..79cbf107 --- /dev/null +++ b/2.x/chapter1-1/src/test/java/com/didispace/chapter11/Chapter11ApplicationTests.java @@ -0,0 +1,36 @@ +package com.didispace.chapter11; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import static org.hamcrest.Matchers.equalTo; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter11ApplicationTests { + + private MockMvc mvc; + + @Before + public void setUp() { + mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build(); + } + + @Test + public void getHello() throws Exception { + mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("Hello World"))); + } + +} diff --git a/2.x/chapter2-1/.gitignore b/2.x/chapter2-1/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter2-1/.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/2.x/chapter2-1/pom.xml b/2.x/chapter2-1/pom.xml new file mode 100644 index 00000000..8c292e60 --- /dev/null +++ b/2.x/chapter2-1/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter2-1 + 0.0.1-SNAPSHOT + chapter2-1 + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter2-1/src/main/java/com/didispace/chapter21/Chapter21Application.java b/2.x/chapter2-1/src/main/java/com/didispace/chapter21/Chapter21Application.java new file mode 100644 index 00000000..936e8024 --- /dev/null +++ b/2.x/chapter2-1/src/main/java/com/didispace/chapter21/Chapter21Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter21; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter21Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter21Application.class, args); + } + +} diff --git a/2.x/chapter2-1/src/main/java/com/didispace/chapter21/User.java b/2.x/chapter2-1/src/main/java/com/didispace/chapter21/User.java new file mode 100644 index 00000000..1f8749c1 --- /dev/null +++ b/2.x/chapter2-1/src/main/java/com/didispace/chapter21/User.java @@ -0,0 +1,12 @@ +package com.didispace.chapter21; + +import lombok.Data; + +@Data +public class User { + + private Long id; + private String name; + private Integer age; + +} \ No newline at end of file diff --git a/2.x/chapter2-1/src/main/java/com/didispace/chapter21/UserController.java b/2.x/chapter2-1/src/main/java/com/didispace/chapter21/UserController.java new file mode 100644 index 00000000..c855f1a9 --- /dev/null +++ b/2.x/chapter2-1/src/main/java/com/didispace/chapter21/UserController.java @@ -0,0 +1,79 @@ +package com.didispace.chapter21; + +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +@RestController +@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下 +public class UserController { + + // 创建线程安全的Map,模拟users信息的存储 + static Map users = Collections.synchronizedMap(new HashMap()); + + /** + * 处理"/users/"的GET请求,用来获取用户列表 + * + * @return + */ + @GetMapping("/") + public List getUserList() { + // 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递 + List r = new ArrayList(users.values()); + return r; + } + + /** + * 处理"/users/"的POST请求,用来创建User + * + * @param user + * @return + */ + @PostMapping("/") + public String postUser(@RequestBody User user) { + // @RequestBody注解用来绑定通过http请求中application/json类型上传的数据 + users.put(user.getId(), user); + return "success"; + } + + /** + * 处理"/users/{id}"的GET请求,用来获取url中id值的User信息 + * + * @param id + * @return + */ + @GetMapping("/{id}") + public User getUser(@PathVariable Long id) { + // url中的id可通过@PathVariable绑定到函数的参数中 + return users.get(id); + } + + /** + * 处理"/users/{id}"的PUT请求,用来更新User信息 + * + * @param id + * @param user + * @return + */ + @PutMapping("/{id}") + public String putUser(@PathVariable Long id, @RequestBody User user) { + User u = users.get(id); + u.setName(user.getName()); + u.setAge(user.getAge()); + users.put(id, u); + return "success"; + } + + /** + * 处理"/users/{id}"的DELETE请求,用来删除User + * + * @param id + * @return + */ + @DeleteMapping("/{id}") + public String deleteUser(@PathVariable Long id) { + users.remove(id); + return "success"; + } + +} \ No newline at end of file diff --git a/2.x/chapter2-1/src/main/resources/application.properties b/2.x/chapter2-1/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/2.x/chapter2-1/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/2.x/chapter2-1/src/test/java/com/didispace/chapter21/Chapter21ApplicationTests.java b/2.x/chapter2-1/src/test/java/com/didispace/chapter21/Chapter21ApplicationTests.java new file mode 100644 index 00000000..880d2823 --- /dev/null +++ b/2.x/chapter2-1/src/test/java/com/didispace/chapter21/Chapter21ApplicationTests.java @@ -0,0 +1,79 @@ +package com.didispace.chapter21; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.RequestBuilder; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import static org.hamcrest.Matchers.equalTo; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter21ApplicationTests { + + private MockMvc mvc; + + @Before + public void setUp() { + mvc = MockMvcBuilders.standaloneSetup(new UserController()).build(); + } + + @Test + public void testUserController() throws Exception { + // 测试UserController + RequestBuilder request; + + // 1、get查一下user列表,应该为空 + request = get("/users/"); + mvc.perform(request) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("[]"))); + + // 2、post提交一个user + request = post("/users/") + .contentType(MediaType.APPLICATION_JSON) + .content("{\"id\":1,\"name\":\"测试大师\",\"age\":20}"); + mvc.perform(request) + .andExpect(content().string(equalTo("success"))); + + // 3、get获取user列表,应该有刚才插入的数据 + request = get("/users/"); + mvc.perform(request) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("[{\"id\":1,\"name\":\"测试大师\",\"age\":20}]"))); + + // 4、put修改id为1的user + request = put("/users/1") + .contentType(MediaType.APPLICATION_JSON) + .content("{\"name\":\"测试终极大师\",\"age\":30}"); + mvc.perform(request) + .andExpect(content().string(equalTo("success"))); + + // 5、get一个id为1的user + request = get("/users/1"); + mvc.perform(request) + .andExpect(content().string(equalTo("{\"id\":1,\"name\":\"测试终极大师\",\"age\":30}"))); + + // 6、del删除id为1的user + request = delete("/users/1"); + mvc.perform(request) + .andExpect(content().string(equalTo("success"))); + + // 7、get查一下user列表,应该为空 + request = get("/users/"); + mvc.perform(request) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("[]"))); + + } + +} diff --git a/2.x/chapter2-2/.gitignore b/2.x/chapter2-2/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter2-2/.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/2.x/chapter2-2/pom.xml b/2.x/chapter2-2/pom.xml new file mode 100644 index 00000000..aa373bc4 --- /dev/null +++ b/2.x/chapter2-2/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter2-2 + 0.0.1-SNAPSHOT + chapter2-2 + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + com.spring4all + swagger-spring-boot-starter + 1.9.0.RELEASE + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter2-2/src/main/java/com/didispace/chapter22/Chapter22Application.java b/2.x/chapter2-2/src/main/java/com/didispace/chapter22/Chapter22Application.java new file mode 100644 index 00000000..cd6963b8 --- /dev/null +++ b/2.x/chapter2-2/src/main/java/com/didispace/chapter22/Chapter22Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter22; + +import com.spring4all.swagger.EnableSwagger2Doc; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@EnableSwagger2Doc +@SpringBootApplication +public class Chapter22Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter22Application.class, args); + } + +} diff --git a/2.x/chapter2-2/src/main/java/com/didispace/chapter22/User.java b/2.x/chapter2-2/src/main/java/com/didispace/chapter22/User.java new file mode 100644 index 00000000..1a265300 --- /dev/null +++ b/2.x/chapter2-2/src/main/java/com/didispace/chapter22/User.java @@ -0,0 +1,18 @@ +package com.didispace.chapter22; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(description="用户实体") +public class User { + + @ApiModelProperty("用户编号") + private Long id; + @ApiModelProperty("用户姓名") + private String name; + @ApiModelProperty("用户年龄") + private Integer age; + +} \ No newline at end of file diff --git a/2.x/chapter2-2/src/main/java/com/didispace/chapter22/UserController.java b/2.x/chapter2-2/src/main/java/com/didispace/chapter22/UserController.java new file mode 100644 index 00000000..cc517afb --- /dev/null +++ b/2.x/chapter2-2/src/main/java/com/didispace/chapter22/UserController.java @@ -0,0 +1,56 @@ +package com.didispace.chapter22; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +@Api(tags = "用户管理") +@RestController +@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下 +public class UserController { + + // 创建线程安全的Map,模拟users信息的存储 + static Map users = Collections.synchronizedMap(new HashMap<>()); + + @GetMapping("/") + @ApiOperation(value = "获取用户列表") + public List getUserList() { + List r = new ArrayList<>(users.values()); + return r; + } + + @PostMapping("/") + @ApiOperation(value = "创建用户", notes = "根据User对象创建用户") + public String postUser(@RequestBody User user) { + users.put(user.getId(), user); + return "success"; + } + + @GetMapping("/{id}") + @ApiOperation(value = "获取用户详细信息", notes = "根据url的id来获取用户详细信息") + public User getUser(@PathVariable Long id) { + return users.get(id); + } + + @PutMapping("/{id}") + @ApiImplicitParam(paramType = "path", dataType = "Long", name = "id", value = "用户编号", required = true, example = "1") + @ApiOperation(value = "更新用户详细信息", notes = "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息") + public String putUser(@PathVariable Long id, @RequestBody User user) { + User u = users.get(id); + u.setName(user.getName()); + u.setAge(user.getAge()); + users.put(id, u); + return "success"; + } + + @DeleteMapping("/{id}") + @ApiOperation(value = "删除用户", notes = "根据url的id来指定删除对象") + public String deleteUser(@PathVariable Long id) { + users.remove(id); + return "success"; + } + +} \ No newline at end of file diff --git a/2.x/chapter2-2/src/main/resources/application.properties b/2.x/chapter2-2/src/main/resources/application.properties new file mode 100644 index 00000000..55ec2942 --- /dev/null +++ b/2.x/chapter2-2/src/main/resources/application.properties @@ -0,0 +1,13 @@ + + +swagger.title=spring-boot-starter-swagger +swagger.description=Starter for swagger 2.x +swagger.version=1.9.0.RELEASE +swagger.license=Apache License, Version 2.0 +swagger.licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.html +swagger.termsOfServiceUrl=https://github.com/dyc87112/spring-boot-starter-swagger +swagger.contact.name=didi +swagger.contact.url=http://blog.didispace.com +swagger.contact.email=dyc87112@qq.com +swagger.base-package=com.didispace +swagger.base-path=/** \ No newline at end of file diff --git a/2.x/chapter2-3/.gitignore b/2.x/chapter2-3/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter2-3/.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/2.x/chapter2-3/pom.xml b/2.x/chapter2-3/pom.xml new file mode 100644 index 00000000..284c9d0d --- /dev/null +++ b/2.x/chapter2-3/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter2-3 + 0.0.1-SNAPSHOT + chapter2-3 + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + com.spring4all + swagger-spring-boot-starter + 1.9.0.RELEASE + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter2-3/src/main/java/com/didispace/chapter23/Chapter23Application.java b/2.x/chapter2-3/src/main/java/com/didispace/chapter23/Chapter23Application.java new file mode 100644 index 00000000..7ecdd42d --- /dev/null +++ b/2.x/chapter2-3/src/main/java/com/didispace/chapter23/Chapter23Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter23; + +import com.spring4all.swagger.EnableSwagger2Doc; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@EnableSwagger2Doc +@SpringBootApplication +public class Chapter23Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter23Application.class, args); + } + +} diff --git a/2.x/chapter2-3/src/main/java/com/didispace/chapter23/User.java b/2.x/chapter2-3/src/main/java/com/didispace/chapter23/User.java new file mode 100644 index 00000000..12f85c88 --- /dev/null +++ b/2.x/chapter2-3/src/main/java/com/didispace/chapter23/User.java @@ -0,0 +1,32 @@ +package com.didispace.chapter23; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.*; + +@Data +@ApiModel(description = "用户实体") +public class User { + + @ApiModelProperty("用户编号") + private Long id; + + @NotNull + @Size(min = 2, max = 5) + @ApiModelProperty("用户姓名") + private String name; + + @NotNull + @Max(100) + @Min(10) + @ApiModelProperty("用户年龄") + private Integer age; + + @NotNull + @Email + @ApiModelProperty("用户邮箱") + private String email; + +} \ No newline at end of file diff --git a/2.x/chapter2-3/src/main/java/com/didispace/chapter23/UserController.java b/2.x/chapter2-3/src/main/java/com/didispace/chapter23/UserController.java new file mode 100644 index 00000000..963ac4c4 --- /dev/null +++ b/2.x/chapter2-3/src/main/java/com/didispace/chapter23/UserController.java @@ -0,0 +1,57 @@ +package com.didispace.chapter23; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.*; + +@Api(tags = "用户管理") +@RestController +@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下 +public class UserController { + + // 创建线程安全的Map,模拟users信息的存储 + static Map users = Collections.synchronizedMap(new HashMap<>()); + + @GetMapping("/") + @ApiOperation(value = "获取用户列表") + public List getUserList() { + List r = new ArrayList<>(users.values()); + return r; + } + + @PostMapping("/") + @ApiOperation(value = "创建用户", notes = "根据User对象创建用户") + public String postUser(@Valid @RequestBody User user) { + users.put(user.getId(), user); + return "success"; + } + + @GetMapping("/{id}") + @ApiOperation(value = "获取用户详细信息", notes = "根据url的id来获取用户详细信息") + public User getUser(@PathVariable Long id) { + return users.get(id); + } + + @PutMapping("/{id}") + @ApiImplicitParam(paramType = "path", dataType = "Long", name = "id", value = "用户编号", required = true, example = "1") + @ApiOperation(value = "更新用户详细信息", notes = "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息") + public String putUser(@PathVariable Long id, @RequestBody User user) { + User u = users.get(id); + u.setName(user.getName()); + u.setAge(user.getAge()); + users.put(id, u); + return "success"; + } + + @DeleteMapping("/{id}") + @ApiOperation(value = "删除用户", notes = "根据url的id来指定删除对象") + public String deleteUser(@PathVariable Long id) { + users.remove(id); + return "success"; + } + +} \ No newline at end of file diff --git a/2.x/chapter2-3/src/main/resources/application.properties b/2.x/chapter2-3/src/main/resources/application.properties new file mode 100644 index 00000000..55ec2942 --- /dev/null +++ b/2.x/chapter2-3/src/main/resources/application.properties @@ -0,0 +1,13 @@ + + +swagger.title=spring-boot-starter-swagger +swagger.description=Starter for swagger 2.x +swagger.version=1.9.0.RELEASE +swagger.license=Apache License, Version 2.0 +swagger.licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.html +swagger.termsOfServiceUrl=https://github.com/dyc87112/spring-boot-starter-swagger +swagger.contact.name=didi +swagger.contact.url=http://blog.didispace.com +swagger.contact.email=dyc87112@qq.com +swagger.base-package=com.didispace +swagger.base-path=/** \ No newline at end of file diff --git a/2.x/chapter2-4/.gitignore b/2.x/chapter2-4/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter2-4/.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/2.x/chapter2-4/pom.xml b/2.x/chapter2-4/pom.xml new file mode 100644 index 00000000..8dcad73d --- /dev/null +++ b/2.x/chapter2-4/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter2-4 + 0.0.1-SNAPSHOT + chapter2-4 + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + com.spring4all + swagger-spring-boot-starter + 1.9.0.RELEASE + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter2-4/src/main/java/com/didispace/chapter24/Chapter24Application.java b/2.x/chapter2-4/src/main/java/com/didispace/chapter24/Chapter24Application.java new file mode 100644 index 00000000..736bc4f3 --- /dev/null +++ b/2.x/chapter2-4/src/main/java/com/didispace/chapter24/Chapter24Application.java @@ -0,0 +1,61 @@ +package com.didispace.chapter24; + +import com.spring4all.swagger.EnableSwagger2Doc; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.Tag; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; + +@EnableSwagger2Doc +@SpringBootApplication +public class Chapter24Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter24Application.class, args); + } + + @Api(tags = {"1-教师管理","3-教学管理"}) + @RestController + @RequestMapping(value = "/teacher") + static class TeacherController { + + @ApiOperation(value = "xxx") + @GetMapping("/xxx") + public String xxx() { + return "xxx"; + } + + } + + @Api(tags = {"2-学生管理"}) + @RestController + @RequestMapping(value = "/student") + static class StudentController { + + @ApiOperation(value = "获取学生清单", tags = "3-教学管理") + @GetMapping("/list") + public String bbb() { + return "bbb"; + } + + @ApiOperation("获取教某个学生的老师清单") + @GetMapping("/his-teachers") + public String ccc() { + return "ccc"; + } + + @ApiOperation("创建一个学生") + @PostMapping("/aaa") + public String aaa() { + return "aaa"; + } + + } + +} diff --git a/2.x/chapter2-4/src/main/java/com/didispace/chapter24/User.java b/2.x/chapter2-4/src/main/java/com/didispace/chapter24/User.java new file mode 100644 index 00000000..1d13b648 --- /dev/null +++ b/2.x/chapter2-4/src/main/java/com/didispace/chapter24/User.java @@ -0,0 +1,32 @@ +package com.didispace.chapter24; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.*; + +@Data +@ApiModel(description = "用户实体") +public class User { + + @ApiModelProperty(value = "用户编号", position = 1) + private Long id; + + @NotNull + @Size(min = 2, max = 5) + @ApiModelProperty(value = "用户姓名", position = 2) + private String name; + + @NotNull + @Max(100) + @Min(10) + @ApiModelProperty(value = "用户年龄", position = 3) + private Integer age; + + @NotNull + @Email + @ApiModelProperty(value = "用户邮箱", position = 4) + private String email; + +} \ No newline at end of file diff --git a/2.x/chapter2-4/src/main/java/com/didispace/chapter24/UserController.java b/2.x/chapter2-4/src/main/java/com/didispace/chapter24/UserController.java new file mode 100644 index 00000000..871a2d9b --- /dev/null +++ b/2.x/chapter2-4/src/main/java/com/didispace/chapter24/UserController.java @@ -0,0 +1,57 @@ +package com.didispace.chapter24; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.*; + +@Api(tags = "用户管理") +@RestController +@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下 +public class UserController { + + // 创建线程安全的Map,模拟users信息的存储 + static Map users = Collections.synchronizedMap(new HashMap<>()); + + @GetMapping("/") + @ApiOperation(value = "获取用户列表") + public List getUserList() { + List r = new ArrayList<>(users.values()); + return r; + } + + @PostMapping("/") + @ApiOperation(value = "创建用户", notes = "根据User对象创建用户") + public String postUser(@Valid @RequestBody User user) { + users.put(user.getId(), user); + return "success"; + } + + @GetMapping("/{id}") + @ApiOperation(value = "获取用户详细信息", notes = "根据url的id来获取用户详细信息") + public User getUser(@PathVariable Long id) { + return users.get(id); + } + + @PutMapping("/{id}") + @ApiImplicitParam(paramType = "path", dataType = "Long", name = "id", value = "用户编号", required = true, example = "1") + @ApiOperation(value = "更新用户详细信息", notes = "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息") + public String putUser(@PathVariable Long id, @RequestBody User user) { + User u = users.get(id); + u.setName(user.getName()); + u.setAge(user.getAge()); + users.put(id, u); + return "success"; + } + + @DeleteMapping("/{id}") + @ApiOperation(value = "删除用户", notes = "根据url的id来指定删除对象") + public String deleteUser(@PathVariable Long id) { + users.remove(id); + return "success"; + } + +} \ No newline at end of file diff --git a/2.x/chapter2-4/src/main/resources/application.properties b/2.x/chapter2-4/src/main/resources/application.properties new file mode 100644 index 00000000..335a5f4b --- /dev/null +++ b/2.x/chapter2-4/src/main/resources/application.properties @@ -0,0 +1,16 @@ + + +swagger.title=spring-boot-starter-swagger +swagger.description=Starter for swagger 2.x +swagger.version=1.9.0.RELEASE +swagger.license=Apache License, Version 2.0 +swagger.licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.html +swagger.termsOfServiceUrl=https://github.com/dyc87112/spring-boot-starter-swagger +swagger.contact.name=didi +swagger.contact.url=http://blog.didispace.com +swagger.contact.email=dyc87112@qq.com +swagger.base-package=com.didispace +swagger.base-path=/** + +swagger.ui-config.tags-sorter=alpha +swagger.ui-config.operations-sorter=alpha \ No newline at end of file diff --git a/2.x/chapter2-5/.gitignore b/2.x/chapter2-5/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter2-5/.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/2.x/chapter2-5/pom.xml b/2.x/chapter2-5/pom.xml new file mode 100644 index 00000000..9ffaafe8 --- /dev/null +++ b/2.x/chapter2-5/pom.xml @@ -0,0 +1,102 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter2-5 + 0.0.1-SNAPSHOT + chapter2-5 + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + com.spring4all + swagger-spring-boot-starter + 1.9.0.RELEASE + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + + io.github.swagger2markup + swagger2markup + 1.3.3 + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + io.github.swagger2markup + swagger2markup-maven-plugin + 1.3.3 + + http://localhost:8080/v2/api-docs + src/docs/asciidoc/generated-by-plugin + + ASCIIDOC + + + + + + org.asciidoctor + asciidoctor-maven-plugin + 1.5.6 + + src/docs/asciidoc/generated + src/docs/asciidoc/html + html + coderay + + left + + + + + + + + + + false + + jcenter-releases + jcenter + http://jcenter.bintray.com + + + + diff --git a/2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/definitions.adoc b/2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/definitions.adoc new file mode 100644 index 00000000..3a20e7fb --- /dev/null +++ b/2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/definitions.adoc @@ -0,0 +1,22 @@ + +[[_definitions]] +== Definitions + +[[_user]] +=== User +用户实体 + + +[options="header", cols=".^3,.^11,.^4"] +|=== +|Name|Description|Schema +|**age** + +__optional__|用户年龄|integer (int32) +|**id** + +__optional__|用户编号|integer (int64) +|**name** + +__optional__|用户姓名|string +|=== + + + diff --git a/2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/overview.adoc b/2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/overview.adoc new file mode 100644 index 00000000..4b9eefbf --- /dev/null +++ b/2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/overview.adoc @@ -0,0 +1,38 @@ += spring-boot-starter-swagger + + +[[_overview]] +== Overview +Starter for swagger 2.x + + +=== Version information +[%hardbreaks] +__Version__ : 1.9.0.RELEASE + + +=== Contact information +[%hardbreaks] +__Contact__ : didi +__Contact Email__ : dyc87112@qq.com + + +=== License information +[%hardbreaks] +__License__ : Apache License, Version 2.0 +__License URL__ : https://www.apache.org/licenses/LICENSE-2.0.html +__Terms of service__ : https://github.com/dyc87112/spring-boot-starter-swagger + + +=== URI scheme +[%hardbreaks] +__Host__ : localhost:8080 +__BasePath__ : / + + +=== Tags + +* 用户管理 : User Controller + + + diff --git a/2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/paths.adoc b/2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/paths.adoc new file mode 100644 index 00000000..5e9cf92f --- /dev/null +++ b/2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/paths.adoc @@ -0,0 +1,265 @@ + +[[_paths]] +== Paths + +[[_postuserusingpost]] +=== 创建用户 +.... +POST /users/ +.... + + +==== Description +根据User对象创建用户 + + +==== Parameters + +[options="header", cols=".^2,.^3,.^9,.^4"] +|=== +|Type|Name|Description|Schema +|**Body**|**user** + +__required__|user|<<_user,User>> +|=== + + +==== Responses + +[options="header", cols=".^2,.^14,.^4"] +|=== +|HTTP Code|Description|Schema +|**200**|OK|string +|**201**|Created|No Content +|**401**|Unauthorized|No Content +|**403**|Forbidden|No Content +|**404**|Not Found|No Content +|=== + + +==== Consumes + +* `application/json` + + +==== Produces + +* `*/*` + + +==== Tags + +* 用户管理 + + +==== Security + +[options="header", cols=".^3,.^4,.^13"] +|=== +|Type|Name|Scopes +|**apiKey**|**<<_authorization,Authorization>>**|global +|=== + + +[[_getuserlistusingget]] +=== 获取用户列表 +.... +GET /users/ +.... + + +==== Responses + +[options="header", cols=".^2,.^14,.^4"] +|=== +|HTTP Code|Description|Schema +|**200**|OK|< <<_user,User>> > array +|**401**|Unauthorized|No Content +|**403**|Forbidden|No Content +|**404**|Not Found|No Content +|=== + + +==== Produces + +* `*/*` + + +==== Tags + +* 用户管理 + + +==== Security + +[options="header", cols=".^3,.^4,.^13"] +|=== +|Type|Name|Scopes +|**apiKey**|**<<_authorization,Authorization>>**|global +|=== + + +[[_getuserusingget]] +=== 获取用户详细信息 +.... +GET /users/{id} +.... + + +==== Description +根据url的id来获取用户详细信息 + + +==== Parameters + +[options="header", cols=".^2,.^3,.^9,.^4"] +|=== +|Type|Name|Description|Schema +|**Path**|**id** + +__required__|id|integer (int64) +|=== + + +==== Responses + +[options="header", cols=".^2,.^14,.^4"] +|=== +|HTTP Code|Description|Schema +|**200**|OK|<<_user,User>> +|**401**|Unauthorized|No Content +|**403**|Forbidden|No Content +|**404**|Not Found|No Content +|=== + + +==== Produces + +* `*/*` + + +==== Tags + +* 用户管理 + + +==== Security + +[options="header", cols=".^3,.^4,.^13"] +|=== +|Type|Name|Scopes +|**apiKey**|**<<_authorization,Authorization>>**|global +|=== + + +[[_putuserusingput]] +=== 更新用户详细信息 +.... +PUT /users/{id} +.... + + +==== Description +根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息 + + +==== Parameters + +[options="header", cols=".^2,.^3,.^9,.^4"] +|=== +|Type|Name|Description|Schema +|**Path**|**id** + +__required__|用户编号|integer (int64) +|**Body**|**user** + +__required__|user|<<_user,User>> +|=== + + +==== Responses + +[options="header", cols=".^2,.^14,.^4"] +|=== +|HTTP Code|Description|Schema +|**200**|OK|string +|**201**|Created|No Content +|**401**|Unauthorized|No Content +|**403**|Forbidden|No Content +|**404**|Not Found|No Content +|=== + + +==== Consumes + +* `application/json` + + +==== Produces + +* `*/*` + + +==== Tags + +* 用户管理 + + +==== Security + +[options="header", cols=".^3,.^4,.^13"] +|=== +|Type|Name|Scopes +|**apiKey**|**<<_authorization,Authorization>>**|global +|=== + + +[[_deleteuserusingdelete]] +=== 删除用户 +.... +DELETE /users/{id} +.... + + +==== Description +根据url的id来指定删除对象 + + +==== Parameters + +[options="header", cols=".^2,.^3,.^9,.^4"] +|=== +|Type|Name|Description|Schema +|**Path**|**id** + +__required__|id|integer (int64) +|=== + + +==== Responses + +[options="header", cols=".^2,.^14,.^4"] +|=== +|HTTP Code|Description|Schema +|**200**|OK|string +|**204**|No Content|No Content +|**401**|Unauthorized|No Content +|**403**|Forbidden|No Content +|=== + + +==== Produces + +* `*/*` + + +==== Tags + +* 用户管理 + + +==== Security + +[options="header", cols=".^3,.^4,.^13"] +|=== +|Type|Name|Scopes +|**apiKey**|**<<_authorization,Authorization>>**|global +|=== + + + diff --git a/2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/security.adoc b/2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/security.adoc new file mode 100644 index 00000000..01db83a5 --- /dev/null +++ b/2.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/security.adoc @@ -0,0 +1,13 @@ + +[[_securityscheme]] +== Security + +[[_authorization]] +=== Authorization +[%hardbreaks] +__Type__ : apiKey +__Name__ : TOKEN +__In__ : HEADER + + + diff --git a/2.x/chapter2-5/src/docs/asciidoc/generated/definitions.adoc b/2.x/chapter2-5/src/docs/asciidoc/generated/definitions.adoc new file mode 100644 index 00000000..a739bda5 --- /dev/null +++ b/2.x/chapter2-5/src/docs/asciidoc/generated/definitions.adoc @@ -0,0 +1,22 @@ + +[[_definitions]] +== Definitions + +[[_user]] +=== User +用户实体 + + +[options="header", cols=".^3a,.^11a,.^4a"] +|=== +|Name|Description|Schema +|**age** + +__optional__|用户年龄|integer (int32) +|**id** + +__optional__|用户编号|integer (int64) +|**name** + +__optional__|用户姓名|string +|=== + + + diff --git a/2.x/chapter2-5/src/docs/asciidoc/generated/overview.adoc b/2.x/chapter2-5/src/docs/asciidoc/generated/overview.adoc new file mode 100644 index 00000000..4b9eefbf --- /dev/null +++ b/2.x/chapter2-5/src/docs/asciidoc/generated/overview.adoc @@ -0,0 +1,38 @@ += spring-boot-starter-swagger + + +[[_overview]] +== Overview +Starter for swagger 2.x + + +=== Version information +[%hardbreaks] +__Version__ : 1.9.0.RELEASE + + +=== Contact information +[%hardbreaks] +__Contact__ : didi +__Contact Email__ : dyc87112@qq.com + + +=== License information +[%hardbreaks] +__License__ : Apache License, Version 2.0 +__License URL__ : https://www.apache.org/licenses/LICENSE-2.0.html +__Terms of service__ : https://github.com/dyc87112/spring-boot-starter-swagger + + +=== URI scheme +[%hardbreaks] +__Host__ : localhost:8080 +__BasePath__ : / + + +=== Tags + +* 用户管理 : User Controller + + + diff --git a/2.x/chapter2-5/src/docs/asciidoc/generated/paths.adoc b/2.x/chapter2-5/src/docs/asciidoc/generated/paths.adoc new file mode 100644 index 00000000..6fa4471d --- /dev/null +++ b/2.x/chapter2-5/src/docs/asciidoc/generated/paths.adoc @@ -0,0 +1,265 @@ + +[[_paths]] +== Paths + +[[_postuserusingpost]] +=== 创建用户 +.... +POST /users/ +.... + + +==== Description +根据User对象创建用户 + + +==== Parameters + +[options="header", cols=".^2a,.^3a,.^9a,.^4a"] +|=== +|Type|Name|Description|Schema +|**Body**|**user** + +__required__|user|<<_user,User>> +|=== + + +==== Responses + +[options="header", cols=".^2a,.^14a,.^4a"] +|=== +|HTTP Code|Description|Schema +|**200**|OK|string +|**201**|Created|No Content +|**401**|Unauthorized|No Content +|**403**|Forbidden|No Content +|**404**|Not Found|No Content +|=== + + +==== Consumes + +* `application/json` + + +==== Produces + +* `\*/*` + + +==== Tags + +* 用户管理 + + +==== Security + +[options="header", cols=".^3a,.^4a,.^13a"] +|=== +|Type|Name|Scopes +|**apiKey**|**<<_authorization,Authorization>>**|global +|=== + + +[[_getuserlistusingget]] +=== 获取用户列表 +.... +GET /users/ +.... + + +==== Responses + +[options="header", cols=".^2a,.^14a,.^4a"] +|=== +|HTTP Code|Description|Schema +|**200**|OK|< <<_user,User>> > array +|**401**|Unauthorized|No Content +|**403**|Forbidden|No Content +|**404**|Not Found|No Content +|=== + + +==== Produces + +* `\*/*` + + +==== Tags + +* 用户管理 + + +==== Security + +[options="header", cols=".^3a,.^4a,.^13a"] +|=== +|Type|Name|Scopes +|**apiKey**|**<<_authorization,Authorization>>**|global +|=== + + +[[_getuserusingget]] +=== 获取用户详细信息 +.... +GET /users/{id} +.... + + +==== Description +根据url的id来获取用户详细信息 + + +==== Parameters + +[options="header", cols=".^2a,.^3a,.^9a,.^4a"] +|=== +|Type|Name|Description|Schema +|**Path**|**id** + +__required__|id|integer (int64) +|=== + + +==== Responses + +[options="header", cols=".^2a,.^14a,.^4a"] +|=== +|HTTP Code|Description|Schema +|**200**|OK|<<_user,User>> +|**401**|Unauthorized|No Content +|**403**|Forbidden|No Content +|**404**|Not Found|No Content +|=== + + +==== Produces + +* `\*/*` + + +==== Tags + +* 用户管理 + + +==== Security + +[options="header", cols=".^3a,.^4a,.^13a"] +|=== +|Type|Name|Scopes +|**apiKey**|**<<_authorization,Authorization>>**|global +|=== + + +[[_putuserusingput]] +=== 更新用户详细信息 +.... +PUT /users/{id} +.... + + +==== Description +根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息 + + +==== Parameters + +[options="header", cols=".^2a,.^3a,.^9a,.^4a"] +|=== +|Type|Name|Description|Schema +|**Path**|**id** + +__required__|用户编号|integer (int64) +|**Body**|**user** + +__required__|user|<<_user,User>> +|=== + + +==== Responses + +[options="header", cols=".^2a,.^14a,.^4a"] +|=== +|HTTP Code|Description|Schema +|**200**|OK|string +|**201**|Created|No Content +|**401**|Unauthorized|No Content +|**403**|Forbidden|No Content +|**404**|Not Found|No Content +|=== + + +==== Consumes + +* `application/json` + + +==== Produces + +* `\*/*` + + +==== Tags + +* 用户管理 + + +==== Security + +[options="header", cols=".^3a,.^4a,.^13a"] +|=== +|Type|Name|Scopes +|**apiKey**|**<<_authorization,Authorization>>**|global +|=== + + +[[_deleteuserusingdelete]] +=== 删除用户 +.... +DELETE /users/{id} +.... + + +==== Description +根据url的id来指定删除对象 + + +==== Parameters + +[options="header", cols=".^2a,.^3a,.^9a,.^4a"] +|=== +|Type|Name|Description|Schema +|**Path**|**id** + +__required__|id|integer (int64) +|=== + + +==== Responses + +[options="header", cols=".^2a,.^14a,.^4a"] +|=== +|HTTP Code|Description|Schema +|**200**|OK|string +|**204**|No Content|No Content +|**401**|Unauthorized|No Content +|**403**|Forbidden|No Content +|=== + + +==== Produces + +* `\*/*` + + +==== Tags + +* 用户管理 + + +==== Security + +[options="header", cols=".^3a,.^4a,.^13a"] +|=== +|Type|Name|Scopes +|**apiKey**|**<<_authorization,Authorization>>**|global +|=== + + + diff --git a/2.x/chapter2-5/src/docs/asciidoc/generated/security.adoc b/2.x/chapter2-5/src/docs/asciidoc/generated/security.adoc new file mode 100644 index 00000000..01db83a5 --- /dev/null +++ b/2.x/chapter2-5/src/docs/asciidoc/generated/security.adoc @@ -0,0 +1,13 @@ + +[[_securityscheme]] +== Security + +[[_authorization]] +=== Authorization +[%hardbreaks] +__Type__ : apiKey +__Name__ : TOKEN +__In__ : HEADER + + + diff --git a/2.x/chapter2-5/src/docs/asciidoc/html/definitions.html b/2.x/chapter2-5/src/docs/asciidoc/html/definitions.html new file mode 100644 index 00000000..1a9a17f8 --- /dev/null +++ b/2.x/chapter2-5/src/docs/asciidoc/html/definitions.html @@ -0,0 +1,603 @@ + + + + + + + +Definitions + + + + + + +
+
+

Definitions

+
+
+

User

+
+

用户实体

+
+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionSchema
+

age
+optional

+
+

用户年龄

+
+

integer (int32)

+
+

id
+optional

+
+

用户编号

+
+

integer (int64)

+
+

name
+optional

+
+

用户姓名

+
+

string

+
+
+
+
+
+ + + \ No newline at end of file diff --git a/2.x/chapter2-5/src/docs/asciidoc/html/overview.html b/2.x/chapter2-5/src/docs/asciidoc/html/overview.html new file mode 100644 index 00000000..842077bb --- /dev/null +++ b/2.x/chapter2-5/src/docs/asciidoc/html/overview.html @@ -0,0 +1,591 @@ + + + + + + + +spring-boot-starter-swagger + + + + + + +
+
+

Overview

+
+
+

Starter for swagger 2.x

+
+
+

Version information

+
+

Version : 1.9.0.RELEASE

+
+
+
+

Contact information

+
+

Contact : didi
+Contact Email : dyc87112@qq.com

+
+
+
+

License information

+
+

License : Apache License, Version 2.0
+License URL : https://www.apache.org/licenses/LICENSE-2.0.html
+Terms of service : https://github.com/dyc87112/spring-boot-starter-swagger

+
+
+
+

URI scheme

+
+

Host : localhost:8080
+BasePath : /

+
+
+
+

Tags

+
+
    +
  • +

    用户管理 : User Controller

    +
  • +
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/2.x/chapter2-5/src/docs/asciidoc/html/paths.html b/2.x/chapter2-5/src/docs/asciidoc/html/paths.html new file mode 100644 index 00000000..4b3d92d4 --- /dev/null +++ b/2.x/chapter2-5/src/docs/asciidoc/html/paths.html @@ -0,0 +1,1379 @@ + + + + + + + +Paths + + + + + + +
+
+

Paths

+
+
+

创建用户

+
+
+
POST /users/
+
+
+
+

Description

+
+

根据User对象创建用户

+
+
+
+

Parameters

+ ++++++ + + + + + + + + + + + + + + + + +
TypeNameDescriptionSchema
+

Body

+
+

user
+required

+
+

user

+
+

User

+
+
+
+

Responses

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HTTP CodeDescriptionSchema
+

200

+
+

OK

+
+

string

+
+

201

+
+

Created

+
+

No Content

+
+

401

+
+

Unauthorized

+
+

No Content

+
+

403

+
+

Forbidden

+
+

No Content

+
+

404

+
+

Not Found

+
+

No Content

+
+
+
+

Consumes

+
+
    +
  • +

    application/json

    +
  • +
+
+
+
+

Produces

+
+
    +
  • +

    */*

    +
  • +
+
+
+
+

Tags

+
+
    +
  • +

    用户管理

    +
  • +
+
+
+
+

Security

+ +++++ + + + + + + + + + + + + + + +
TypeNameScopes
+

apiKey

+
+

global

+
+
+
+
+

获取用户列表

+
+
+
GET /users/
+
+
+
+

Responses

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HTTP CodeDescriptionSchema
+

200

+
+

OK

+
+

< User > array

+
+

401

+
+

Unauthorized

+
+

No Content

+
+

403

+
+

Forbidden

+
+

No Content

+
+

404

+
+

Not Found

+
+

No Content

+
+
+
+

Produces

+
+
    +
  • +

    */*

    +
  • +
+
+
+
+

Tags

+
+
    +
  • +

    用户管理

    +
  • +
+
+
+
+

Security

+ +++++ + + + + + + + + + + + + + + +
TypeNameScopes
+

apiKey

+
+

global

+
+
+
+
+

获取用户详细信息

+
+
+
GET /users/{id}
+
+
+
+

Description

+
+

根据url的id来获取用户详细信息

+
+
+
+

Parameters

+ ++++++ + + + + + + + + + + + + + + + + +
TypeNameDescriptionSchema
+

Path

+
+

id
+required

+
+

id

+
+

integer (int64)

+
+
+
+

Responses

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HTTP CodeDescriptionSchema
+

200

+
+

OK

+
+

User

+
+

401

+
+

Unauthorized

+
+

No Content

+
+

403

+
+

Forbidden

+
+

No Content

+
+

404

+
+

Not Found

+
+

No Content

+
+
+
+

Produces

+
+
    +
  • +

    */*

    +
  • +
+
+
+
+

Tags

+
+
    +
  • +

    用户管理

    +
  • +
+
+
+
+

Security

+ +++++ + + + + + + + + + + + + + + +
TypeNameScopes
+

apiKey

+
+

global

+
+
+
+
+

更新用户详细信息

+
+
+
PUT /users/{id}
+
+
+
+

Description

+
+

根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息

+
+
+
+

Parameters

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + +
TypeNameDescriptionSchema
+

Path

+
+

id
+required

+
+

用户编号

+
+

integer (int64)

+
+

Body

+
+

user
+required

+
+

user

+
+

User

+
+
+
+

Responses

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HTTP CodeDescriptionSchema
+

200

+
+

OK

+
+

string

+
+

201

+
+

Created

+
+

No Content

+
+

401

+
+

Unauthorized

+
+

No Content

+
+

403

+
+

Forbidden

+
+

No Content

+
+

404

+
+

Not Found

+
+

No Content

+
+
+
+

Consumes

+
+
    +
  • +

    application/json

    +
  • +
+
+
+
+

Produces

+
+
    +
  • +

    */*

    +
  • +
+
+
+
+

Tags

+
+
    +
  • +

    用户管理

    +
  • +
+
+
+
+

Security

+ +++++ + + + + + + + + + + + + + + +
TypeNameScopes
+

apiKey

+
+

global

+
+
+
+
+

删除用户

+
+
+
DELETE /users/{id}
+
+
+
+

Description

+
+

根据url的id来指定删除对象

+
+
+
+

Parameters

+ ++++++ + + + + + + + + + + + + + + + + +
TypeNameDescriptionSchema
+

Path

+
+

id
+required

+
+

id

+
+

integer (int64)

+
+
+
+

Responses

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HTTP CodeDescriptionSchema
+

200

+
+

OK

+
+

string

+
+

204

+
+

No Content

+
+

No Content

+
+

401

+
+

Unauthorized

+
+

No Content

+
+

403

+
+

Forbidden

+
+

No Content

+
+
+
+

Produces

+
+
    +
  • +

    */*

    +
  • +
+
+
+
+

Tags

+
+
    +
  • +

    用户管理

    +
  • +
+
+
+
+

Security

+ +++++ + + + + + + + + + + + + + + +
TypeNameScopes
+

apiKey

+
+

global

+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/2.x/chapter2-5/src/docs/asciidoc/html/security.html b/2.x/chapter2-5/src/docs/asciidoc/html/security.html new file mode 100644 index 00000000..34676fab --- /dev/null +++ b/2.x/chapter2-5/src/docs/asciidoc/html/security.html @@ -0,0 +1,553 @@ + + + + + + + +Security + + + + + + +
+
+

Security

+
+
+

Authorization

+
+

Type : apiKey
+Name : TOKEN
+In : HEADER

+
+
+
+
+
+ + + \ No newline at end of file diff --git a/2.x/chapter2-5/src/docs/confluence/generated/definitions.txt b/2.x/chapter2-5/src/docs/confluence/generated/definitions.txt new file mode 100644 index 00000000..6792429a --- /dev/null +++ b/2.x/chapter2-5/src/docs/confluence/generated/definitions.txt @@ -0,0 +1,14 @@ + +h2. Definitions {anchor:definitions} + +h3. User {anchor:user} +用户实体 + + +||Name||Description||Schema|| +|*age*\\ \\ _optional_||用户年龄||integer (int32)| +|*id*\\ \\ _optional_||用户编号||integer (int64)| +|*name*\\ \\ _optional_||用户姓名||string| + + + diff --git a/2.x/chapter2-5/src/docs/confluence/generated/overview.txt b/2.x/chapter2-5/src/docs/confluence/generated/overview.txt new file mode 100644 index 00000000..af12d61b --- /dev/null +++ b/2.x/chapter2-5/src/docs/confluence/generated/overview.txt @@ -0,0 +1,33 @@ +h1. spring-boot-starter-swagger + + +h2. Overview {anchor:overview} +Starter for swagger 2.x + + +h3. Version information +_Version_ : 1.9.0.RELEASE + + +h3. Contact information +_Contact_ : didi\\ +_Contact Email_ : dyc87112@qq.com + + +h3. License information +_License_ : Apache License, Version 2.0\\ +_License URL_ : https://www.apache.org/licenses/LICENSE-2.0.html\\ +_Terms of service_ : https://github.com/dyc87112/spring-boot-starter-swagger + + +h3. URI scheme +_Host_ : localhost:8080\\ +_BasePath_ : / + + +h3. Tags + +* 用户管理 : User Controller + + + diff --git a/2.x/chapter2-5/src/docs/confluence/generated/paths.txt b/2.x/chapter2-5/src/docs/confluence/generated/paths.txt new file mode 100644 index 00000000..5b169e5d --- /dev/null +++ b/2.x/chapter2-5/src/docs/confluence/generated/paths.txt @@ -0,0 +1,212 @@ + +h2. Paths {anchor:paths} + +h3. 创建用户 {anchor:postuserusingpost} +{noformat} +POST /users/ +{noformat} + + +h4. Description +根据User对象创建用户 + + +h4. Parameters + +||Type||Name||Description||Schema|| +|*Body*|*user*\\ \\ _required_||user||[User|#user]| + + +h4. Responses + +||HTTP Code||Description||Schema|| +|*200*||OK||string| +|*201*||Created||No Content| +|*401*||Unauthorized||No Content| +|*403*||Forbidden||No Content| +|*404*||Not Found||No Content| + + +h4. Consumes + +* {noformat}application/json{noformat} + + +h4. Produces + +* {noformat}\*/*{noformat} + + +h4. Tags + +* 用户管理 + + +h4. Security + +||Type||Name||Scopes|| +|*apiKey*|*[Authorization|#authorization]*||global| + + +h3. 获取用户列表 {anchor:getuserlistusingget} +{noformat} +GET /users/ +{noformat} + + +h4. Responses + +||HTTP Code||Description||Schema|| +|*200*||OK||< [User|#user] > array| +|*401*||Unauthorized||No Content| +|*403*||Forbidden||No Content| +|*404*||Not Found||No Content| + + +h4. Produces + +* {noformat}\*/*{noformat} + + +h4. Tags + +* 用户管理 + + +h4. Security + +||Type||Name||Scopes|| +|*apiKey*|*[Authorization|#authorization]*||global| + + +h3. 获取用户详细信息 {anchor:getuserusingget} +{noformat} +GET /users/{id} +{noformat} + + +h4. Description +根据url的id来获取用户详细信息 + + +h4. Parameters + +||Type||Name||Description||Schema|| +|*Path*|*id*\\ \\ _required_||id||integer (int64)| + + +h4. Responses + +||HTTP Code||Description||Schema|| +|*200*||OK||[User|#user]| +|*401*||Unauthorized||No Content| +|*403*||Forbidden||No Content| +|*404*||Not Found||No Content| + + +h4. Produces + +* {noformat}\*/*{noformat} + + +h4. Tags + +* 用户管理 + + +h4. Security + +||Type||Name||Scopes|| +|*apiKey*|*[Authorization|#authorization]*||global| + + +h3. 更新用户详细信息 {anchor:putuserusingput} +{noformat} +PUT /users/{id} +{noformat} + + +h4. Description +根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息 + + +h4. Parameters + +||Type||Name||Description||Schema|| +|*Path*|*id*\\ \\ _required_||用户编号||integer (int64)| +|*Body*|*user*\\ \\ _required_||user||[User|#user]| + + +h4. Responses + +||HTTP Code||Description||Schema|| +|*200*||OK||string| +|*201*||Created||No Content| +|*401*||Unauthorized||No Content| +|*403*||Forbidden||No Content| +|*404*||Not Found||No Content| + + +h4. Consumes + +* {noformat}application/json{noformat} + + +h4. Produces + +* {noformat}\*/*{noformat} + + +h4. Tags + +* 用户管理 + + +h4. Security + +||Type||Name||Scopes|| +|*apiKey*|*[Authorization|#authorization]*||global| + + +h3. 删除用户 {anchor:deleteuserusingdelete} +{noformat} +DELETE /users/{id} +{noformat} + + +h4. Description +根据url的id来指定删除对象 + + +h4. Parameters + +||Type||Name||Description||Schema|| +|*Path*|*id*\\ \\ _required_||id||integer (int64)| + + +h4. Responses + +||HTTP Code||Description||Schema|| +|*200*||OK||string| +|*204*||No Content||No Content| +|*401*||Unauthorized||No Content| +|*403*||Forbidden||No Content| + + +h4. Produces + +* {noformat}\*/*{noformat} + + +h4. Tags + +* 用户管理 + + +h4. Security + +||Type||Name||Scopes|| +|*apiKey*|*[Authorization|#authorization]*||global| + + + diff --git a/2.x/chapter2-5/src/docs/confluence/generated/security.txt b/2.x/chapter2-5/src/docs/confluence/generated/security.txt new file mode 100644 index 00000000..7594f1b5 --- /dev/null +++ b/2.x/chapter2-5/src/docs/confluence/generated/security.txt @@ -0,0 +1,10 @@ + +h2. Security {anchor:securityscheme} + +h3. Authorization {anchor:authorization} +_Type_ : apiKey\\ +_Name_ : TOKEN\\ +_In_ : HEADER + + + diff --git a/2.x/chapter2-5/src/docs/markdown/generated/definitions.md b/2.x/chapter2-5/src/docs/markdown/generated/definitions.md new file mode 100644 index 00000000..4eaff931 --- /dev/null +++ b/2.x/chapter2-5/src/docs/markdown/generated/definitions.md @@ -0,0 +1,17 @@ + + +## Definitions + + +### User +用户实体 + + +|Name|Description|Schema| +|---|---|---| +|**age**
*optional*|用户年龄|integer (int32)| +|**id**
*optional*|用户编号|integer (int64)| +|**name**
*optional*|用户姓名|string| + + + diff --git a/2.x/chapter2-5/src/docs/markdown/generated/overview.md b/2.x/chapter2-5/src/docs/markdown/generated/overview.md new file mode 100644 index 00000000..d360d5a8 --- /dev/null +++ b/2.x/chapter2-5/src/docs/markdown/generated/overview.md @@ -0,0 +1,34 @@ +# spring-boot-starter-swagger + + + +## Overview +Starter for swagger 2.x + + +### Version information +*Version* : 1.9.0.RELEASE + + +### Contact information +*Contact* : didi +*Contact Email* : dyc87112@qq.com + + +### License information +*License* : Apache License, Version 2.0 +*License URL* : https://www.apache.org/licenses/LICENSE-2.0.html +*Terms of service* : https://github.com/dyc87112/spring-boot-starter-swagger + + +### URI scheme +*Host* : localhost:8080 +*BasePath* : / + + +### Tags + +* 用户管理 : User Controller + + + diff --git a/2.x/chapter2-5/src/docs/markdown/generated/paths.md b/2.x/chapter2-5/src/docs/markdown/generated/paths.md new file mode 100644 index 00000000..d056676a --- /dev/null +++ b/2.x/chapter2-5/src/docs/markdown/generated/paths.md @@ -0,0 +1,232 @@ + + +## Paths + + +### 创建用户 +``` +POST /users/ +``` + + +#### Description +根据User对象创建用户 + + +#### Parameters + +|Type|Name|Description|Schema| +|---|---|---|---| +|**Body**|**user**
*required*|user|[User](#user)| + + +#### Responses + +|HTTP Code|Description|Schema| +|---|---|---| +|**200**|OK|string| +|**201**|Created|No Content| +|**401**|Unauthorized|No Content| +|**403**|Forbidden|No Content| +|**404**|Not Found|No Content| + + +#### Consumes + +* `application/json` + + +#### Produces + +* `\*/*` + + +#### Tags + +* 用户管理 + + +#### Security + +|Type|Name|Scopes| +|---|---|---| +|**apiKey**|**[Authorization](#authorization)**|global| + + + +### 获取用户列表 +``` +GET /users/ +``` + + +#### Responses + +|HTTP Code|Description|Schema| +|---|---|---| +|**200**|OK|< [User](#user) > array| +|**401**|Unauthorized|No Content| +|**403**|Forbidden|No Content| +|**404**|Not Found|No Content| + + +#### Produces + +* `\*/*` + + +#### Tags + +* 用户管理 + + +#### Security + +|Type|Name|Scopes| +|---|---|---| +|**apiKey**|**[Authorization](#authorization)**|global| + + + +### 获取用户详细信息 +``` +GET /users/{id} +``` + + +#### Description +根据url的id来获取用户详细信息 + + +#### Parameters + +|Type|Name|Description|Schema| +|---|---|---|---| +|**Path**|**id**
*required*|id|integer (int64)| + + +#### Responses + +|HTTP Code|Description|Schema| +|---|---|---| +|**200**|OK|[User](#user)| +|**401**|Unauthorized|No Content| +|**403**|Forbidden|No Content| +|**404**|Not Found|No Content| + + +#### Produces + +* `\*/*` + + +#### Tags + +* 用户管理 + + +#### Security + +|Type|Name|Scopes| +|---|---|---| +|**apiKey**|**[Authorization](#authorization)**|global| + + + +### 更新用户详细信息 +``` +PUT /users/{id} +``` + + +#### Description +根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息 + + +#### Parameters + +|Type|Name|Description|Schema| +|---|---|---|---| +|**Path**|**id**
*required*|用户编号|integer (int64)| +|**Body**|**user**
*required*|user|[User](#user)| + + +#### Responses + +|HTTP Code|Description|Schema| +|---|---|---| +|**200**|OK|string| +|**201**|Created|No Content| +|**401**|Unauthorized|No Content| +|**403**|Forbidden|No Content| +|**404**|Not Found|No Content| + + +#### Consumes + +* `application/json` + + +#### Produces + +* `\*/*` + + +#### Tags + +* 用户管理 + + +#### Security + +|Type|Name|Scopes| +|---|---|---| +|**apiKey**|**[Authorization](#authorization)**|global| + + + +### 删除用户 +``` +DELETE /users/{id} +``` + + +#### Description +根据url的id来指定删除对象 + + +#### Parameters + +|Type|Name|Description|Schema| +|---|---|---|---| +|**Path**|**id**
*required*|id|integer (int64)| + + +#### Responses + +|HTTP Code|Description|Schema| +|---|---|---| +|**200**|OK|string| +|**204**|No Content|No Content| +|**401**|Unauthorized|No Content| +|**403**|Forbidden|No Content| + + +#### Produces + +* `\*/*` + + +#### Tags + +* 用户管理 + + +#### Security + +|Type|Name|Scopes| +|---|---|---| +|**apiKey**|**[Authorization](#authorization)**|global| + + + diff --git a/2.x/chapter2-5/src/docs/markdown/generated/security.md b/2.x/chapter2-5/src/docs/markdown/generated/security.md new file mode 100644 index 00000000..09ee31c4 --- /dev/null +++ b/2.x/chapter2-5/src/docs/markdown/generated/security.md @@ -0,0 +1,12 @@ + + +## Security + + +### Authorization +*Type* : apiKey +*Name* : TOKEN +*In* : HEADER + + + diff --git a/2.x/chapter2-5/src/main/java/com/didispace/chapter25/Chapter25Application.java b/2.x/chapter2-5/src/main/java/com/didispace/chapter25/Chapter25Application.java new file mode 100644 index 00000000..b8c92652 --- /dev/null +++ b/2.x/chapter2-5/src/main/java/com/didispace/chapter25/Chapter25Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter25; + +import com.spring4all.swagger.EnableSwagger2Doc; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@EnableSwagger2Doc +@SpringBootApplication +public class Chapter25Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter25Application.class, args); + } + +} diff --git a/2.x/chapter2-5/src/main/java/com/didispace/chapter25/User.java b/2.x/chapter2-5/src/main/java/com/didispace/chapter25/User.java new file mode 100644 index 00000000..d929259d --- /dev/null +++ b/2.x/chapter2-5/src/main/java/com/didispace/chapter25/User.java @@ -0,0 +1,18 @@ +package com.didispace.chapter25; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(description="用户实体") +public class User { + + @ApiModelProperty("用户编号") + private Long id; + @ApiModelProperty("用户姓名") + private String name; + @ApiModelProperty("用户年龄") + private Integer age; + +} \ No newline at end of file diff --git a/2.x/chapter2-5/src/main/java/com/didispace/chapter25/UserController.java b/2.x/chapter2-5/src/main/java/com/didispace/chapter25/UserController.java new file mode 100644 index 00000000..ac333420 --- /dev/null +++ b/2.x/chapter2-5/src/main/java/com/didispace/chapter25/UserController.java @@ -0,0 +1,56 @@ +package com.didispace.chapter25; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +@Api(tags = "用户管理") +@RestController +@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下 +public class UserController { + + // 创建线程安全的Map,模拟users信息的存储 + static Map users = Collections.synchronizedMap(new HashMap<>()); + + @GetMapping("/") + @ApiOperation(value = "获取用户列表") + public List getUserList() { + List r = new ArrayList<>(users.values()); + return r; + } + + @PostMapping("/") + @ApiOperation(value = "创建用户", notes = "根据User对象创建用户") + public String postUser(@RequestBody User user) { + users.put(user.getId(), user); + return "success"; + } + + @GetMapping("/{id}") + @ApiOperation(value = "获取用户详细信息", notes = "根据url的id来获取用户详细信息") + public User getUser(@PathVariable Long id) { + return users.get(id); + } + + @PutMapping("/{id}") + @ApiImplicitParam(paramType = "path", dataType = "Long", name = "id", value = "用户编号", required = true, example = "1") + @ApiOperation(value = "更新用户详细信息", notes = "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息") + public String putUser(@PathVariable Long id, @RequestBody User user) { + User u = users.get(id); + u.setName(user.getName()); + u.setAge(user.getAge()); + users.put(id, u); + return "success"; + } + + @DeleteMapping("/{id}") + @ApiOperation(value = "删除用户", notes = "根据url的id来指定删除对象") + public String deleteUser(@PathVariable Long id) { + users.remove(id); + return "success"; + } + +} \ No newline at end of file diff --git a/2.x/chapter2-5/src/main/resources/application.properties b/2.x/chapter2-5/src/main/resources/application.properties new file mode 100644 index 00000000..55ec2942 --- /dev/null +++ b/2.x/chapter2-5/src/main/resources/application.properties @@ -0,0 +1,13 @@ + + +swagger.title=spring-boot-starter-swagger +swagger.description=Starter for swagger 2.x +swagger.version=1.9.0.RELEASE +swagger.license=Apache License, Version 2.0 +swagger.licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.html +swagger.termsOfServiceUrl=https://github.com/dyc87112/spring-boot-starter-swagger +swagger.contact.name=didi +swagger.contact.url=http://blog.didispace.com +swagger.contact.email=dyc87112@qq.com +swagger.base-package=com.didispace +swagger.base-path=/** \ No newline at end of file diff --git a/2.x/chapter2-5/src/test/java/com/didispace/chapter25/DemoApplicationTests.java b/2.x/chapter2-5/src/test/java/com/didispace/chapter25/DemoApplicationTests.java new file mode 100644 index 00000000..d36e438e --- /dev/null +++ b/2.x/chapter2-5/src/test/java/com/didispace/chapter25/DemoApplicationTests.java @@ -0,0 +1,71 @@ +package com.didispace.chapter25; + +import io.github.swagger2markup.Swagger2MarkupConfig; +import io.github.swagger2markup.Swagger2MarkupConverter; +import io.github.swagger2markup.builder.Swagger2MarkupConfigBuilder; +import io.github.swagger2markup.markup.builder.MarkupLanguage; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) +public class DemoApplicationTests { + + @Test + public void generateAsciiDocs() throws Exception { + + URL remoteSwaggerFile = new URL("http://localhost:8080/v2/api-docs"); + Path outputDirectory = Paths.get("src/docs/asciidoc/generated"); + + // 输出Ascii格式 + Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder() + .withMarkupLanguage(MarkupLanguage.ASCIIDOC) + .build(); + + Swagger2MarkupConverter.from(remoteSwaggerFile) + .withConfig(config) + .build() + .toFolder(outputDirectory); + } + + @Test + public void generateMarkdownDocs() throws Exception { + + URL remoteSwaggerFile = new URL("http://localhost:8080/v2/api-docs"); + Path outputDirectory = Paths.get("src/docs/markdown/generated"); + + // 输出Ascii格式 + Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder() + .withMarkupLanguage(MarkupLanguage.MARKDOWN) + .build(); + + Swagger2MarkupConverter.from(remoteSwaggerFile) + .withConfig(config) + .build() + .toFolder(outputDirectory); + } + + @Test + public void generateConfluenceDocs() throws Exception { + + URL remoteSwaggerFile = new URL("http://localhost:8080/v2/api-docs"); + Path outputDirectory = Paths.get("src/docs/confluence/generated"); + + // 输出Ascii格式 + Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder() + .withMarkupLanguage(MarkupLanguage.CONFLUENCE_MARKUP) + .build(); + + Swagger2MarkupConverter.from(remoteSwaggerFile) + .withConfig(config) + .build() + .toFolder(outputDirectory); + } + +} \ No newline at end of file diff --git a/2.x/chapter2-6/.gitignore b/2.x/chapter2-6/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter2-6/.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/2.x/chapter2-6/pom.xml b/2.x/chapter2-6/pom.xml new file mode 100644 index 00000000..09ba9399 --- /dev/null +++ b/2.x/chapter2-6/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter2-6 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter2-6/src/main/java/com/didispace/chapter26/Chapter26Application.java b/2.x/chapter2-6/src/main/java/com/didispace/chapter26/Chapter26Application.java new file mode 100644 index 00000000..ab89e203 --- /dev/null +++ b/2.x/chapter2-6/src/main/java/com/didispace/chapter26/Chapter26Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter26; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter26Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter26Application.class, args); + } + +} diff --git a/2.x/chapter2-6/src/main/java/com/didispace/chapter26/User.java b/2.x/chapter2-6/src/main/java/com/didispace/chapter26/User.java new file mode 100644 index 00000000..60e131cd --- /dev/null +++ b/2.x/chapter2-6/src/main/java/com/didispace/chapter26/User.java @@ -0,0 +1,12 @@ +package com.didispace.chapter26; + +import lombok.Data; + +@Data +public class User { + + private Long id; + private String name; + private Integer age; + +} \ No newline at end of file diff --git a/2.x/chapter2-6/src/main/java/com/didispace/chapter26/UserController.java b/2.x/chapter2-6/src/main/java/com/didispace/chapter26/UserController.java new file mode 100644 index 00000000..a84cf8d4 --- /dev/null +++ b/2.x/chapter2-6/src/main/java/com/didispace/chapter26/UserController.java @@ -0,0 +1,46 @@ +package com.didispace.chapter26; + +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +@RestController +@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下 +public class UserController { + + // 创建线程安全的Map,模拟users信息的存储 + static Map users = Collections.synchronizedMap(new HashMap<>()); + + @GetMapping("/") + public List getUserList() { + List r = new ArrayList<>(users.values()); + return r; + } + + @PostMapping("/") + public String postUser(@RequestBody User user) { + users.put(user.getId(), user); + return "success"; + } + + @GetMapping("/{id}") + public User getUser(@PathVariable Long id) { + return users.get(id); + } + + @PutMapping("/{id}") + public String putUser(@PathVariable Long id, @RequestBody User user) { + User u = users.get(id); + u.setName(user.getName()); + u.setAge(user.getAge()); + users.put(id, u); + return "success"; + } + + @DeleteMapping("/{id}") + public String deleteUser(@PathVariable Long id) { + users.remove(id); + return "success"; + } + +} \ No newline at end of file diff --git a/2.x/chapter2-6/src/main/resources/application.properties b/2.x/chapter2-6/src/main/resources/application.properties new file mode 100644 index 00000000..eae6a38f --- /dev/null +++ b/2.x/chapter2-6/src/main/resources/application.properties @@ -0,0 +1,3 @@ +# 打印RequestMapping中的所有接口信息 +logging.level.org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping=trace + diff --git a/2.x/chapter2-7/.gitignore b/2.x/chapter2-7/.gitignore new file mode 100644 index 00000000..2af7cefb --- /dev/null +++ b/2.x/chapter2-7/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/2.x/chapter2-7/pom.xml b/2.x/chapter2-7/pom.xml new file mode 100644 index 00000000..882a8176 --- /dev/null +++ b/2.x/chapter2-7/pom.xml @@ -0,0 +1,67 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.2.3.RELEASE + + + + com.didispace + chapter2-7 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + io.springfox + springfox-boot-starter + 3.0.0 + + + + org.projectlombok + lombok + provided + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + + false + + jcenter-releases + jcenter + http://jcenter.bintray.com + + + + diff --git a/2.x/chapter2-7/src/main/java/com/didispace/chapter27/Chapter27Application.java b/2.x/chapter2-7/src/main/java/com/didispace/chapter27/Chapter27Application.java new file mode 100644 index 00000000..7a6a667b --- /dev/null +++ b/2.x/chapter2-7/src/main/java/com/didispace/chapter27/Chapter27Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter27; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import springfox.documentation.oas.annotations.EnableOpenApi; + +@EnableOpenApi +@SpringBootApplication +public class Chapter27Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter27Application.class, args); + } + +} diff --git a/2.x/chapter2-7/src/main/java/com/didispace/chapter27/User.java b/2.x/chapter2-7/src/main/java/com/didispace/chapter27/User.java new file mode 100644 index 00000000..25c99ae8 --- /dev/null +++ b/2.x/chapter2-7/src/main/java/com/didispace/chapter27/User.java @@ -0,0 +1,29 @@ +package com.didispace.demo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("用户基本信息") +public class User { + + @ApiModelProperty("姓名") + @Size(max = 20) + private String name; + @ApiModelProperty("年龄") + @Max(150) + @Min(1) + private Integer age; + @NotNull + private String address; + @Pattern(regexp = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$") + private String email; + +} \ No newline at end of file diff --git a/2.x/chapter2-7/src/main/java/com/didispace/chapter27/UserController.java b/2.x/chapter2-7/src/main/java/com/didispace/chapter27/UserController.java new file mode 100644 index 00000000..fcfb546d --- /dev/null +++ b/2.x/chapter2-7/src/main/java/com/didispace/chapter27/UserController.java @@ -0,0 +1,45 @@ +package com.didispace.demo; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; + +@Api(tags="用户管理") +@RestController +public class UserController { + + @ApiOperation("创建用户") + @PostMapping("/users") + public User create(@RequestBody @Valid User user) { + return user; + } + + @ApiOperation("用户详情") + @GetMapping("/users/{id}") + public User findById(@PathVariable Long id) { + return new User("bbb", 21, "上海", "aaa@bbb.com"); + } + + @ApiOperation("用户列表") + @GetMapping("/users") + public List list(@ApiParam("查看第几页") @RequestParam int pageIndex, + @ApiParam("每页多少条") @RequestParam int pageSize) { + List result = new ArrayList<>(); + result.add(new User("aaa", 50, "北京", "aaa@ccc.com")); + result.add(new User("bbb", 21, "广州", "aaa@ddd.com")); + return result; + } + + @ApiIgnore + @DeleteMapping("/users/{id}") + public String deleteById(@PathVariable Long id) { + return "delete user : " + id; + } + +} \ No newline at end of file diff --git a/2.x/chapter2-7/src/main/resources/application.properties b/2.x/chapter2-7/src/main/resources/application.properties new file mode 100644 index 00000000..d910c856 --- /dev/null +++ b/2.x/chapter2-7/src/main/resources/application.properties @@ -0,0 +1,2 @@ +logging.level.org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping=trace + diff --git a/2.x/chapter3-1/.gitignore b/2.x/chapter3-1/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter3-1/.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/2.x/chapter3-1/pom.xml b/2.x/chapter3-1/pom.xml new file mode 100644 index 00000000..4621591e --- /dev/null +++ b/2.x/chapter3-1/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-1 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter3-1/src/main/java/com/didispace/chapter31/Chapter31Application.java b/2.x/chapter3-1/src/main/java/com/didispace/chapter31/Chapter31Application.java new file mode 100644 index 00000000..c83da9dd --- /dev/null +++ b/2.x/chapter3-1/src/main/java/com/didispace/chapter31/Chapter31Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter31; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter31Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter31Application.class, args); + } + +} diff --git a/2.x/chapter3-1/src/main/java/com/didispace/chapter31/User.java b/2.x/chapter3-1/src/main/java/com/didispace/chapter31/User.java new file mode 100644 index 00000000..5c54cf36 --- /dev/null +++ b/2.x/chapter3-1/src/main/java/com/didispace/chapter31/User.java @@ -0,0 +1,13 @@ +package com.didispace.chapter31; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class User { + + private String name; + private Integer age; + +} \ No newline at end of file diff --git a/2.x/chapter3-1/src/main/java/com/didispace/chapter31/UserService.java b/2.x/chapter3-1/src/main/java/com/didispace/chapter31/UserService.java new file mode 100644 index 00000000..2ce0b727 --- /dev/null +++ b/2.x/chapter3-1/src/main/java/com/didispace/chapter31/UserService.java @@ -0,0 +1,40 @@ +package com.didispace.chapter31; + +import java.util.List; + +public interface UserService { + + /** + * 新增一个用户 + * + * @param name + * @param age + */ + int create(String name, Integer age); + + /** + * 根据name查询用户 + * + * @param name + * @return + */ + List getByName(String name); + + /** + * 根据name删除用户 + * + * @param name + */ + int deleteByName(String name); + + /** + * 获取用户总量 + */ + int getAllUsers(); + + /** + * 删除所有用户 + */ + int deleteAllUsers(); + +} \ No newline at end of file diff --git a/2.x/chapter3-1/src/main/java/com/didispace/chapter31/UserServiceImpl.java b/2.x/chapter3-1/src/main/java/com/didispace/chapter31/UserServiceImpl.java new file mode 100644 index 00000000..3cb55fb2 --- /dev/null +++ b/2.x/chapter3-1/src/main/java/com/didispace/chapter31/UserServiceImpl.java @@ -0,0 +1,52 @@ +package com.didispace.chapter31; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Service; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +@Service +public class UserServiceImpl implements UserService { + + private JdbcTemplate jdbcTemplate; + + UserServiceImpl(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public int create(String name, Integer age) { + return jdbcTemplate.update("insert into USER(NAME, AGE) values(?, ?)", name, age); + } + + @Override + public List getByName(String name) { + List users = jdbcTemplate.query("select NAME, AGE from USER where NAME = ?", (resultSet, i) -> { + User user = new User(); + user.setName(resultSet.getString("NAME")); + user.setAge(resultSet.getInt("AGE")); + return user; + }, name); + return users; + } + + @Override + public int deleteByName(String name) { + return jdbcTemplate.update("delete from USER where NAME = ?", name); + } + + @Override + public int getAllUsers() { + return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class); + } + + @Override + public int deleteAllUsers() { + return jdbcTemplate.update("delete from USER"); + } + +} \ No newline at end of file diff --git a/2.x/chapter3-1/src/main/resources/application.properties b/2.x/chapter3-1/src/main/resources/application.properties new file mode 100644 index 00000000..66ff8fe4 --- /dev/null +++ b/2.x/chapter3-1/src/main/resources/application.properties @@ -0,0 +1,4 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password= +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver \ No newline at end of file diff --git a/2.x/chapter3-1/src/test/java/com/didispace/chapter31/Chapter31ApplicationTests.java b/2.x/chapter3-1/src/test/java/com/didispace/chapter31/Chapter31ApplicationTests.java new file mode 100644 index 00000000..2905f545 --- /dev/null +++ b/2.x/chapter3-1/src/test/java/com/didispace/chapter31/Chapter31ApplicationTests.java @@ -0,0 +1,63 @@ +package com.didispace.chapter31; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.RequestBuilder; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static org.hamcrest.Matchers.equalTo; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter31ApplicationTests { + + @Autowired + private UserService userSerivce; + + @Before + public void setUp() { + // 准备,清空user表 + userSerivce.deleteAllUsers(); + } + + @Test + public void test() throws Exception { + // 插入5个用户 + userSerivce.create("Tom", 10); + userSerivce.create("Mike", 11); + userSerivce.create("Didispace", 30); + userSerivce.create("Oscar", 21); + userSerivce.create("Linda", 17); + + // 查询名为Oscar的用户,判断年龄是否匹配 + List userList = userSerivce.getByName("Oscar"); + Assert.assertEquals(21, userList.get(0).getAge().intValue()); + + // 查数据库,应该有5个用户 + Assert.assertEquals(5, userSerivce.getAllUsers()); + + // 删除两个用户 + userSerivce.deleteByName("Tom"); + userSerivce.deleteByName("Mike"); + + // 查数据库,应该有5个用户 + Assert.assertEquals(3, userSerivce.getAllUsers()); + + } + +} diff --git a/2.x/chapter3-10/.gitignore b/2.x/chapter3-10/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter3-10/.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/2.x/chapter3-10/pom.xml b/2.x/chapter3-10/pom.xml new file mode 100644 index 00000000..9b2abc07 --- /dev/null +++ b/2.x/chapter3-10/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-10 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter3-10/src/main/java/com/didispace/chapter310/Chapter310Application.java b/2.x/chapter3-10/src/main/java/com/didispace/chapter310/Chapter310Application.java new file mode 100644 index 00000000..72a7dd3e --- /dev/null +++ b/2.x/chapter3-10/src/main/java/com/didispace/chapter310/Chapter310Application.java @@ -0,0 +1,25 @@ +package com.didispace.chapter310; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +public class Chapter310Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter310Application.class, args); + } + + @RestController + static class TextController { + + @GetMapping("/hello") + public String hello() { + return "hello world"; + } + + } + +} diff --git a/2.x/chapter3-10/src/main/java/com/didispace/chapter310/User.java b/2.x/chapter3-10/src/main/java/com/didispace/chapter310/User.java new file mode 100644 index 00000000..a2347ea8 --- /dev/null +++ b/2.x/chapter3-10/src/main/java/com/didispace/chapter310/User.java @@ -0,0 +1,27 @@ +package com.didispace.chapter310; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import javax.validation.constraints.Max; + +@Entity +@Data +@NoArgsConstructor +public class User { + + @Id + @GeneratedValue + private Long id; + + private String name; + @Max(50) + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } + +} \ No newline at end of file diff --git a/2.x/chapter3-10/src/main/java/com/didispace/chapter310/UserRepository.java b/2.x/chapter3-10/src/main/java/com/didispace/chapter310/UserRepository.java new file mode 100644 index 00000000..366e1d21 --- /dev/null +++ b/2.x/chapter3-10/src/main/java/com/didispace/chapter310/UserRepository.java @@ -0,0 +1,22 @@ +package com.didispace.chapter310; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/7/9. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface UserRepository extends JpaRepository { + + User findByName(String name); + + User findByNameAndAge(String name, Integer age); + + @Query("from User u where u.name=:name") + User findUser(@Param("name") String name); + +} diff --git a/2.x/chapter3-10/src/main/resources/application.properties b/2.x/chapter3-10/src/main/resources/application.properties new file mode 100644 index 00000000..7238387a --- /dev/null +++ b/2.x/chapter3-10/src/main/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=12345678 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.hibernate.ddl-auto=create diff --git a/2.x/chapter3-10/src/test/java/com/didispace/chapter310/Chapter310ApplicationTests.java b/2.x/chapter3-10/src/test/java/com/didispace/chapter310/Chapter310ApplicationTests.java new file mode 100644 index 00000000..02fee65b --- /dev/null +++ b/2.x/chapter3-10/src/test/java/com/didispace/chapter310/Chapter310ApplicationTests.java @@ -0,0 +1,56 @@ +package com.didispace.chapter310; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; + + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter310ApplicationTests { + + @Autowired + private UserRepository userRepository; + + @Test + @Transactional + public void test() throws Exception { + // 创建10条记录 + userRepository.save(new User("AAA", 10)); + userRepository.save(new User("BBB", 20)); + userRepository.save(new User("CCC", 30)); + userRepository.save(new User("DDD", 40)); + userRepository.save(new User("EEE", 50)); + userRepository.save(new User("FFF", 60)); + userRepository.save(new User("GGG", 70)); + userRepository.save(new User("HHH", 80)); + userRepository.save(new User("III", 90)); + userRepository.save(new User("JJJ", 100)); + + // 测试findAll, 查询所有记录 + Assert.assertEquals(10, userRepository.findAll().size()); + + // 测试findByName, 查询姓名为FFF的User + Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue()); + + // 测试findUser, 查询姓名为FFF的User + Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue()); + + // 测试findByNameAndAge, 查询姓名为FFF并且年龄为60的User + Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName()); + + // 测试删除姓名为AAA的User + userRepository.delete(userRepository.findByName("AAA")); + + // 测试findAll, 查询所有记录, 验证上面的删除是否成功 + Assert.assertEquals(9, userRepository.findAll().size()); + + } + +} diff --git a/2.x/chapter3-2/.gitignore b/2.x/chapter3-2/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter3-2/.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/2.x/chapter3-2/pom.xml b/2.x/chapter3-2/pom.xml new file mode 100644 index 00000000..2de383a2 --- /dev/null +++ b/2.x/chapter3-2/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-2 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter3-2/src/main/java/com/didispace/chapter32/Chapter32Application.java b/2.x/chapter3-2/src/main/java/com/didispace/chapter32/Chapter32Application.java new file mode 100644 index 00000000..d782cff1 --- /dev/null +++ b/2.x/chapter3-2/src/main/java/com/didispace/chapter32/Chapter32Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter32; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter32Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter32Application.class, args); + } + +} diff --git a/2.x/chapter3-2/src/main/java/com/didispace/chapter32/User.java b/2.x/chapter3-2/src/main/java/com/didispace/chapter32/User.java new file mode 100644 index 00000000..7553c2e2 --- /dev/null +++ b/2.x/chapter3-2/src/main/java/com/didispace/chapter32/User.java @@ -0,0 +1,13 @@ +package com.didispace.chapter32; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class User { + + private String name; + private Integer age; + +} \ No newline at end of file diff --git a/2.x/chapter3-2/src/main/java/com/didispace/chapter32/UserService.java b/2.x/chapter3-2/src/main/java/com/didispace/chapter32/UserService.java new file mode 100644 index 00000000..c4e3cd02 --- /dev/null +++ b/2.x/chapter3-2/src/main/java/com/didispace/chapter32/UserService.java @@ -0,0 +1,40 @@ +package com.didispace.chapter32; + +import java.util.List; + +public interface UserService { + + /** + * 新增一个用户 + * + * @param name + * @param age + */ + int create(String name, Integer age); + + /** + * 根据name查询用户 + * + * @param name + * @return + */ + List getByName(String name); + + /** + * 根据name删除用户 + * + * @param name + */ + int deleteByName(String name); + + /** + * 获取用户总量 + */ + int getAllUsers(); + + /** + * 删除所有用户 + */ + int deleteAllUsers(); + +} \ No newline at end of file diff --git a/2.x/chapter3-2/src/main/java/com/didispace/chapter32/UserServiceImpl.java b/2.x/chapter3-2/src/main/java/com/didispace/chapter32/UserServiceImpl.java new file mode 100644 index 00000000..9fb1bd08 --- /dev/null +++ b/2.x/chapter3-2/src/main/java/com/didispace/chapter32/UserServiceImpl.java @@ -0,0 +1,52 @@ +package com.didispace.chapter32; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Service; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +@Service +public class UserServiceImpl implements UserService { + + private JdbcTemplate jdbcTemplate; + + UserServiceImpl(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public int create(String name, Integer age) { + return jdbcTemplate.update("insert into USER(NAME, AGE) values(?, ?)", name, age); + } + + @Override + public List getByName(String name) { + List users = jdbcTemplate.query("select NAME, AGE from USER where NAME = ?", (resultSet, i) -> { + User user = new User(); + user.setName(resultSet.getString("NAME")); + user.setAge(resultSet.getInt("AGE")); + return user; + }, name); + return users; + } + + @Override + public int deleteByName(String name) { + return jdbcTemplate.update("delete from USER where NAME = ?", name); + } + + @Override + public int getAllUsers() { + return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class); + } + + @Override + public int deleteAllUsers() { + return jdbcTemplate.update("delete from USER"); + } + +} \ No newline at end of file diff --git a/2.x/chapter3-2/src/main/resources/application.properties b/2.x/chapter3-2/src/main/resources/application.properties new file mode 100644 index 00000000..b0d32069 --- /dev/null +++ b/2.x/chapter3-2/src/main/resources/application.properties @@ -0,0 +1,17 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password= +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +# 最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size +spring.datasource.hikari.minimum-idle=10 +# 最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值 +spring.datasource.hikari.maximum-pool-size=20 +# 空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。 +spring.datasource.hikari.idle-timeout=500000 +# 连接最大存活时间.不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短 +spring.datasource.hikari.max-lifetime=540000 +# 连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒 +spring.datasource.hikari.connection-timeout=60000 +# 用于测试连接是否可用的查询语句 +spring.datasource.hikari.connection-test-query=SELECT 1 diff --git a/2.x/chapter3-2/src/test/java/com/didispace/chapter32/Chapter32ApplicationTests.java b/2.x/chapter3-2/src/test/java/com/didispace/chapter32/Chapter32ApplicationTests.java new file mode 100644 index 00000000..e23dd01c --- /dev/null +++ b/2.x/chapter3-2/src/test/java/com/didispace/chapter32/Chapter32ApplicationTests.java @@ -0,0 +1,69 @@ +package com.didispace.chapter32; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.RequestBuilder; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.transaction.annotation.Transactional; + +import javax.sql.DataSource; +import java.util.List; + +import static org.hamcrest.Matchers.equalTo; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter32ApplicationTests { + + @Autowired + private UserService userSerivce; + + @Autowired + private DataSource dataSource; + + @Before + public void setUp() { + // 准备,清空user表 + userSerivce.deleteAllUsers(); + + } + + @Test + public void test() throws Exception { + // 插入5个用户 + userSerivce.create("Tom", 10); + userSerivce.create("Mike", 11); + userSerivce.create("Didispace", 30); + userSerivce.create("Oscar", 21); + userSerivce.create("Linda", 17); + + // 查询名为Oscar的用户,判断年龄是否匹配 + List userList = userSerivce.getByName("Oscar"); + Assert.assertEquals(21, userList.get(0).getAge().intValue()); + + // 查数据库,应该有5个用户 + Assert.assertEquals(5, userSerivce.getAllUsers()); + + // 删除两个用户 + userSerivce.deleteByName("Tom"); + userSerivce.deleteByName("Mike"); + + // 查数据库,应该有5个用户 + Assert.assertEquals(3, userSerivce.getAllUsers()); + + } + +} diff --git a/2.x/chapter3-3/.gitignore b/2.x/chapter3-3/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter3-3/.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/2.x/chapter3-3/pom.xml b/2.x/chapter3-3/pom.xml new file mode 100644 index 00000000..c83eddc6 --- /dev/null +++ b/2.x/chapter3-3/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-3 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.alibaba + druid-spring-boot-starter + 1.1.21 + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter3-3/src/main/java/com/didispace/chapter33/Chapter33Application.java b/2.x/chapter3-3/src/main/java/com/didispace/chapter33/Chapter33Application.java new file mode 100644 index 00000000..4653f680 --- /dev/null +++ b/2.x/chapter3-3/src/main/java/com/didispace/chapter33/Chapter33Application.java @@ -0,0 +1,25 @@ +package com.didispace.chapter33; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +public class Chapter33Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter33Application.class, args); + } + + @RestController + static class TextController { + + @GetMapping("/hello") + public String hello() { + return "hello world"; + } + + } + +} diff --git a/2.x/chapter3-3/src/main/java/com/didispace/chapter33/User.java b/2.x/chapter3-3/src/main/java/com/didispace/chapter33/User.java new file mode 100644 index 00000000..ac0b9460 --- /dev/null +++ b/2.x/chapter3-3/src/main/java/com/didispace/chapter33/User.java @@ -0,0 +1,13 @@ +package com.didispace.chapter33; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class User { + + private String name; + private Integer age; + +} \ No newline at end of file diff --git a/2.x/chapter3-3/src/main/java/com/didispace/chapter33/UserController.java b/2.x/chapter3-3/src/main/java/com/didispace/chapter33/UserController.java new file mode 100644 index 00000000..f88d0dc0 --- /dev/null +++ b/2.x/chapter3-3/src/main/java/com/didispace/chapter33/UserController.java @@ -0,0 +1,47 @@ +package com.didispace.chapter33; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * Created by 程序猿DD/翟永超 on 2020/2/8. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +@Data +@AllArgsConstructor +@RestController +public class UserController { + + private UserService userService; + + @PostMapping("/user") + public int create(@RequestBody User user) { + return userService.create(user.getName(), user.getAge()); + } + + @GetMapping("/user/{name}") + public List getByName(@PathVariable String name) { + return userService.getByName(name); + } + + @DeleteMapping("/user/{name}") + public int deleteByName(@PathVariable String name) { + return userService.deleteByName(name); + } + + @GetMapping("/user/count") + public int getAllUsers() { + return userService.getAllUsers(); + } + + @DeleteMapping("/user/all") + public int deleteAllUsers() { + return userService.deleteAllUsers(); + } + +} diff --git a/2.x/chapter3-3/src/main/java/com/didispace/chapter33/UserService.java b/2.x/chapter3-3/src/main/java/com/didispace/chapter33/UserService.java new file mode 100644 index 00000000..7eddffb5 --- /dev/null +++ b/2.x/chapter3-3/src/main/java/com/didispace/chapter33/UserService.java @@ -0,0 +1,40 @@ +package com.didispace.chapter33; + +import java.util.List; + +public interface UserService { + + /** + * 新增一个用户 + * + * @param name + * @param age + */ + int create(String name, Integer age); + + /** + * 根据name查询用户 + * + * @param name + * @return + */ + List getByName(String name); + + /** + * 根据name删除用户 + * + * @param name + */ + int deleteByName(String name); + + /** + * 获取用户总量 + */ + int getAllUsers(); + + /** + * 删除所有用户 + */ + int deleteAllUsers(); + +} \ No newline at end of file diff --git a/2.x/chapter3-3/src/main/java/com/didispace/chapter33/UserServiceImpl.java b/2.x/chapter3-3/src/main/java/com/didispace/chapter33/UserServiceImpl.java new file mode 100644 index 00000000..43f0f79a --- /dev/null +++ b/2.x/chapter3-3/src/main/java/com/didispace/chapter33/UserServiceImpl.java @@ -0,0 +1,52 @@ +package com.didispace.chapter33; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Service; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +@Service +public class UserServiceImpl implements UserService { + + private JdbcTemplate jdbcTemplate; + + UserServiceImpl(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public int create(String name, Integer age) { + return jdbcTemplate.update("insert into USER(NAME, AGE) values(?, ?)", name, age); + } + + @Override + public List getByName(String name) { + List users = jdbcTemplate.query("select NAME, AGE from USER where NAME = ?", (resultSet, i) -> { + User user = new User(); + user.setName(resultSet.getString("NAME")); + user.setAge(resultSet.getInt("AGE")); + return user; + }, name); + return users; + } + + @Override + public int deleteByName(String name) { + return jdbcTemplate.update("delete from USER where NAME = ?", name); + } + + @Override + public int getAllUsers() { + return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class); + } + + @Override + public int deleteAllUsers() { + return jdbcTemplate.update("delete from USER"); + } + +} \ No newline at end of file diff --git a/2.x/chapter3-3/src/main/resources/application.properties b/2.x/chapter3-3/src/main/resources/application.properties new file mode 100644 index 00000000..26f3a97b --- /dev/null +++ b/2.x/chapter3-3/src/main/resources/application.properties @@ -0,0 +1,29 @@ + +# 基础配置 +spring.datasource.druid.url=jdbc:mysql://localhost:3306/test +spring.datasource.druid.username=root +spring.datasource.druid.password= +spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver + +# 连接池配置 +spring.datasource.druid.initialSize=10 +spring.datasource.druid.maxActive=20 +spring.datasource.druid.maxWait=60000 +spring.datasource.druid.minIdle=1 +spring.datasource.druid.timeBetweenEvictionRunsMillis=60000 +spring.datasource.druid.minEvictableIdleTimeMillis=300000 +spring.datasource.druid.testWhileIdle=true +spring.datasource.druid.testOnBorrow=true +spring.datasource.druid.testOnReturn=false +spring.datasource.druid.poolPreparedStatements=true +spring.datasource.druid.maxOpenPreparedStatements=20 +spring.datasource.druid.validationQuery=SELECT 1 +spring.datasource.druid.validation-query-timeout=500 +spring.datasource.druid.filters=stat,wall + +# 监控配置 +spring.datasource.druid.stat-view-servlet.enabled=true +spring.datasource.druid.stat-view-servlet.url-pattern=/druid/* +spring.datasource.druid.stat-view-servlet.reset-enable=true +spring.datasource.druid.stat-view-servlet.login-username=admin +spring.datasource.druid.stat-view-servlet.login-password=admin diff --git a/2.x/chapter3-3/src/test/java/com/didispace/chapter33/Chapter33ApplicationTests.java b/2.x/chapter3-3/src/test/java/com/didispace/chapter33/Chapter33ApplicationTests.java new file mode 100644 index 00000000..f86be74a --- /dev/null +++ b/2.x/chapter3-3/src/test/java/com/didispace/chapter33/Chapter33ApplicationTests.java @@ -0,0 +1,69 @@ +package com.didispace.chapter33; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.RequestBuilder; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.transaction.annotation.Transactional; + +import javax.sql.DataSource; +import java.util.List; + +import static org.hamcrest.Matchers.equalTo; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter33ApplicationTests { + + @Autowired + private UserService userSerivce; + + @Autowired + private DataSource dataSource; + + @Before + public void setUp() { + // 准备,清空user表 + userSerivce.deleteAllUsers(); + + } + + @Test + public void test() throws Exception { + // 插入5个用户 + userSerivce.create("Tom", 10); + userSerivce.create("Mike", 11); + userSerivce.create("Didispace", 30); + userSerivce.create("Oscar", 21); + userSerivce.create("Linda", 17); + + // 查询名为Oscar的用户,判断年龄是否匹配 + List userList = userSerivce.getByName("Oscar"); + Assert.assertEquals(21, userList.get(0).getAge().intValue()); + + // 查数据库,应该有5个用户 + Assert.assertEquals(5, userSerivce.getAllUsers()); + + // 删除两个用户 + userSerivce.deleteByName("Tom"); + userSerivce.deleteByName("Mike"); + + // 查数据库,应该有5个用户 + Assert.assertEquals(3, userSerivce.getAllUsers()); + + } + +} diff --git a/2.x/chapter3-4/.gitignore b/2.x/chapter3-4/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter3-4/.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/2.x/chapter3-4/pom.xml b/2.x/chapter3-4/pom.xml new file mode 100644 index 00000000..602beb6d --- /dev/null +++ b/2.x/chapter3-4/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-4 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter3-4/src/main/java/com/didispace/chapter34/Chapter34Application.java b/2.x/chapter3-4/src/main/java/com/didispace/chapter34/Chapter34Application.java new file mode 100644 index 00000000..4b9e8193 --- /dev/null +++ b/2.x/chapter3-4/src/main/java/com/didispace/chapter34/Chapter34Application.java @@ -0,0 +1,25 @@ +package com.didispace.chapter34; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +public class Chapter34Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter34Application.class, args); + } + + @RestController + static class TextController { + + @GetMapping("/hello") + public String hello() { + return "hello world"; + } + + } + +} diff --git a/2.x/chapter3-4/src/main/java/com/didispace/chapter34/User.java b/2.x/chapter3-4/src/main/java/com/didispace/chapter34/User.java new file mode 100644 index 00000000..701ed4d4 --- /dev/null +++ b/2.x/chapter3-4/src/main/java/com/didispace/chapter34/User.java @@ -0,0 +1,26 @@ +package com.didispace.chapter34; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +@Data +@NoArgsConstructor +public class User { + + @Id + @GeneratedValue + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.x/chapter3-4/src/main/java/com/didispace/chapter34/UserRepository.java b/2.x/chapter3-4/src/main/java/com/didispace/chapter34/UserRepository.java new file mode 100644 index 00000000..17533dd3 --- /dev/null +++ b/2.x/chapter3-4/src/main/java/com/didispace/chapter34/UserRepository.java @@ -0,0 +1,22 @@ +package com.didispace.chapter34; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/2/15. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface UserRepository extends JpaRepository { + + User findByName(String name); + + User findByNameAndAge(String name, Integer age); + + @Query("from User u where u.name=:name") + User findUser(@Param("name") String name); + +} diff --git a/2.x/chapter3-4/src/main/resources/application.properties b/2.x/chapter3-4/src/main/resources/application.properties new file mode 100644 index 00000000..44c64de2 --- /dev/null +++ b/2.x/chapter3-4/src/main/resources/application.properties @@ -0,0 +1,6 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password= +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/2.x/chapter3-4/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java b/2.x/chapter3-4/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java new file mode 100644 index 00000000..e104e22c --- /dev/null +++ b/2.x/chapter3-4/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java @@ -0,0 +1,57 @@ +package com.didispace.chapter34; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.sql.DataSource; +import java.util.List; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter34ApplicationTests { + + @Autowired + private UserRepository userRepository; + + @Test + public void test() throws Exception { + // 创建10条记录 + userRepository.save(new User("AAA", 10)); + userRepository.save(new User("BBB", 20)); + userRepository.save(new User("CCC", 30)); + userRepository.save(new User("DDD", 40)); + userRepository.save(new User("EEE", 50)); + userRepository.save(new User("FFF", 60)); + userRepository.save(new User("GGG", 70)); + userRepository.save(new User("HHH", 80)); + userRepository.save(new User("III", 90)); + userRepository.save(new User("JJJ", 100)); + + // 测试findAll, 查询所有记录 + Assert.assertEquals(10, userRepository.findAll().size()); + + // 测试findByName, 查询姓名为FFF的User + Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue()); + + // 测试findUser, 查询姓名为FFF的User + Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue()); + + // 测试findByNameAndAge, 查询姓名为FFF并且年龄为60的User + Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName()); + + // 测试删除姓名为AAA的User + userRepository.delete(userRepository.findByName("AAA")); + + // 测试findAll, 查询所有记录, 验证上面的删除是否成功 + Assert.assertEquals(9, userRepository.findAll().size()); + + } + +} diff --git a/2.x/chapter3-5/.gitignore b/2.x/chapter3-5/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter3-5/.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/2.x/chapter3-5/pom.xml b/2.x/chapter3-5/pom.xml new file mode 100644 index 00000000..2cb4f499 --- /dev/null +++ b/2.x/chapter3-5/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-5 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.1 + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter3-5/src/main/java/com/didispace/chapter35/Chapter35Application.java b/2.x/chapter3-5/src/main/java/com/didispace/chapter35/Chapter35Application.java new file mode 100644 index 00000000..48e71f85 --- /dev/null +++ b/2.x/chapter3-5/src/main/java/com/didispace/chapter35/Chapter35Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter35; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter35Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter35Application.class, args); + } + +} diff --git a/2.x/chapter3-5/src/main/java/com/didispace/chapter35/User.java b/2.x/chapter3-5/src/main/java/com/didispace/chapter35/User.java new file mode 100644 index 00000000..d815f4c1 --- /dev/null +++ b/2.x/chapter3-5/src/main/java/com/didispace/chapter35/User.java @@ -0,0 +1,20 @@ +package com.didispace.chapter35; + +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor +public class User { + + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.x/chapter3-5/src/main/java/com/didispace/chapter35/UserMapper.java b/2.x/chapter3-5/src/main/java/com/didispace/chapter35/UserMapper.java new file mode 100644 index 00000000..17f6aa18 --- /dev/null +++ b/2.x/chapter3-5/src/main/java/com/didispace/chapter35/UserMapper.java @@ -0,0 +1,23 @@ +package com.didispace.chapter35; + +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * Created by 程序猿DD/翟永超 on 2020/2/15. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +@Mapper +public interface UserMapper { + + @Select("SELECT * FROM USER WHERE NAME = #{name}") + User findByName(@Param("name") String name); + + @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})") + int insert(@Param("name") String name, @Param("age") Integer age); + +} diff --git a/2.x/chapter3-5/src/main/resources/application.properties b/2.x/chapter3-5/src/main/resources/application.properties new file mode 100644 index 00000000..779d89b9 --- /dev/null +++ b/2.x/chapter3-5/src/main/resources/application.properties @@ -0,0 +1,4 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=12345678 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver diff --git a/2.x/chapter3-5/src/test/java/com/didispace/chapter35/Chapter35ApplicationTests.java b/2.x/chapter3-5/src/test/java/com/didispace/chapter35/Chapter35ApplicationTests.java new file mode 100644 index 00000000..b6de7a08 --- /dev/null +++ b/2.x/chapter3-5/src/test/java/com/didispace/chapter35/Chapter35ApplicationTests.java @@ -0,0 +1,33 @@ +package com.didispace.chapter35; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; + +import javax.sql.DataSource; +import java.util.List; + +@RunWith(SpringRunner.class) +@SpringBootTest +@Transactional +public class Chapter35ApplicationTests { + + @Autowired + private UserMapper userMapper; + + @Test + @Rollback + public void test() throws Exception { + userMapper.insert("AAA", 20); + User u = userMapper.findByName("AAA"); + Assert.assertEquals(20, u.getAge().intValue()); + } + +} diff --git a/2.x/chapter3-6/.gitignore b/2.x/chapter3-6/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter3-6/.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/2.x/chapter3-6/pom.xml b/2.x/chapter3-6/pom.xml new file mode 100644 index 00000000..2f515975 --- /dev/null +++ b/2.x/chapter3-6/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-6 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.1 + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter3-6/src/main/java/com/didispace/chapter36/Chapter36Application.java b/2.x/chapter3-6/src/main/java/com/didispace/chapter36/Chapter36Application.java new file mode 100644 index 00000000..2ce02b15 --- /dev/null +++ b/2.x/chapter3-6/src/main/java/com/didispace/chapter36/Chapter36Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter36; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@MapperScan("com.didispace.chapter36.mapper") +@SpringBootApplication +public class Chapter36Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter36Application.class, args); + } + +} diff --git a/2.x/chapter3-6/src/main/java/com/didispace/chapter36/entity/User.java b/2.x/chapter3-6/src/main/java/com/didispace/chapter36/entity/User.java new file mode 100644 index 00000000..6196ed6d --- /dev/null +++ b/2.x/chapter3-6/src/main/java/com/didispace/chapter36/entity/User.java @@ -0,0 +1,20 @@ +package com.didispace.chapter36.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor +public class User { + + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.x/chapter3-6/src/main/java/com/didispace/chapter36/mapper/UserMapper.java b/2.x/chapter3-6/src/main/java/com/didispace/chapter36/mapper/UserMapper.java new file mode 100644 index 00000000..cd361f46 --- /dev/null +++ b/2.x/chapter3-6/src/main/java/com/didispace/chapter36/mapper/UserMapper.java @@ -0,0 +1,18 @@ +package com.didispace.chapter36.mapper; + +import com.didispace.chapter36.entity.User; +import org.apache.ibatis.annotations.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/2/28. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface UserMapper { + + User findByName(@Param("name") String name); + + int insert(@Param("name") String name, @Param("age") Integer age); + +} diff --git a/2.x/chapter3-6/src/main/resources/application.properties b/2.x/chapter3-6/src/main/resources/application.properties new file mode 100644 index 00000000..ec5cde49 --- /dev/null +++ b/2.x/chapter3-6/src/main/resources/application.properties @@ -0,0 +1,6 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=12345678 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +mybatis.mapper-locations=classpath:mapper/*.xml diff --git a/2.x/chapter3-6/src/main/resources/mapper/UserMapper.xml b/2.x/chapter3-6/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 00000000..520d290e --- /dev/null +++ b/2.x/chapter3-6/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,13 @@ + + + + + + + INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age}) + + \ No newline at end of file diff --git a/2.x/chapter3-6/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java b/2.x/chapter3-6/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java new file mode 100644 index 00000000..aab8acb1 --- /dev/null +++ b/2.x/chapter3-6/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java @@ -0,0 +1,32 @@ +package com.didispace.chapter36; + +import com.didispace.chapter36.entity.User; +import com.didispace.chapter36.mapper.UserMapper; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +@Transactional +public class Chapter36ApplicationTests { + + @Autowired + private UserMapper userMapper; + + @Test + @Rollback + public void test() throws Exception { + userMapper.insert("AAA", 20); + User u = userMapper.findByName("AAA"); + Assert.assertEquals(20, u.getAge().intValue()); + } + +} diff --git a/2.x/chapter3-7/.gitignore b/2.x/chapter3-7/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter3-7/.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/2.x/chapter3-7/pom.xml b/2.x/chapter3-7/pom.xml new file mode 100644 index 00000000..f8314a33 --- /dev/null +++ b/2.x/chapter3-7/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-7 + 0.0.1-SNAPSHOT + 使用JDBCTemplate的多数据源配置 + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter3-7/src/main/java/com/didispace/chapter37/Chapter37Application.java b/2.x/chapter3-7/src/main/java/com/didispace/chapter37/Chapter37Application.java new file mode 100644 index 00000000..92be7068 --- /dev/null +++ b/2.x/chapter3-7/src/main/java/com/didispace/chapter37/Chapter37Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter37; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter37Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter37Application.class, args); + } + +} diff --git a/2.x/chapter3-7/src/main/java/com/didispace/chapter37/DataSourceConfiguration.java b/2.x/chapter3-7/src/main/java/com/didispace/chapter37/DataSourceConfiguration.java new file mode 100644 index 00000000..f821153b --- /dev/null +++ b/2.x/chapter3-7/src/main/java/com/didispace/chapter37/DataSourceConfiguration.java @@ -0,0 +1,39 @@ +package com.didispace.chapter37; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.core.JdbcTemplate; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfiguration { + + @Primary + @Bean + @ConfigurationProperties(prefix = "spring.datasource.primary") + public DataSource primaryDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean + @ConfigurationProperties(prefix = "spring.datasource.secondary") + public DataSource secondaryDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean + public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource primaryDataSource) { + return new JdbcTemplate(primaryDataSource); + } + + @Bean + public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) { + return new JdbcTemplate(secondaryDataSource); + } + +} diff --git a/2.x/chapter3-7/src/main/resources/application.properties b/2.x/chapter3-7/src/main/resources/application.properties new file mode 100644 index 00000000..25937c84 --- /dev/null +++ b/2.x/chapter3-7/src/main/resources/application.properties @@ -0,0 +1,11 @@ +# pring boot 1.x的配置:spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1 +spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1 +spring.datasource.primary.username=root +spring.datasource.primary.password=123456 +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver + +# spring boot 1.x的配置:spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2 +spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2 +spring.datasource.secondary.username=root +spring.datasource.secondary.password=123456 +spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver \ No newline at end of file diff --git a/2.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java b/2.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java new file mode 100644 index 00000000..5aa8a72f --- /dev/null +++ b/2.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java @@ -0,0 +1,46 @@ +package com.didispace.chapter37; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.junit4.SpringRunner; + + +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter37ApplicationTests { + + @Autowired + protected JdbcTemplate primaryJdbcTemplate; + + @Autowired + protected JdbcTemplate secondaryJdbcTemplate; + + @Before + public void setUp() { + primaryJdbcTemplate.update("DELETE FROM USER "); + secondaryJdbcTemplate.update("DELETE FROM USER "); + } + + @Test + public void test() throws Exception { + // 往第一个数据源中插入 2 条数据 + primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "aaa", 20); + primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "bbb", 30); + + // 往第二个数据源中插入 1 条数据,若插入的是第一个数据源,则会主键冲突报错 + secondaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "ccc", 20); + + // 查一下第一个数据源中是否有 2 条数据,验证插入是否成功 + Assert.assertEquals("2", primaryJdbcTemplate.queryForObject("select count(1) from user", String.class)); + + // 查一下第一个数据源中是否有 1 条数据,验证插入是否成功 + Assert.assertEquals("1", secondaryJdbcTemplate.queryForObject("select count(1) from user", String.class)); + } + +} diff --git a/2.x/chapter3-8/.gitignore b/2.x/chapter3-8/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter3-8/.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/2.x/chapter3-8/pom.xml b/2.x/chapter3-8/pom.xml new file mode 100644 index 00000000..cd677906 --- /dev/null +++ b/2.x/chapter3-8/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-8 + 0.0.1-SNAPSHOT + 使用spring-data-jpa的多数据源配置 + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java new file mode 100644 index 00000000..d2e5f499 --- /dev/null +++ b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter38; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +public class Chapter38Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter38Application.class, args); + } + +} diff --git a/2.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java new file mode 100644 index 00000000..6470beb6 --- /dev/null +++ b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java @@ -0,0 +1,29 @@ +package com.didispace.chapter38; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.core.JdbcTemplate; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfiguration { + + @Primary + @Bean + @ConfigurationProperties(prefix = "spring.datasource.primary") + public DataSource primaryDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean + @ConfigurationProperties(prefix = "spring.datasource.secondary") + public DataSource secondaryDataSource() { + return DataSourceBuilder.create().build(); + } + +} diff --git a/2.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java new file mode 100644 index 00000000..3bcfadc0 --- /dev/null +++ b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java @@ -0,0 +1,70 @@ +package com.didispace.chapter38; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; +import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; +import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManager; +import javax.sql.DataSource; +import java.util.Map; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories( + entityManagerFactoryRef="entityManagerFactoryPrimary", + transactionManagerRef="transactionManagerPrimary", + basePackages= { "com.didispace.chapter38.p" }) //设置Repository所在位置 +public class PrimaryConfig { + + @Autowired + @Qualifier("primaryDataSource") + private DataSource primaryDataSource; + + @Autowired + private JpaProperties jpaProperties; + @Autowired + private HibernateProperties hibernateProperties; + + private Map getVendorProperties() { + return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()); + } + + @Primary + @Bean(name = "entityManagerPrimary") + public EntityManager entityManager(EntityManagerFactoryBuilder builder) { + return entityManagerFactoryPrimary(builder).getObject().createEntityManager(); + } + + @Primary + @Bean(name = "entityManagerFactoryPrimary") + public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) { +// HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); +// jpaVendorAdapter.setGenerateDdl(true); + return builder + .dataSource(primaryDataSource) + .packages("com.didispace.chapter38.p") //设置实体类所在位置 + .persistenceUnit("primaryPersistenceUnit") + .properties(getVendorProperties()) + .build(); + } + + @Primary + @Bean(name = "transactionManagerPrimary") + public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { + return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); + } + + +} \ No newline at end of file diff --git a/2.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java new file mode 100644 index 00000000..7b8df6a3 --- /dev/null +++ b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java @@ -0,0 +1,62 @@ +package com.didispace.chapter38; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; +import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; +import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManager; +import javax.sql.DataSource; +import java.util.Map; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories( + entityManagerFactoryRef="entityManagerFactorySecondary", + transactionManagerRef="transactionManagerSecondary", + basePackages= { "com.didispace.chapter38.s" }) //设置Repository所在位置 +public class SecondaryConfig { + + @Autowired + @Qualifier("secondaryDataSource") + private DataSource secondaryDataSource; + + @Autowired + private JpaProperties jpaProperties; + @Autowired + private HibernateProperties hibernateProperties; + + private Map getVendorProperties() { + return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()); + } + + @Bean(name = "entityManagerSecondary") + public EntityManager entityManager(EntityManagerFactoryBuilder builder) { + return entityManagerFactorySecondary(builder).getObject().createEntityManager(); + } + + @Bean(name = "entityManagerFactorySecondary") + public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) { + return builder + .dataSource(secondaryDataSource) + .packages("com.didispace.chapter38.s") //设置实体类所在位置 + .persistenceUnit("secondaryPersistenceUnit") + .properties(getVendorProperties()) + .build(); + } + + @Bean(name = "transactionManagerSecondary") + PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) { + return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject()); + } + +} \ No newline at end of file diff --git a/2.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java new file mode 100644 index 00000000..83aaf3c9 --- /dev/null +++ b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java @@ -0,0 +1,27 @@ +package com.didispace.chapter38.p; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +@Data +@NoArgsConstructor +public class User { + + @Id + @GeneratedValue + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java new file mode 100644 index 00000000..e91080e1 --- /dev/null +++ b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java @@ -0,0 +1,15 @@ +package com.didispace.chapter38.p; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/6/22. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface UserRepository extends JpaRepository { + +} diff --git a/2.x/chapter3-8/src/main/java/com/didispace/chapter38/s/Message.java b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/s/Message.java new file mode 100644 index 00000000..956178b8 --- /dev/null +++ b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/s/Message.java @@ -0,0 +1,29 @@ +package com.didispace.chapter38.s; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +@Data +@NoArgsConstructor +public class Message { + + @Id + @GeneratedValue + private Long id; + + private String title; + private String message; + + public Message(String title, String message) { + this.title = title; + this.message = message; + } + +} \ No newline at end of file diff --git a/2.x/chapter3-8/src/main/java/com/didispace/chapter38/s/MessageRepository.java b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/s/MessageRepository.java new file mode 100644 index 00000000..13360488 --- /dev/null +++ b/2.x/chapter3-8/src/main/java/com/didispace/chapter38/s/MessageRepository.java @@ -0,0 +1,14 @@ +package com.didispace.chapter38.s; + +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * Created by 程序猿DD/翟永超 on 2020/6/22. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface MessageRepository extends JpaRepository { + + +} diff --git a/2.x/chapter3-8/src/main/resources/application.properties b/2.x/chapter3-8/src/main/resources/application.properties new file mode 100644 index 00000000..0d82f6cd --- /dev/null +++ b/2.x/chapter3-8/src/main/resources/application.properties @@ -0,0 +1,16 @@ +# pring boot 1.x的配置:spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1 +spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1 +spring.datasource.primary.username=root +spring.datasource.primary.password=12345678 +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver + +# spring boot 1.x的配置:spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2 +spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2 +spring.datasource.secondary.username=root +spring.datasource.secondary.password=12345678 +spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver + +# 日志打印执行的SQL +spring.jpa.show-sql=true +# Hibernate的DDL策略 +spring.jpa.hibernate.ddl-auto=create-drop diff --git a/2.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java b/2.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java new file mode 100644 index 00000000..9c9ef3e7 --- /dev/null +++ b/2.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java @@ -0,0 +1,42 @@ +package com.didispace.chapter38; + +import com.didispace.chapter38.p.User; +import com.didispace.chapter38.p.UserRepository; +import com.didispace.chapter38.s.Message; +import com.didispace.chapter38.s.MessageRepository; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter38ApplicationTests { + + @Autowired + private UserRepository userRepository; + @Autowired + private MessageRepository messageRepository; + + @Test + public void test() throws Exception { + userRepository.save(new User("aaa", 10)); + userRepository.save(new User("bbb", 20)); + userRepository.save(new User("ccc", 30)); + userRepository.save(new User("ddd", 40)); + userRepository.save(new User("eee", 50)); + + Assert.assertEquals(5, userRepository.findAll().size()); + + messageRepository.save(new Message("o1", "aaaaaaaaaa")); + messageRepository.save(new Message("o2", "bbbbbbbbbb")); + messageRepository.save(new Message("o3", "cccccccccc")); + + Assert.assertEquals(3, messageRepository.findAll().size()); + } + +} diff --git a/2.x/chapter3-9/.gitignore b/2.x/chapter3-9/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter3-9/.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/2.x/chapter3-9/pom.xml b/2.x/chapter3-9/pom.xml new file mode 100644 index 00000000..f8572620 --- /dev/null +++ b/2.x/chapter3-9/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter3-9 + 0.0.1-SNAPSHOT + 使用MyBatis的多数据源配置 + + + 1.8 + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.1 + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java new file mode 100644 index 00000000..eb46b057 --- /dev/null +++ b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter39; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter39Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter39Application.class, args); + } + +} diff --git a/2.x/chapter3-9/src/main/java/com/didispace/chapter39/DataSourceConfiguration.java b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/DataSourceConfiguration.java new file mode 100644 index 00000000..6eaae095 --- /dev/null +++ b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/DataSourceConfiguration.java @@ -0,0 +1,27 @@ +package com.didispace.chapter39; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfiguration { + + @Primary + @Bean + @ConfigurationProperties(prefix = "spring.datasource.primary") + public DataSource primaryDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean + @ConfigurationProperties(prefix = "spring.datasource.secondary") + public DataSource secondaryDataSource() { + return DataSourceBuilder.create().build(); + } + +} diff --git a/2.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java new file mode 100644 index 00000000..f6d1bbe5 --- /dev/null +++ b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java @@ -0,0 +1,38 @@ +package com.didispace.chapter39; + +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +@Configuration +@MapperScan( + basePackages = "com.didispace.chapter39.p", + sqlSessionFactoryRef = "sqlSessionFactoryPrimary", + sqlSessionTemplateRef = "sqlSessionTemplatePrimary") +public class PrimaryConfig { + + private DataSource primaryDataSource; + + public PrimaryConfig(@Qualifier("primaryDataSource") DataSource primaryDataSource) { + this.primaryDataSource = primaryDataSource; + } + + @Bean + public SqlSessionFactory sqlSessionFactoryPrimary() throws Exception { + SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); + bean.setDataSource(primaryDataSource); + return bean.getObject(); + } + + @Bean + public SqlSessionTemplate sqlSessionTemplatePrimary() throws Exception { + return new SqlSessionTemplate(sqlSessionFactoryPrimary()); + } + +} \ No newline at end of file diff --git a/2.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java new file mode 100644 index 00000000..bdb17fba --- /dev/null +++ b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java @@ -0,0 +1,38 @@ +package com.didispace.chapter39; + +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +@Configuration +@MapperScan( + basePackages = "com.didispace.chapter39.s", + sqlSessionFactoryRef = "sqlSessionFactorySecondary", + sqlSessionTemplateRef = "sqlSessionTemplateSecondary") +public class SecondaryConfig { + + private DataSource secondaryDataSource; + + public SecondaryConfig(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) { + this.secondaryDataSource = secondaryDataSource; + } + + @Bean + public SqlSessionFactory sqlSessionFactorySecondary() throws Exception { + SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); + bean.setDataSource(secondaryDataSource); + return bean.getObject(); + } + + @Bean + public SqlSessionTemplate sqlSessionTemplateSecondary() throws Exception { + return new SqlSessionTemplate(sqlSessionFactorySecondary()); + } + +} \ No newline at end of file diff --git a/2.x/chapter3-9/src/main/java/com/didispace/chapter39/p/entity/UserPrimary.java b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/p/entity/UserPrimary.java new file mode 100644 index 00000000..f4c2a299 --- /dev/null +++ b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/p/entity/UserPrimary.java @@ -0,0 +1,20 @@ +package com.didispace.chapter39.p.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor +public class UserPrimary { + + private Long id; + + private String name; + private Integer age; + + public UserPrimary(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.x/chapter3-9/src/main/java/com/didispace/chapter39/p/mapper/UserMapperPrimary.java b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/p/mapper/UserMapperPrimary.java new file mode 100644 index 00000000..869ab546 --- /dev/null +++ b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/p/mapper/UserMapperPrimary.java @@ -0,0 +1,26 @@ +package com.didispace.chapter39.p.mapper; + +import com.didispace.chapter39.p.entity.UserPrimary; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * Created by 程序猿DD/翟永超 on 2020/2/28. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface UserMapperPrimary { + + @Select("SELECT * FROM USER WHERE NAME = #{name}") + UserPrimary findByName(@Param("name") String name); + + @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})") + int insert(@Param("name") String name, @Param("age") Integer age); + + @Delete("DELETE FROM USER") + int deleteAll(); + +} diff --git a/2.x/chapter3-9/src/main/java/com/didispace/chapter39/s/entity/UserSecondary.java b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/s/entity/UserSecondary.java new file mode 100644 index 00000000..fdd64dff --- /dev/null +++ b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/s/entity/UserSecondary.java @@ -0,0 +1,20 @@ +package com.didispace.chapter39.s.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor +public class UserSecondary { + + private Long id; + + private String name; + private Integer age; + + public UserSecondary(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.x/chapter3-9/src/main/java/com/didispace/chapter39/s/mapper/UserMapperSecondary.java b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/s/mapper/UserMapperSecondary.java new file mode 100644 index 00000000..bb4b004c --- /dev/null +++ b/2.x/chapter3-9/src/main/java/com/didispace/chapter39/s/mapper/UserMapperSecondary.java @@ -0,0 +1,25 @@ +package com.didispace.chapter39.s.mapper; + +import com.didispace.chapter39.s.entity.UserSecondary; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * Created by 程序猿DD/翟永超 on 2020/2/28. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface UserMapperSecondary { + + @Select("SELECT * FROM USER WHERE NAME = #{name}") + UserSecondary findByName(@Param("name") String name); + + @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})") + int insert(@Param("name") String name, @Param("age") Integer age); + + @Delete("DELETE FROM USER") + int deleteAll(); +} diff --git a/2.x/chapter3-9/src/main/resources/application.properties b/2.x/chapter3-9/src/main/resources/application.properties new file mode 100644 index 00000000..87777023 --- /dev/null +++ b/2.x/chapter3-9/src/main/resources/application.properties @@ -0,0 +1,13 @@ +# pring boot 1.x的配置:spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1 +spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1 +spring.datasource.primary.username=root +spring.datasource.primary.password=12345678 +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver + +# spring boot 1.x的配置:spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2 +spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2 +spring.datasource.secondary.username=root +spring.datasource.secondary.password=12345678 +spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver + +#mybatis.mapper-locations=classpath:mapper/*.xml diff --git a/2.x/chapter3-9/src/main/resources/mapper.primary/UserMapper.xml b/2.x/chapter3-9/src/main/resources/mapper.primary/UserMapper.xml new file mode 100644 index 00000000..6eae360b --- /dev/null +++ b/2.x/chapter3-9/src/main/resources/mapper.primary/UserMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age}) + + + \ No newline at end of file diff --git a/2.x/chapter3-9/src/main/resources/mapper.secondary/UserMapper.xml b/2.x/chapter3-9/src/main/resources/mapper.secondary/UserMapper.xml new file mode 100644 index 00000000..361cd16e --- /dev/null +++ b/2.x/chapter3-9/src/main/resources/mapper.secondary/UserMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age}) + + + \ No newline at end of file diff --git a/2.x/chapter3-9/src/test/java/com/didispace/chapter39/Chapter39ApplicationTests.java b/2.x/chapter3-9/src/test/java/com/didispace/chapter39/Chapter39ApplicationTests.java new file mode 100644 index 00000000..a1bd3a81 --- /dev/null +++ b/2.x/chapter3-9/src/test/java/com/didispace/chapter39/Chapter39ApplicationTests.java @@ -0,0 +1,60 @@ +package com.didispace.chapter39; + +import com.didispace.chapter39.p.entity.UserPrimary; +import com.didispace.chapter39.p.mapper.UserMapperPrimary; +import com.didispace.chapter39.s.entity.UserSecondary; +import com.didispace.chapter39.s.mapper.UserMapperSecondary; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +@Transactional +public class Chapter39ApplicationTests { + + @Autowired + private UserMapperPrimary userMapperPrimary; + @Autowired + private UserMapperSecondary userMapperSecondary; + + @Before + public void setUp() { + // 清空测试表,保证每次结果一样 + userMapperPrimary.deleteAll(); + userMapperSecondary.deleteAll(); + } + + @Test + public void test() throws Exception { + // 往Primary数据源插入一条数据 + userMapperPrimary.insert("AAA", 20); + + // 从Primary数据源查询刚才插入的数据,配置正确就可以查询到 + UserPrimary userPrimary = userMapperPrimary.findByName("AAA"); + Assert.assertEquals(20, userPrimary.getAge().intValue()); + + // 从Secondary数据源查询刚才插入的数据,配置正确应该是查询不到的 + UserSecondary userSecondary = userMapperSecondary.findByName("AAA"); + Assert.assertNull(userSecondary); + + // 往Secondary数据源插入一条数据 + userMapperSecondary.insert("BBB", 20); + + // 从Primary数据源查询刚才插入的数据,配置正确应该是查询不到的 + userPrimary = userMapperPrimary.findByName("BBB"); + Assert.assertNull(userPrimary); + + // 从Secondary数据源查询刚才插入的数据,配置正确就可以查询到 + userSecondary = userMapperSecondary.findByName("BBB"); + Assert.assertEquals(20, userSecondary.getAge().intValue()); + } + +} diff --git a/2.x/chapter4-1/.gitignore b/2.x/chapter4-1/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter4-1/.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/2.x/chapter4-1/pom.xml b/2.x/chapter4-1/pom.xml new file mode 100644 index 00000000..e8191b85 --- /dev/null +++ b/2.x/chapter4-1/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter4-1 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter4-1/src/main/java/com/didispace/chapter41/Chapter41Application.java b/2.x/chapter4-1/src/main/java/com/didispace/chapter41/Chapter41Application.java new file mode 100644 index 00000000..8ec9c806 --- /dev/null +++ b/2.x/chapter4-1/src/main/java/com/didispace/chapter41/Chapter41Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter41; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter41Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter41Application.class, args); + } + +} diff --git a/2.x/chapter4-1/src/main/java/com/didispace/chapter41/HelloController.java b/2.x/chapter4-1/src/main/java/com/didispace/chapter41/HelloController.java new file mode 100644 index 00000000..314074d1 --- /dev/null +++ b/2.x/chapter4-1/src/main/java/com/didispace/chapter41/HelloController.java @@ -0,0 +1,19 @@ +package com.didispace.chapter41; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class HelloController { + + @GetMapping("/") + public String index(ModelMap map) { + // 加入一个属性,用来在模板中读取 + map.addAttribute("host", "http://blog.didispace.com"); + + // return模板文件的名称,对应src/main/resources/templates/index.html + return "index"; + } + +} \ No newline at end of file diff --git a/2.x/chapter4-1/src/main/resources/application.properties b/2.x/chapter4-1/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/2.x/chapter4-1/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/2.x/chapter4-1/src/main/resources/templates/index.html b/2.x/chapter4-1/src/main/resources/templates/index.html new file mode 100644 index 00000000..32cbfe84 --- /dev/null +++ b/2.x/chapter4-1/src/main/resources/templates/index.html @@ -0,0 +1,10 @@ + + + + + + + +

Hello World

+ + \ No newline at end of file diff --git a/2.x/chapter4-2/.gitignore b/2.x/chapter4-2/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter4-2/.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/2.x/chapter4-2/pom.xml b/2.x/chapter4-2/pom.xml new file mode 100644 index 00000000..d6022db9 --- /dev/null +++ b/2.x/chapter4-2/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter4-2 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter4-2/src/main/java/com/didispace/chapter42/Chapter42Application.java b/2.x/chapter4-2/src/main/java/com/didispace/chapter42/Chapter42Application.java new file mode 100644 index 00000000..00b646c5 --- /dev/null +++ b/2.x/chapter4-2/src/main/java/com/didispace/chapter42/Chapter42Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter42; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter42Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter42Application.class, args); + } + +} diff --git a/2.x/chapter4-2/src/main/java/com/didispace/chapter42/HelloController.java b/2.x/chapter4-2/src/main/java/com/didispace/chapter42/HelloController.java new file mode 100644 index 00000000..0e01264b --- /dev/null +++ b/2.x/chapter4-2/src/main/java/com/didispace/chapter42/HelloController.java @@ -0,0 +1,16 @@ +package com.didispace.chapter42; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class HelloController { + + @GetMapping("/") + public String index(ModelMap map) { + // return模板文件的名称,对应src/main/resources/templates/index.html + return "index"; + } + +} \ No newline at end of file diff --git a/2.x/chapter4-2/src/main/resources/application.properties b/2.x/chapter4-2/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/2.x/chapter4-2/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/2.x/chapter4-2/src/main/resources/templates/index.html b/2.x/chapter4-2/src/main/resources/templates/index.html new file mode 100644 index 00000000..7c8a648b --- /dev/null +++ b/2.x/chapter4-2/src/main/resources/templates/index.html @@ -0,0 +1,30 @@ + + + + + Spring Boot中使用ECharts + + + +
+ + + + \ No newline at end of file diff --git a/2.x/chapter5-1/.gitignore b/2.x/chapter5-1/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter5-1/.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/2.x/chapter5-1/pom.xml b/2.x/chapter5-1/pom.xml new file mode 100644 index 00000000..2af64776 --- /dev/null +++ b/2.x/chapter5-1/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter5-1 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-cache + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter5-1/src/main/java/com/didispace/chapter51/Chapter51Application.java b/2.x/chapter5-1/src/main/java/com/didispace/chapter51/Chapter51Application.java new file mode 100644 index 00000000..b855c592 --- /dev/null +++ b/2.x/chapter5-1/src/main/java/com/didispace/chapter51/Chapter51Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter51; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; + +@EnableCaching +@SpringBootApplication +public class Chapter51Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter51Application.class, args); + } + +} diff --git a/2.x/chapter5-1/src/main/java/com/didispace/chapter51/User.java b/2.x/chapter5-1/src/main/java/com/didispace/chapter51/User.java new file mode 100644 index 00000000..55ae4a76 --- /dev/null +++ b/2.x/chapter5-1/src/main/java/com/didispace/chapter51/User.java @@ -0,0 +1,26 @@ +package com.didispace.chapter51; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +@Data +@NoArgsConstructor +public class User { + + @Id + @GeneratedValue + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.x/chapter5-1/src/main/java/com/didispace/chapter51/UserRepository.java b/2.x/chapter5-1/src/main/java/com/didispace/chapter51/UserRepository.java new file mode 100644 index 00000000..2785e7ae --- /dev/null +++ b/2.x/chapter5-1/src/main/java/com/didispace/chapter51/UserRepository.java @@ -0,0 +1,26 @@ +package com.didispace.chapter51; + +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/7/13. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +@CacheConfig(cacheNames = "users") +public interface UserRepository extends JpaRepository { + + @Cacheable + User findByName(String name); + + User findByNameAndAge(String name, Integer age); + + @Query("from User u where u.name=:name") + User findUser(@Param("name") String name); + +} diff --git a/2.x/chapter5-1/src/main/resources/application.properties b/2.x/chapter5-1/src/main/resources/application.properties new file mode 100644 index 00000000..ba1e5990 --- /dev/null +++ b/2.x/chapter5-1/src/main/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=12345678 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=create-drop \ No newline at end of file diff --git a/2.x/chapter5-1/src/test/java/com/didispace/chapter51/Chapter51ApplicationTests.java b/2.x/chapter5-1/src/test/java/com/didispace/chapter51/Chapter51ApplicationTests.java new file mode 100644 index 00000000..3d4dabbd --- /dev/null +++ b/2.x/chapter5-1/src/test/java/com/didispace/chapter51/Chapter51ApplicationTests.java @@ -0,0 +1,34 @@ +package com.didispace.chapter51; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cache.CacheManager; +import org.springframework.test.context.junit4.SpringRunner; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter51ApplicationTests { + + @Autowired + private UserRepository userRepository; + + @Autowired + private CacheManager cacheManager; + + @Test + public void test() throws Exception { + // 创建1条记录 + userRepository.save(new User("AAA", 10)); + + User u1 = userRepository.findByName("AAA"); + System.out.println("第一次查询:" + u1.getAge()); + + User u2 = userRepository.findByName("AAA"); + System.out.println("第二次查询:" + u2.getAge()); + } + +} diff --git a/2.x/chapter5-2/.gitignore b/2.x/chapter5-2/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter5-2/.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/2.x/chapter5-2/pom.xml b/2.x/chapter5-2/pom.xml new file mode 100644 index 00000000..bb82477e --- /dev/null +++ b/2.x/chapter5-2/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter5-2 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-cache + + + + net.sf.ehcache + ehcache + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter5-2/src/main/java/com/didispace/chapter52/Chapter52Application.java b/2.x/chapter5-2/src/main/java/com/didispace/chapter52/Chapter52Application.java new file mode 100644 index 00000000..e4842885 --- /dev/null +++ b/2.x/chapter5-2/src/main/java/com/didispace/chapter52/Chapter52Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter52; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; + +@EnableCaching +@SpringBootApplication +public class Chapter52Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter52Application.class, args); + } + +} diff --git a/2.x/chapter5-2/src/main/java/com/didispace/chapter52/User.java b/2.x/chapter5-2/src/main/java/com/didispace/chapter52/User.java new file mode 100644 index 00000000..9fb641f0 --- /dev/null +++ b/2.x/chapter5-2/src/main/java/com/didispace/chapter52/User.java @@ -0,0 +1,26 @@ +package com.didispace.chapter52; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +@Data +@NoArgsConstructor +public class User { + + @Id + @GeneratedValue + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.x/chapter5-2/src/main/java/com/didispace/chapter52/UserRepository.java b/2.x/chapter5-2/src/main/java/com/didispace/chapter52/UserRepository.java new file mode 100644 index 00000000..4dad3d06 --- /dev/null +++ b/2.x/chapter5-2/src/main/java/com/didispace/chapter52/UserRepository.java @@ -0,0 +1,21 @@ +package com.didispace.chapter52; + +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/7/14. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +@CacheConfig(cacheNames = "users") +public interface UserRepository extends JpaRepository { + + @Cacheable + User findByName(String name); + +} diff --git a/2.x/chapter5-2/src/main/resources/application.properties b/2.x/chapter5-2/src/main/resources/application.properties new file mode 100644 index 00000000..ba1e5990 --- /dev/null +++ b/2.x/chapter5-2/src/main/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=12345678 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=create-drop \ No newline at end of file diff --git a/2.x/chapter5-2/src/main/resources/ehcache.xml b/2.x/chapter5-2/src/main/resources/ehcache.xml new file mode 100644 index 00000000..c178cc9f --- /dev/null +++ b/2.x/chapter5-2/src/main/resources/ehcache.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/2.x/chapter5-2/src/test/java/com/didispace/chapter52/Chapter52ApplicationTests.java b/2.x/chapter5-2/src/test/java/com/didispace/chapter52/Chapter52ApplicationTests.java new file mode 100644 index 00000000..76c505c9 --- /dev/null +++ b/2.x/chapter5-2/src/test/java/com/didispace/chapter52/Chapter52ApplicationTests.java @@ -0,0 +1,36 @@ +package com.didispace.chapter52; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cache.CacheManager; +import org.springframework.test.context.junit4.SpringRunner; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter52ApplicationTests { + + @Autowired + private UserRepository userRepository; + + @Autowired + private CacheManager cacheManager; + + @Test + public void test() throws Exception { + System.out.println("CacheManager type : " + cacheManager.getClass()); + + // 创建1条记录 + userRepository.save(new User("AAA", 10)); + + User u1 = userRepository.findByName("AAA"); + System.out.println("第一次查询:" + u1.getAge()); + + User u2 = userRepository.findByName("AAA"); + System.out.println("第二次查询:" + u2.getAge()); + } + +} diff --git a/2.x/chapter5-3/.gitignore b/2.x/chapter5-3/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter5-3/.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/2.x/chapter5-3/pom.xml b/2.x/chapter5-3/pom.xml new file mode 100644 index 00000000..c0bb21fd --- /dev/null +++ b/2.x/chapter5-3/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter5-3 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-cache + + + + net.sf.ehcache + ehcache + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter5-3/src/main/java/com/didispace/chapter53/Chapter53Application.java b/2.x/chapter5-3/src/main/java/com/didispace/chapter53/Chapter53Application.java new file mode 100644 index 00000000..3abe9f33 --- /dev/null +++ b/2.x/chapter5-3/src/main/java/com/didispace/chapter53/Chapter53Application.java @@ -0,0 +1,50 @@ +package com.didispace.chapter53; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.rmi.registry.LocateRegistry; + +@EnableCaching +@SpringBootApplication +public class Chapter53Application { + + public static void main(String[] args) throws Exception { +// LocateRegistry.createRegistry(Integer.valueOf(System.getProperty("rmi.port"))); + SpringApplication.run(Chapter53Application.class, args); + } + + @RestController + static class HelloController { + + @Autowired + private UserRepository userRepository; + + @GetMapping("/create") + public void create() { + userRepository.save(new User("AAA", 10)); + } + + @GetMapping("/update") + public User update() { + User u1 = userRepository.findByName("AAA"); + u1.setAge(20); + u1 = userRepository.save(u1); + return u1; + } + + @GetMapping("/find") + public User find() { + User u1 = userRepository.findByName("AAA"); + System.out.println("查询AAA用户:" + u1.getAge()); + return u1; + } + + } + +} diff --git a/2.x/chapter5-3/src/main/java/com/didispace/chapter53/User.java b/2.x/chapter5-3/src/main/java/com/didispace/chapter53/User.java new file mode 100644 index 00000000..2986b7d4 --- /dev/null +++ b/2.x/chapter5-3/src/main/java/com/didispace/chapter53/User.java @@ -0,0 +1,27 @@ +package com.didispace.chapter53; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import java.io.Serializable; + +@Entity +@Data +@NoArgsConstructor +public class User implements Serializable { + + @Id + @GeneratedValue + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} diff --git a/2.x/chapter5-3/src/main/java/com/didispace/chapter53/UserRepository.java b/2.x/chapter5-3/src/main/java/com/didispace/chapter53/UserRepository.java new file mode 100644 index 00000000..4d52745e --- /dev/null +++ b/2.x/chapter5-3/src/main/java/com/didispace/chapter53/UserRepository.java @@ -0,0 +1,21 @@ +package com.didispace.chapter53; + +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/7/16. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +@CacheConfig(cacheNames = "users") +public interface UserRepository extends JpaRepository { + + @Cacheable + User findByName(String name); + +} diff --git a/2.x/chapter5-3/src/main/resources/application.properties b/2.x/chapter5-3/src/main/resources/application.properties new file mode 100644 index 00000000..43e74c79 --- /dev/null +++ b/2.x/chapter5-3/src/main/resources/application.properties @@ -0,0 +1,17 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=12345678 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=create + +#logging.level.net.sf.ehcache=debug + +# 不同实例的配置 +#spring.cache.ehcache.config=classpath:ehcache-1.xml +#spring.cache.ehcache.config=classpath:ehcache-2.xml + +# 用不同命令启动不同实例 +#-Dserver.port=8001 -Dspring.cache.ehcache.config=classpath:ehcache-1.xml +#-Dserver.port=8002 -Dspring.cache.ehcache.config=classpath:ehcache-2.xml diff --git a/2.x/chapter5-3/src/main/resources/ehcache-1.xml b/2.x/chapter5-3/src/main/resources/ehcache-1.xml new file mode 100644 index 00000000..fbc88162 --- /dev/null +++ b/2.x/chapter5-3/src/main/resources/ehcache-1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/2.x/chapter5-3/src/main/resources/ehcache-2.xml b/2.x/chapter5-3/src/main/resources/ehcache-2.xml new file mode 100644 index 00000000..878b6be2 --- /dev/null +++ b/2.x/chapter5-3/src/main/resources/ehcache-2.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/2.x/chapter5-3/src/test/java/com/didispace/chapter53/Chapter53ApplicationTests.java b/2.x/chapter5-3/src/test/java/com/didispace/chapter53/Chapter53ApplicationTests.java new file mode 100644 index 00000000..0e9c2939 --- /dev/null +++ b/2.x/chapter5-3/src/test/java/com/didispace/chapter53/Chapter53ApplicationTests.java @@ -0,0 +1,36 @@ +package com.didispace.chapter53; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cache.CacheManager; +import org.springframework.test.context.junit4.SpringRunner; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter53ApplicationTests { + + @Autowired + private UserRepository userRepository; + + @Autowired + private CacheManager cacheManager; + + @Test + public void test() throws Exception { + System.out.println("CacheManager type : " + cacheManager.getClass()); + + // 创建1条记录 + userRepository.save(new User("AAA", 10)); + + User u1 = userRepository.findByName("AAA"); + System.out.println("第一次查询:" + u1.getAge()); + + User u2 = userRepository.findByName("AAA"); + System.out.println("第二次查询:" + u2.getAge()); + } + +} diff --git a/2.x/chapter5-4/.gitignore b/2.x/chapter5-4/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter5-4/.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/2.x/chapter5-4/pom.xml b/2.x/chapter5-4/pom.xml new file mode 100644 index 00000000..c33d2854 --- /dev/null +++ b/2.x/chapter5-4/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter5-4 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.apache.commons + commons-pool2 + + + + org.springframework.boot + spring-boot-starter-actuator + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter5-4/src/main/java/com/didispace/chapter54/Chapter54Application.java b/2.x/chapter5-4/src/main/java/com/didispace/chapter54/Chapter54Application.java new file mode 100644 index 00000000..f2789f8b --- /dev/null +++ b/2.x/chapter5-4/src/main/java/com/didispace/chapter54/Chapter54Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter54; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; + +@EnableCaching +@SpringBootApplication +public class Chapter54Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter54Application.class, args); + } + +} diff --git a/2.x/chapter5-4/src/main/java/com/didispace/chapter54/User.java b/2.x/chapter5-4/src/main/java/com/didispace/chapter54/User.java new file mode 100644 index 00000000..11e2dc13 --- /dev/null +++ b/2.x/chapter5-4/src/main/java/com/didispace/chapter54/User.java @@ -0,0 +1,27 @@ +package com.didispace.chapter54; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import java.io.Serializable; + +@Entity +@Data +@NoArgsConstructor +public class User implements Serializable { + + @Id + @GeneratedValue + private Long id; + + private String name; + private Integer age; + + public User(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.x/chapter5-4/src/main/java/com/didispace/chapter54/UserRepository.java b/2.x/chapter5-4/src/main/java/com/didispace/chapter54/UserRepository.java new file mode 100644 index 00000000..4b14b113 --- /dev/null +++ b/2.x/chapter5-4/src/main/java/com/didispace/chapter54/UserRepository.java @@ -0,0 +1,26 @@ +package com.didispace.chapter54; + +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2020/7/26. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +@CacheConfig(cacheNames = "users") +public interface UserRepository extends JpaRepository { + + @Cacheable + User findByName(String name); + + User findByNameAndAge(String name, Integer age); + + @Query("from User u where u.name=:name") + User findUser(@Param("name") String name); + +} diff --git a/2.x/chapter5-4/src/main/resources/application.properties b/2.x/chapter5-4/src/main/resources/application.properties new file mode 100644 index 00000000..7136291e --- /dev/null +++ b/2.x/chapter5-4/src/main/resources/application.properties @@ -0,0 +1,16 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=12345678 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=create-drop + +spring.redis.host=localhost +spring.redis.port=6379 +spring.redis.lettuce.pool.max-idle=8 +spring.redis.lettuce.pool.max-active=8 +spring.redis.lettuce.pool.max-wait=-1ms +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms diff --git a/2.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java b/2.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java new file mode 100644 index 00000000..de5a7185 --- /dev/null +++ b/2.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java @@ -0,0 +1,36 @@ +package com.didispace.chapter54; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cache.CacheManager; +import org.springframework.test.context.junit4.SpringRunner; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class Chapter54ApplicationTests { + + @Autowired + private UserRepository userRepository; + + @Autowired + private CacheManager cacheManager; + + @Test + public void test() throws Exception { + System.out.println("CacheManager type : " + cacheManager.getClass()); + + // 创建1条记录 + userRepository.save(new User("AAA", 10)); + + User u1 = userRepository.findByName("AAA"); + System.out.println("第一次查询:" + u1.getAge()); + + User u2 = userRepository.findByName("AAA"); + System.out.println("第二次查询:" + u2.getAge()); + } + +} diff --git a/2.x/pom.xml b/2.x/pom.xml new file mode 100644 index 00000000..26b0293f --- /dev/null +++ b/2.x/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + + com.didispace + SpringBoot-Learning + 2.0-SNAPSHOT + 全网Star最多的Spring Boot基础教程 + + + + chapter1-1 + + + chapter2-1 + chapter2-2 + chapter2-3 + chapter2-4 + chapter2-5 + chapter2-6 + chapter2-7 + + + + chapter3-1 + chapter3-2 + chapter3-3 + chapter3-4 + chapter3-5 + chapter3-6 + chapter3-7 + chapter3-8 + chapter3-9 + chapter3-10 + + + + + + chapter4-1 + chapter4-2 + + + chapter5-1 + chapter5-2 + chapter5-3 + chapter5-4 + + + + + + + + + + + + From 7f203191afeea6591b5bd1a706604375b69428cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 16 Dec 2020 15:25:16 +0800 Subject: [PATCH 038/160] =?UTF-8?q?2.1.x=E5=86=85=E5=AE=B9=E5=B9=B6?= =?UTF-8?q?=E5=85=A52.x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 19 ++++++++++--------- 2.x/README_zh.md | 19 ++++++++++++++----- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index 1099743e..2d7531c9 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -1,6 +1,6 @@ # Spring Boot基础教程(2.x版本) -本项目内容为[《Spring Boot基础教程》](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 +本项目内容为[《Spring Boot基础教程》](http://blog.didispace.com/spring-boot-learning-2x/)的程序样例。 **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! @@ -97,6 +97,8 @@ - [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) - [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) +## 版本资讯 + ### 1.x到2.x - [Spring Boot 2.0 正式发布,升还是不升呢?](http://blog.didispace.com/spring-boot-2-release/) @@ -105,15 +107,14 @@ - [Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析](http://blog.didispace.com/Spring-Boot-2-0-feature-1-relaxed-binding-2/) - [Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent](http://blog.didispace.com/Spring-Boot-2-0-feature-2-ApplicationStartedEvent/) -## 推荐内容 +### 2.x版本信息 -- [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 -- [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 -- [GitHub](https://github.com/dyc87112/SpringBoot-Learning):Star支持一下呗 -- [Gitee](https://gitee.com/didispace/SpringBoot-Learning):Star支持一下呗 -- [Spring问答社区](http://www.spring4all.com/):如果您有什么问题,可以去这里发帖 -- [Spring Boot基础教程](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 -- [Spring Cloud基础教程](http://blog.didispace.com/Spring-Cloud%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网最早最全的免费Spring Cloud基础教程 +- [Spring Boot 2.2 正式发布,大幅性能提升 + Java 13 支持](http://blog.didispace.com/spring-boot-2-2-release/) +- [Spring Boot 2.3.0 发布](/spring-boot-2-3-0-release/) +- [Spring Boot 2.3.0 放弃 Maven 转投 Gradle](/spring-boot-gradle/) +- [Spring Boot 2.3.2 发布,解决 Too many open files 导致的应用宕机问题](http://blog.didispace.com/spring-boot-2-3-2-release/) +- [Spring Boot 2.4.0 正式发布!全新的配置处理机制,拥抱云原生!](http://blog.didispace.com/spring-boot-2-4-0-ga/) +- [Spring Boot 2.4.1 发布,修正大量2.4全新配置机制的Bug](http://blog.didispace.com/spring-boot-2-4-1-release/) ## 我的公众号 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index c276674d..6dedba30 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -1,6 +1,6 @@ # Spring Boot基础教程(2.x版本) -本项目内容为[《Spring Boot基础教程》](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 +本项目内容为[《Spring Boot基础教程》](http://blog.didispace.com/spring-boot-learning-2x/)的程序样例。 **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! @@ -9,8 +9,6 @@ 2. 点个`Star`并`Follow`我 3. 把该仓库分享给更多的朋友 -如果您对文字类教程不感冒或者想要通过综合案例学习Spring,那么给您推荐这个我觉得目前内容与价格最良心的视频课程:["玩转Spring全家桶"](https://time.geekbang.org/course/intro/100023501?code=d1se%2F7ugeBEyuU%2FIYp1ynfSZa6ulbGhhDK%2Fkpn3-lFc%3D) - > **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
## 特别赞助商 @@ -98,6 +96,8 @@ - [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) - [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) +## 版本资讯 + ### 1.x到2.x - [Spring Boot 2.0 正式发布,升还是不升呢?](http://blog.didispace.com/spring-boot-2-release/) @@ -106,6 +106,15 @@ - [Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析](http://blog.didispace.com/Spring-Boot-2-0-feature-1-relaxed-binding-2/) - [Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent](http://blog.didispace.com/Spring-Boot-2-0-feature-2-ApplicationStartedEvent/) +### 2.x版本信息 + +- [Spring Boot 2.2 正式发布,大幅性能提升 + Java 13 支持](http://blog.didispace.com/spring-boot-2-2-release/) +- [Spring Boot 2.3.0 发布](/spring-boot-2-3-0-release/) +- [Spring Boot 2.3.0 放弃 Maven 转投 Gradle](/spring-boot-gradle/) +- [Spring Boot 2.3.2 发布,解决 Too many open files 导致的应用宕机问题](http://blog.didispace.com/spring-boot-2-3-2-release/) +- [Spring Boot 2.4.0 正式发布!全新的配置处理机制,拥抱云原生!](http://blog.didispace.com/spring-boot-2-4-0-ga/) +- [Spring Boot 2.4.1 发布,修正大量2.4全新配置机制的Bug](http://blog.didispace.com/spring-boot-2-4-1-release/) + ## 推荐内容 - [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 @@ -120,6 +129,6 @@ -## 我出版的书 +## 推荐我的书 -![输入图片说明](https://git.oschina.net/uploads/images/2017/0416/233656_dd3bce94_437188.png "在这里输入图片标题") +![](https://git.oschina.net/uploads/images/2017/0416/233656_dd3bce94_437188.png "在这里输入图片标题") From f66a3f35e72b185769394596734aebbe7aa37dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 16 Dec 2020 15:26:57 +0800 Subject: [PATCH 039/160] =?UTF-8?q?2.1.x=E5=86=85=E5=AE=B9=E5=B9=B6?= =?UTF-8?q?=E5=85=A52.x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +-- README_zh.md | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b439beed..d0cb96e0 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,10 @@ 2. 点个`Star`并`Follow`我 3. 把该仓库分享给更多的朋友 - ## 教程目录 - [Spring Boot 1.x 版本教程](./1.x) -- [Spring Boot 2.x 版本教程](./2.1.x) +- [Spring Boot 2.x 版本教程](./2.x) > **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
diff --git a/README_zh.md b/README_zh.md index 59a3e2d8..8b2a9e74 100644 --- a/README_zh.md +++ b/README_zh.md @@ -9,12 +9,10 @@ 2. 点个`Star`并`Follow`我 3. 把该仓库分享给更多的朋友 -如果您对文字类教程不感冒或者想要通过综合案例学习Spring,那么给您推荐这个我觉得目前内容与价格最良心的视频课程:["玩转Spring全家桶"](https://time.geekbang.org/course/intro/100023501?code=d1se%2F7ugeBEyuU%2FIYp1ynfSZa6ulbGhhDK%2Fkpn3-lFc%3D) - ## 教程目录 - [Spring Boot 1.x 版本教程](./1.x) -- [Spring Boot 2.x 版本教程](./2.1.x) +- [Spring Boot 2.x 版本教程](./2.x) > **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
From 0f79b374700d6713a8e865c671faadf76cefe309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 16 Dec 2020 17:21:42 +0800 Subject: [PATCH 040/160] =?UTF-8?q?Spring=20Boot=202.4=20=E5=A4=9A?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=85=8D=E7=BD=AE=E6=94=AF=E6=8C=81=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 4 ++ 2.x/README_zh.md | 4 ++ 2.x/chapter1-2/.gitignore | 29 +++++++++++++ 2.x/chapter1-2/pom.xml | 43 +++++++++++++++++++ .../chapter12/Chapter12Application.java | 29 +++++++++++++ .../src/main/resources/application.yaml | 31 +++++++++++++ 2.x/pom.xml | 3 ++ 7 files changed, 143 insertions(+) create mode 100644 2.x/chapter1-2/.gitignore create mode 100644 2.x/chapter1-2/pom.xml create mode 100644 2.x/chapter1-2/src/main/java/com/didispace/chapter12/Chapter12Application.java create mode 100644 2.x/chapter1-2/src/main/resources/application.yaml diff --git a/2.x/README.md b/2.x/README.md index 2d7531c9..fc7f03e2 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -59,7 +59,11 @@ - [Spring Boot 2.x基础教程:版本关系](http://blog.didispace.com/spring-cloud-alibaba-version/) - [Spring Boot 2.x基础教程:快速入门](http://blog.didispace.com/spring-boot-learning-21-1-1/) - [Spring Boot 2.x基础教程:工程结构推荐](http://blog.didispace.com/spring-boot-learning-21-1-2/) + +### 配置文件 + - [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) +- [Spring Boot 2.x基础教程:多环境配置(2.4版本开始的变化)](http://blog.didispace.com/spring-boot-learning-24-1-4/) ### Web开发 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 6dedba30..cfce11f6 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -58,7 +58,11 @@ - [Spring Boot 2.x基础教程:版本关系](http://blog.didispace.com/spring-cloud-alibaba-version/) - [Spring Boot 2.x基础教程:快速入门](http://blog.didispace.com/spring-boot-learning-21-1-1/) - [Spring Boot 2.x基础教程:工程结构推荐](http://blog.didispace.com/spring-boot-learning-21-1-2/) + +### 配置文件 + - [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) +- [Spring Boot 2.x基础教程:多环境配置(2.4版本开始的变化)](http://blog.didispace.com/spring-boot-learning-24-1-4/) ### Web开发 diff --git a/2.x/chapter1-2/.gitignore b/2.x/chapter1-2/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter1-2/.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/2.x/chapter1-2/pom.xml b/2.x/chapter1-2/pom.xml new file mode 100644 index 00000000..3dd49659 --- /dev/null +++ b/2.x/chapter1-2/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.1 + + + com.didispace + chapter1-2 + 0.0.1-SNAPSHOT + chapter1-2 + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter1-2/src/main/java/com/didispace/chapter12/Chapter12Application.java b/2.x/chapter1-2/src/main/java/com/didispace/chapter12/Chapter12Application.java new file mode 100644 index 00000000..135b7e80 --- /dev/null +++ b/2.x/chapter1-2/src/main/java/com/didispace/chapter12/Chapter12Application.java @@ -0,0 +1,29 @@ +package com.didispace.chapter12; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +public class Chapter12Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter12Application.class, args); + } + + @RestController + static class HelloController { + + @Value("${name:}") + private String name; + + @RequestMapping("/") + public String index() { + return name; + } + + } + +} diff --git a/2.x/chapter1-2/src/main/resources/application.yaml b/2.x/chapter1-2/src/main/resources/application.yaml new file mode 100644 index 00000000..ad1b68d1 --- /dev/null +++ b/2.x/chapter1-2/src/main/resources/application.yaml @@ -0,0 +1,31 @@ +# 默认激活dev配置 +spring: + profiles: + active: "dev" + +--- + +spring: + config: + activate: + on-profile: "dev" + +name: dev.didispace.com + +--- + +spring: + config: + activate: + on-profile: "test" + +name: test.didispace.com + +--- + +spring: + config: + activate: + on-profile: "prod" + +name: prod.didispace.com \ No newline at end of file diff --git a/2.x/pom.xml b/2.x/pom.xml index 26b0293f..2e60519d 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -12,6 +12,9 @@ chapter1-1 + + chapter1-2 + chapter2-1 chapter2-2 From e2b4f3c7e995cf515b333aaff07f17d35c551570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 16 Dec 2020 17:33:39 +0800 Subject: [PATCH 041/160] images --- images/gitee/001.jpg | Bin 0 -> 109154 bytes images/gitee/002.jpg | Bin 0 -> 16328 bytes images/gitee/003.jpg | Bin 0 -> 55404 bytes images/gitee/004.jpg | Bin 0 -> 375359 bytes images/gitee/005.jpg | Bin 0 -> 24157 bytes images/github/001.jpg | Bin 0 -> 375359 bytes images/github/002.jpg | Bin 0 -> 16328 bytes images/github/003.jpg | Bin 0 -> 24157 bytes images/github/004.jpg | Bin 0 -> 15892 bytes images/github/005.jpg | Bin 0 -> 55404 bytes images/weixin.jpg | Bin 0 -> 27912 bytes 11 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/gitee/001.jpg create mode 100644 images/gitee/002.jpg create mode 100644 images/gitee/003.jpg create mode 100644 images/gitee/004.jpg create mode 100644 images/gitee/005.jpg create mode 100644 images/github/001.jpg create mode 100644 images/github/002.jpg create mode 100644 images/github/003.jpg create mode 100644 images/github/004.jpg create mode 100644 images/github/005.jpg create mode 100644 images/weixin.jpg diff --git a/images/gitee/001.jpg b/images/gitee/001.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01347f5e33cf9d1719b37572cf1617b7f53f2b44 GIT binary patch literal 109154 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

)pi6z)c>oF+Q2N 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%0D85um|v&V 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 z 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

ZFe3zh-9c?aDykkh-N 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 XuN>&QvGOM%;OEv26a6w>$LIea;Wo;F literal 0 HcmV?d00001 diff --git a/images/gitee/005.jpg b/images/gitee/005.jpg new file mode 100644 index 0000000000000000000000000000000000000000..60ae9470a2304a404471d630cec86a6705e9f670 GIT binary patch literal 24157 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 literal 0 HcmV?d00001 diff --git a/images/github/001.jpg b/images/github/001.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de9a1f04bd83f3eeb1008e66fd2dae183641a4cd GIT binary patch literal 375359 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 z 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

ZFe3zh-9c?aDykkh-N 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 XuN>&QvGOM%;OEv26a6w>$LIea;Wo;F literal 0 HcmV?d00001 diff --git a/images/github/002.jpg b/images/github/002.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6bfd55a9ad0ee3b4bd313b8762608f0e86a836e4 GIT binary patch literal 16328 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 literal 0 HcmV?d00001 diff --git a/images/github/004.jpg b/images/github/004.jpg new file mode 100644 index 0000000000000000000000000000000000000000..39cf81d25262cb5c290f99c42b4f69ade6b2406a GIT binary patch literal 15892 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 C8t^p$ literal 0 HcmV?d00001 diff --git a/images/github/005.jpg b/images/github/005.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16e904be18fbec0a18e03154381572dfd49d56c7 GIT binary patch literal 55404 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 NXaA4?t)nUW{{SNv!xsPm literal 0 HcmV?d00001 From 5b645ffbd5e6b0dc882923cba145bdd2d94c6e75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 16 Dec 2020 17:34:44 +0800 Subject: [PATCH 042/160] =?UTF-8?q?Spring=20Boot=202.4=20=E5=A4=9A?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=85=8D=E7=BD=AE=E6=94=AF=E6=8C=81=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/README.md b/2.x/README.md index fc7f03e2..3ad7dd4d 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -122,5 +122,5 @@ ## 我的公众号 - + From 4bd0e0c9d8cbcdca8fe29be16f15d2ac6ef10ca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 16 Dec 2020 17:36:56 +0800 Subject: [PATCH 043/160] =?UTF-8?q?Spring=20Boot=202.4=20=E5=A4=9A?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=85=8D=E7=BD=AE=E6=94=AF=E6=8C=81=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index 3ad7dd4d..d0ed4863 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -17,29 +17,29 @@ - + - + - + - + - + From 3bc79d1381fbf71c28d806e4e11488f75534de0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 16 Dec 2020 17:38:09 +0800 Subject: [PATCH 044/160] =?UTF-8?q?Spring=20Boot=202.4=20=E5=A4=9A?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=85=8D=E7=BD=AE=E6=94=AF=E6=8C=81=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.x/README.md | 13 +++++++------ 2.1.x/README.md | 13 +++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/1.x/README.md b/1.x/README.md index 4aba132e..a8859ead 100644 --- a/1.x/README.md +++ b/1.x/README.md @@ -21,29 +21,29 @@ - + - + - + - + - + @@ -165,5 +165,6 @@ ## 我的公众号 - + + diff --git a/2.1.x/README.md b/2.1.x/README.md index 1099743e..de29ff83 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -17,29 +17,29 @@ - + - + - + - + - + @@ -117,5 +117,6 @@ ## 我的公众号 - + + From 065a6cb426466cc9884530eb9f8a74627d932123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 16 Dec 2020 17:39:08 +0800 Subject: [PATCH 045/160] =?UTF-8?q?Spring=20Boot=202.4=20=E5=A4=9A?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=85=8D=E7=BD=AE=E6=94=AF=E6=8C=81=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d0cb96e0..d194facf 100644 --- a/README.md +++ b/README.md @@ -23,29 +23,29 @@ - + - + - + - + - + From 3636713bb6634101c0385ee9f9e4f19dc226a11c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 16 Dec 2020 17:43:56 +0800 Subject: [PATCH 046/160] =?UTF-8?q?Spring=20Boot=202.4=20=E5=A4=9A?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=85=8D=E7=BD=AE=E6=94=AF=E6=8C=81=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README_zh.md | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/2.x/README_zh.md b/2.x/README_zh.md index cfce11f6..d9afd9e3 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -17,32 +17,34 @@ - - - - + + + + - + - - - - + + + + - - - - + + + + - - - + + + + + From 7d9d2e25c29b6fa8aff87760e1112905f0bd4a9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 16 Dec 2020 17:45:46 +0800 Subject: [PATCH 047/160] =?UTF-8?q?Spring=20Boot=202.4=20=E5=A4=9A?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=85=8D=E7=BD=AE=E6=94=AF=E6=8C=81=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.x/README_zh.md | 26 ++++++++++++++++++++------ 2.1.x/README_zh.md | 34 ++++++++++++++++++---------------- README_zh.md | 34 ++++++++++++++++++---------------- 3 files changed, 56 insertions(+), 38 deletions(-) diff --git a/1.x/README_zh.md b/1.x/README_zh.md index c72dced4..148244c3 100644 --- a/1.x/README_zh.md +++ b/1.x/README_zh.md @@ -20,20 +20,34 @@ - - + + + + + + + - - + + + + + + + + + - + - + + + diff --git a/2.1.x/README_zh.md b/2.1.x/README_zh.md index c276674d..301ec021 100644 --- a/2.1.x/README_zh.md +++ b/2.1.x/README_zh.md @@ -19,32 +19,34 @@ - - - - + + + + - + - - - - + + + + - - - - + + + + - - - + + + + + diff --git a/README_zh.md b/README_zh.md index 8b2a9e74..c8a1f954 100644 --- a/README_zh.md +++ b/README_zh.md @@ -22,32 +22,34 @@ - - - - + + + + - + - - - - + + + + - - - - + + + + - - - + + + + + From ee97ad884e0850ffbd5ed9140d06d940fa6d5af7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 17 Dec 2020 16:11:30 +0800 Subject: [PATCH 048/160] =?UTF-8?q?Spring=20Boot=202.4=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=89=8D=E5=90=8E=E7=9A=84=E9=85=8D=E7=BD=AE=E5=88=86?= =?UTF-8?q?=E7=BB=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/2.x/pom.xml b/2.x/pom.xml index 2e60519d..fc45abe4 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -13,7 +13,8 @@ chapter1-1 - chapter1-2 + chapter1-2 + chapter1-3 chapter2-1 From 73a7148089dbd16dd0764b3957734e69acb70823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 17 Dec 2020 16:11:39 +0800 Subject: [PATCH 049/160] =?UTF-8?q?Spring=20Boot=202.4=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=89=8D=E5=90=8E=E7=9A=84=E9=85=8D=E7=BD=AE=E5=88=86?= =?UTF-8?q?=E7=BB=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter1-3/.gitignore | 29 +++++++++ 2.x/chapter1-3/pom.xml | 49 +++++++++++++++ .../chapter13/Chapter13Application.java | 37 +++++++++++ .../src/main/resources/application.yaml | 61 +++++++++++++++++++ 4 files changed, 176 insertions(+) create mode 100644 2.x/chapter1-3/.gitignore create mode 100644 2.x/chapter1-3/pom.xml create mode 100644 2.x/chapter1-3/src/main/java/com/didispace/chapter13/Chapter13Application.java create mode 100644 2.x/chapter1-3/src/main/resources/application.yaml diff --git a/2.x/chapter1-3/.gitignore b/2.x/chapter1-3/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter1-3/.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/2.x/chapter1-3/pom.xml b/2.x/chapter1-3/pom.xml new file mode 100644 index 00000000..75bb4754 --- /dev/null +++ b/2.x/chapter1-3/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.1 + + + com.didispace + chapter1-3 + 0.0.1-SNAPSHOT + chapter1-3 + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter1-3/src/main/java/com/didispace/chapter13/Chapter13Application.java b/2.x/chapter1-3/src/main/java/com/didispace/chapter13/Chapter13Application.java new file mode 100644 index 00000000..7db17464 --- /dev/null +++ b/2.x/chapter1-3/src/main/java/com/didispace/chapter13/Chapter13Application.java @@ -0,0 +1,37 @@ +package com.didispace.chapter13; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +@SpringBootApplication +public class Chapter13Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter13Application.class, args); + } + + @Slf4j + @RestController + static class HelloController { + + @Value("${db:}") + private String db; + + @Value("${mq:}") + private String mq; + + @RequestMapping("/") + public String index() { + log.info("db:" + db); + log.info("mq:" + mq); + return ""; + } + + } + +} diff --git a/2.x/chapter1-3/src/main/resources/application.yaml b/2.x/chapter1-3/src/main/resources/application.yaml new file mode 100644 index 00000000..70e7a52e --- /dev/null +++ b/2.x/chapter1-3/src/main/resources/application.yaml @@ -0,0 +1,61 @@ +# 2.4之前的配置 +#spring: +# profiles: +# active: "dev" +# +#--- +#spring.profiles: "dev" +#spring.profiles.include: "dev-db,dev-mq" +# +#--- +#spring.profiles: "dev-db" +# +#db: dev-db.didispace.com +# +#--- +#spring.profiles: "dev-mq" +# +#mq: dev-mq.didispace.com +# +#--- + +#2.4之后的配置 +# 默认激活dev配置 +spring: + profiles: + active: "dev" + group: + "dev": "dev-db,dev-mq" + "prod": "prod-db,prod-mq" + +--- +spring: + config: + activate: + on-profile: "dev-db" + +db: dev-db.didispace.com + +--- +spring: + config: + activate: + on-profile: "dev-mq" + +mq: dev-mq.didispace.com + +--- +spring: + config: + activate: + on-profile: "prod-db" + +db: prod-db.didispace.com + +--- +spring: + config: + activate: + on-profile: "prod-mq" + +mq: prod-mq.didispace.com From e61e564996ad7a6b84188ae47d221c69288c3d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Fri, 18 Dec 2020 12:56:14 +0800 Subject: [PATCH 050/160] =?UTF-8?q?Spring=20Boot=202.4=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=89=8D=E5=90=8E=E7=9A=84=E9=85=8D=E7=BD=AE=E5=88=86?= =?UTF-8?q?=E7=BB=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 3 ++- 2.x/README_zh.md | 3 ++- 2.x/pom.xml | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index d0ed4863..845dc536 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -63,7 +63,8 @@ ### 配置文件 - [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) -- [Spring Boot 2.x基础教程:多环境配置(2.4版本开始的变化)](http://blog.didispace.com/spring-boot-learning-24-1-4/) +- [Spring Boot 2.x基础教程:2.4版本前后的多环境配置变化](http://blog.didispace.com/spring-boot-learning-24-1-4/) +- [Spring Boot 2.x基础教程:2.4版本前后的分组配置变化](http://blog.didispace.com/spring-boot-learning-24-1-5/) ### Web开发 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index d9afd9e3..3cec200a 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -64,7 +64,8 @@ ### 配置文件 - [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) -- [Spring Boot 2.x基础教程:多环境配置(2.4版本开始的变化)](http://blog.didispace.com/spring-boot-learning-24-1-4/) +- [Spring Boot 2.x基础教程:2.4版本前后的多环境配置变化](http://blog.didispace.com/spring-boot-learning-24-1-4/) +- [Spring Boot 2.x基础教程:2.4版本前后的分组配置变化](http://blog.didispace.com/spring-boot-learning-24-1-5/) ### Web开发 diff --git a/2.x/pom.xml b/2.x/pom.xml index fc45abe4..5e7efdfb 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -13,8 +13,8 @@ chapter1-1 - chapter1-2 - chapter1-3 + chapter1-2 + chapter1-3 chapter2-1 From 5cb0e98feb2e6d3dc5ac4105004c95a6d3b681c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 30 Dec 2020 17:28:32 +0800 Subject: [PATCH 051/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E5=AE=9E=E7=8E=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 1 + 2.x/README_zh.md | 1 + 2.x/chapter4-3/.gitignore | 29 ++++++++++ 2.x/chapter4-3/pom.xml | 53 +++++++++++++++++++ .../chapter43/Chapter43Application.java | 13 +++++ .../didispace/chapter43/UploadController.java | 46 ++++++++++++++++ .../src/main/resources/application.properties | 5 ++ .../src/main/resources/templates/upload.html | 15 ++++++ 2.x/chapter4-3/src/test/java/FileTest.java | 11 ++++ 2.x/pom.xml | 1 + 10 files changed, 175 insertions(+) create mode 100644 2.x/chapter4-3/.gitignore create mode 100644 2.x/chapter4-3/pom.xml create mode 100644 2.x/chapter4-3/src/main/java/com/didispace/chapter43/Chapter43Application.java create mode 100644 2.x/chapter4-3/src/main/java/com/didispace/chapter43/UploadController.java create mode 100644 2.x/chapter4-3/src/main/resources/application.properties create mode 100644 2.x/chapter4-3/src/main/resources/templates/upload.html create mode 100644 2.x/chapter4-3/src/test/java/FileTest.java diff --git a/2.x/README.md b/2.x/README.md index 845dc536..28548fde 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -101,6 +101,7 @@ - [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) - [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) +- [Spring Boot 2.x基础教程:实现文件上传](http://blog.didispace.com/spring-boot-learning-21-4-3/) ## 版本资讯 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 3cec200a..12fb589c 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -102,6 +102,7 @@ - [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) - [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) +- [Spring Boot 2.x基础教程:实现文件上传](http://blog.didispace.com/spring-boot-learning-21-4-3/) ## 版本资讯 diff --git a/2.x/chapter4-3/.gitignore b/2.x/chapter4-3/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter4-3/.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/2.x/chapter4-3/pom.xml b/2.x/chapter4-3/pom.xml new file mode 100644 index 00000000..47dc30ce --- /dev/null +++ b/2.x/chapter4-3/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.4.1 + + + + com.didispace + chapter4-3 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter4-3/src/main/java/com/didispace/chapter43/Chapter43Application.java b/2.x/chapter4-3/src/main/java/com/didispace/chapter43/Chapter43Application.java new file mode 100644 index 00000000..f54783ed --- /dev/null +++ b/2.x/chapter4-3/src/main/java/com/didispace/chapter43/Chapter43Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter43; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter43Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter43Application.class, args); + } + +} diff --git a/2.x/chapter4-3/src/main/java/com/didispace/chapter43/UploadController.java b/2.x/chapter4-3/src/main/java/com/didispace/chapter43/UploadController.java new file mode 100644 index 00000000..73802da7 --- /dev/null +++ b/2.x/chapter4-3/src/main/java/com/didispace/chapter43/UploadController.java @@ -0,0 +1,46 @@ +package com.didispace.chapter43; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; + +@Controller +@Slf4j +public class UploadController { + + @Value("${file.upload.path}") + private String path; + + @GetMapping("/") + public String uploadPage() { + return "upload"; + } + + @PostMapping("/upload") + @ResponseBody + public String create(@RequestPart MultipartFile file) { + + String fileName = file.getOriginalFilename(); + String filePath = path + fileName; + + String message; + File dest = new File(filePath); + try { + file.transferTo(dest); + message = "Upload file success : " + dest.getAbsolutePath(); + } catch (IOException e) { + log.error(e.getMessage(), e); + message = "Upload file failed : " + e.getMessage(); + } + return message; + } + +} \ No newline at end of file diff --git a/2.x/chapter4-3/src/main/resources/application.properties b/2.x/chapter4-3/src/main/resources/application.properties new file mode 100644 index 00000000..0d9500e2 --- /dev/null +++ b/2.x/chapter4-3/src/main/resources/application.properties @@ -0,0 +1,5 @@ + +spring.servlet.multipart.max-file-size=2MB +spring.servlet.multipart.max-request-size=2MB + +file.upload.path=/Users/didi/ \ No newline at end of file diff --git a/2.x/chapter4-3/src/main/resources/templates/upload.html b/2.x/chapter4-3/src/main/resources/templates/upload.html new file mode 100644 index 00000000..59b8166a --- /dev/null +++ b/2.x/chapter4-3/src/main/resources/templates/upload.html @@ -0,0 +1,15 @@ + + + + + 文件上传页面 + + +

文件上传页面

+
+ 选择要上传的文件:
+
+ +
+ + \ No newline at end of file diff --git a/2.x/chapter4-3/src/test/java/FileTest.java b/2.x/chapter4-3/src/test/java/FileTest.java new file mode 100644 index 00000000..04cdeb58 --- /dev/null +++ b/2.x/chapter4-3/src/test/java/FileTest.java @@ -0,0 +1,11 @@ +import org.junit.jupiter.api.Test; + +public class FileTest { + + @Test + public void uploadFile() throws Exception { + + + } + +} diff --git a/2.x/pom.xml b/2.x/pom.xml index 5e7efdfb..3f5c4e1c 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -44,6 +44,7 @@ chapter4-1 chapter4-2 + chapter4-3 chapter5-1 From bb70a1387961e96dd707972c35ecb6d085144853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 30 Dec 2020 17:40:26 +0800 Subject: [PATCH 052/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E5=AE=9E=E7=8E=B0=E5=A4=9A=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 1 + 2.x/README_zh.md | 1 + 2.x/chapter4-4/.gitignore | 29 ++++++++++ 2.x/chapter4-4/pom.xml | 53 +++++++++++++++++++ .../chapter44/Chapter44Application.java | 13 +++++ .../didispace/chapter44/UploadController.java | 48 +++++++++++++++++ .../src/main/resources/application.properties | 5 ++ .../src/main/resources/templates/upload.html | 16 ++++++ 2.x/chapter4-4/src/test/java/FileTest.java | 11 ++++ 2.x/pom.xml | 3 +- 10 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 2.x/chapter4-4/.gitignore create mode 100644 2.x/chapter4-4/pom.xml create mode 100644 2.x/chapter4-4/src/main/java/com/didispace/chapter44/Chapter44Application.java create mode 100644 2.x/chapter4-4/src/main/java/com/didispace/chapter44/UploadController.java create mode 100644 2.x/chapter4-4/src/main/resources/application.properties create mode 100644 2.x/chapter4-4/src/main/resources/templates/upload.html create mode 100644 2.x/chapter4-4/src/test/java/FileTest.java diff --git a/2.x/README.md b/2.x/README.md index 28548fde..872581fc 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -102,6 +102,7 @@ - [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) - [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) - [Spring Boot 2.x基础教程:实现文件上传](http://blog.didispace.com/spring-boot-learning-21-4-3/) +- [Spring Boot 2.x基础教程:实现多文件上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) ## 版本资讯 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 12fb589c..e667daab 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -103,6 +103,7 @@ - [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) - [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) - [Spring Boot 2.x基础教程:实现文件上传](http://blog.didispace.com/spring-boot-learning-21-4-3/) +- [Spring Boot 2.x基础教程:实现多文件上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) ## 版本资讯 diff --git a/2.x/chapter4-4/.gitignore b/2.x/chapter4-4/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter4-4/.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/2.x/chapter4-4/pom.xml b/2.x/chapter4-4/pom.xml new file mode 100644 index 00000000..d575ab1d --- /dev/null +++ b/2.x/chapter4-4/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.4.1 + + + + com.didispace + chapter4-4 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter4-4/src/main/java/com/didispace/chapter44/Chapter44Application.java b/2.x/chapter4-4/src/main/java/com/didispace/chapter44/Chapter44Application.java new file mode 100644 index 00000000..a0145c56 --- /dev/null +++ b/2.x/chapter4-4/src/main/java/com/didispace/chapter44/Chapter44Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter44; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter44Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter44Application.class, args); + } + +} diff --git a/2.x/chapter4-4/src/main/java/com/didispace/chapter44/UploadController.java b/2.x/chapter4-4/src/main/java/com/didispace/chapter44/UploadController.java new file mode 100644 index 00000000..898a60d0 --- /dev/null +++ b/2.x/chapter4-4/src/main/java/com/didispace/chapter44/UploadController.java @@ -0,0 +1,48 @@ +package com.didispace.chapter44; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; + +@Controller +@Slf4j +public class UploadController { + + @Value("${file.upload.path}") + private String path; + + @GetMapping("/") + public String uploadPage() { + return "upload"; + } + + @PostMapping("/upload") + @ResponseBody + public String create(@RequestPart MultipartFile[] files) { + StringBuffer message = new StringBuffer(); + + for(MultipartFile file : files) { + String fileName = file.getOriginalFilename(); + String filePath = path + fileName; + + File dest = new File(filePath); + try { + file.transferTo(dest); + message.append("Upload file success : " + dest.getAbsolutePath()).append("
"); + } catch (IOException e) { + log.error(e.getMessage(), e); + message.append("Upload file failed : " + e.getMessage()).append("
"); + } + } + return message.toString(); + } + +} \ No newline at end of file diff --git a/2.x/chapter4-4/src/main/resources/application.properties b/2.x/chapter4-4/src/main/resources/application.properties new file mode 100644 index 00000000..0d9500e2 --- /dev/null +++ b/2.x/chapter4-4/src/main/resources/application.properties @@ -0,0 +1,5 @@ + +spring.servlet.multipart.max-file-size=2MB +spring.servlet.multipart.max-request-size=2MB + +file.upload.path=/Users/didi/ \ No newline at end of file diff --git a/2.x/chapter4-4/src/main/resources/templates/upload.html b/2.x/chapter4-4/src/main/resources/templates/upload.html new file mode 100644 index 00000000..b7307dac --- /dev/null +++ b/2.x/chapter4-4/src/main/resources/templates/upload.html @@ -0,0 +1,16 @@ + + + + + 文件上传页面 + + +

文件上传页面

+
+ 文件1:
+ 文件2:
+
+ +
+ + \ No newline at end of file diff --git a/2.x/chapter4-4/src/test/java/FileTest.java b/2.x/chapter4-4/src/test/java/FileTest.java new file mode 100644 index 00000000..04cdeb58 --- /dev/null +++ b/2.x/chapter4-4/src/test/java/FileTest.java @@ -0,0 +1,11 @@ +import org.junit.jupiter.api.Test; + +public class FileTest { + + @Test + public void uploadFile() throws Exception { + + + } + +} diff --git a/2.x/pom.xml b/2.x/pom.xml index 3f5c4e1c..ea1d82a2 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -44,7 +44,8 @@ chapter4-1 chapter4-2 - chapter4-3 + chapter4-3 + chapter4-4 chapter5-1 From 9de6fcc1ec353c3cf8dadcee024f7725868097a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 6 Jan 2021 17:57:53 +0800 Subject: [PATCH 053/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E5=AE=9E=E7=8E=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../didispace/chapter43/UploadController.java | 2 + 2.x/chapter4-3/src/test/java/FileTest.java | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/2.x/chapter4-3/src/main/java/com/didispace/chapter43/UploadController.java b/2.x/chapter4-3/src/main/java/com/didispace/chapter43/UploadController.java index 73802da7..2658a7bc 100644 --- a/2.x/chapter4-3/src/main/java/com/didispace/chapter43/UploadController.java +++ b/2.x/chapter4-3/src/main/java/com/didispace/chapter43/UploadController.java @@ -11,6 +11,8 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; @Controller @Slf4j diff --git a/2.x/chapter4-3/src/test/java/FileTest.java b/2.x/chapter4-3/src/test/java/FileTest.java index 04cdeb58..f601eaa3 100644 --- a/2.x/chapter4-3/src/test/java/FileTest.java +++ b/2.x/chapter4-3/src/test/java/FileTest.java @@ -1,11 +1,56 @@ +import com.didispace.chapter43.Chapter43Application; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; +import java.io.IOException; + +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +@SpringBootTest(classes = Chapter43Application.class) public class FileTest { + @Autowired + protected WebApplicationContext context; + protected MockMvc mvc; + + @BeforeEach + public void setUp() { + mvc = MockMvcBuilders.webAppContextSetup(context).build(); + } + @Test public void uploadFile() throws Exception { + MockMultipartFile file = mockFile(); + + final MvcResult result = mvc.perform( + MockMvcRequestBuilders + .multipart("/upload") + .file(file)) + .andDo(print()) + .andExpect(status().isCreated()) + .andReturn(); + } + private MockMultipartFile mockFile() throws IOException { + MockMultipartFile file = new MockMultipartFile( + "file", + "hello.txt", + MediaType.TEXT_PLAIN_VALUE, + "Hello, World!".getBytes() + ); + return file; } } From f767a48896964744d0c9fad1749b8da60d0f4e49 Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Wed, 6 Jan 2021 20:52:55 +0800 Subject: [PATCH 054/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E5=AE=9E=E7=8E=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../didispace/chapter43/UploadController.java | 15 +++---------- .../src/main/resources/application.properties | 2 +- 2.x/chapter4-3/src/test/java/FileTest.java | 22 ++++++------------- 3 files changed, 11 insertions(+), 28 deletions(-) diff --git a/2.x/chapter4-3/src/main/java/com/didispace/chapter43/UploadController.java b/2.x/chapter4-3/src/main/java/com/didispace/chapter43/UploadController.java index 2658a7bc..e36f32b2 100644 --- a/2.x/chapter4-3/src/main/java/com/didispace/chapter43/UploadController.java +++ b/2.x/chapter4-3/src/main/java/com/didispace/chapter43/UploadController.java @@ -12,7 +12,6 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; -import java.nio.file.Path; @Controller @Slf4j @@ -28,21 +27,13 @@ public String uploadPage() { @PostMapping("/upload") @ResponseBody - public String create(@RequestPart MultipartFile file) { - + public String create(@RequestPart MultipartFile file) throws IOException { String fileName = file.getOriginalFilename(); String filePath = path + fileName; - String message; File dest = new File(filePath); - try { - file.transferTo(dest); - message = "Upload file success : " + dest.getAbsolutePath(); - } catch (IOException e) { - log.error(e.getMessage(), e); - message = "Upload file failed : " + e.getMessage(); - } - return message; + Files.copy(file.getInputStream(), dest.toPath()); + return "Upload file success : " + dest.getAbsolutePath(); } } \ No newline at end of file diff --git a/2.x/chapter4-3/src/main/resources/application.properties b/2.x/chapter4-3/src/main/resources/application.properties index 0d9500e2..08991f4c 100644 --- a/2.x/chapter4-3/src/main/resources/application.properties +++ b/2.x/chapter4-3/src/main/resources/application.properties @@ -2,4 +2,4 @@ spring.servlet.multipart.max-file-size=2MB spring.servlet.multipart.max-request-size=2MB -file.upload.path=/Users/didi/ \ No newline at end of file +file.upload.path=/Users/zhaiyongchao/ \ No newline at end of file diff --git a/2.x/chapter4-3/src/test/java/FileTest.java b/2.x/chapter4-3/src/test/java/FileTest.java index f601eaa3..d19d55e0 100644 --- a/2.x/chapter4-3/src/test/java/FileTest.java +++ b/2.x/chapter4-3/src/test/java/FileTest.java @@ -11,8 +11,6 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import java.io.IOException; - import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -31,18 +29,6 @@ public void setUp() { @Test public void uploadFile() throws Exception { - MockMultipartFile file = mockFile(); - - final MvcResult result = mvc.perform( - MockMvcRequestBuilders - .multipart("/upload") - .file(file)) - .andDo(print()) - .andExpect(status().isCreated()) - .andReturn(); - } - - private MockMultipartFile mockFile() throws IOException { MockMultipartFile file = new MockMultipartFile( "file", "hello.txt", @@ -50,7 +36,13 @@ private MockMultipartFile mockFile() throws IOException { "Hello, World!".getBytes() ); - return file; + final MvcResult result = mvc.perform( + MockMvcRequestBuilders + .multipart("/upload") + .file(file)) + .andDo(print()) + .andExpect(status().isOk()) + .andReturn(); } } From fff0221f461af1f8a689b3f88dec695c8e2539d3 Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Wed, 6 Jan 2021 20:54:28 +0800 Subject: [PATCH 055/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E5=AE=9E=E7=8E=B0=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=9A=84=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/didispace/chapter44/UploadController.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/2.x/chapter4-4/src/main/java/com/didispace/chapter44/UploadController.java b/2.x/chapter4-4/src/main/java/com/didispace/chapter44/UploadController.java index 898a60d0..19ef6b98 100644 --- a/2.x/chapter4-4/src/main/java/com/didispace/chapter44/UploadController.java +++ b/2.x/chapter4-4/src/main/java/com/didispace/chapter44/UploadController.java @@ -11,6 +11,7 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Files; @Controller @Slf4j @@ -26,21 +27,16 @@ public String uploadPage() { @PostMapping("/upload") @ResponseBody - public String create(@RequestPart MultipartFile[] files) { + public String create(@RequestPart MultipartFile[] files) throws IOException { StringBuffer message = new StringBuffer(); - for(MultipartFile file : files) { + for (MultipartFile file : files) { String fileName = file.getOriginalFilename(); String filePath = path + fileName; File dest = new File(filePath); - try { - file.transferTo(dest); - message.append("Upload file success : " + dest.getAbsolutePath()).append("
"); - } catch (IOException e) { - log.error(e.getMessage(), e); - message.append("Upload file failed : " + e.getMessage()).append("
"); - } + Files.copy(file.getInputStream(), dest.toPath()); + return "Upload file success : " + dest.getAbsolutePath(); } return message.toString(); } From ff2141d4d6eaa68fcabe75b5f310c8e66b16f736 Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Wed, 6 Jan 2021 21:37:12 +0800 Subject: [PATCH 056/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E5=A4=9A=E4=B8=AA=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/didispace/chapter44/UploadController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter4-4/src/main/java/com/didispace/chapter44/UploadController.java b/2.x/chapter4-4/src/main/java/com/didispace/chapter44/UploadController.java index 19ef6b98..82ce1741 100644 --- a/2.x/chapter4-4/src/main/java/com/didispace/chapter44/UploadController.java +++ b/2.x/chapter4-4/src/main/java/com/didispace/chapter44/UploadController.java @@ -36,7 +36,7 @@ public String create(@RequestPart MultipartFile[] files) throws IOException { File dest = new File(filePath); Files.copy(file.getInputStream(), dest.toPath()); - return "Upload file success : " + dest.getAbsolutePath(); + message.append("Upload file success : " + dest.getAbsolutePath()).append("
"); } return message.toString(); } From d3d5c809773d65990d1e0a7488969acc5f53d5fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Mon, 11 Jan 2021 17:12:48 +0800 Subject: [PATCH 057/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8Flyway=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=95=B0=E6=8D=AE=E5=BA=93=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 3 +- 2.x/README_zh.md | 1 + 2.x/chapter3-11/.gitignore | 29 +++++++++ 2.x/chapter3-11/pom.xml | 59 +++++++++++++++++++ .../chapter311/Chapter311Application.java | 13 ++++ .../java/com/didispace/chapter311/User.java | 14 +++++ .../com/didispace/chapter311/UserService.java | 40 +++++++++++++ .../didispace/chapter311/UserServiceImpl.java | 49 +++++++++++++++ .../src/main/resources/application.properties | 6 ++ .../db/migration/V1_1__alter_table_user.sql | 1 + .../db/migration/V1__Base_version.sql | 7 +++ .../Chapter311ApplicationTests.java | 45 ++++++++++++++ 2.x/pom.xml | 7 ++- 13 files changed, 270 insertions(+), 4 deletions(-) create mode 100644 2.x/chapter3-11/.gitignore create mode 100644 2.x/chapter3-11/pom.xml create mode 100644 2.x/chapter3-11/src/main/java/com/didispace/chapter311/Chapter311Application.java create mode 100644 2.x/chapter3-11/src/main/java/com/didispace/chapter311/User.java create mode 100644 2.x/chapter3-11/src/main/java/com/didispace/chapter311/UserService.java create mode 100644 2.x/chapter3-11/src/main/java/com/didispace/chapter311/UserServiceImpl.java create mode 100644 2.x/chapter3-11/src/main/resources/application.properties create mode 100644 2.x/chapter3-11/src/main/resources/db/migration/V1_1__alter_table_user.sql create mode 100644 2.x/chapter3-11/src/main/resources/db/migration/V1__Base_version.sql create mode 100644 2.x/chapter3-11/src/test/java/com/didispace/chapter311/Chapter311ApplicationTests.java diff --git a/2.x/README.md b/2.x/README.md index 872581fc..8f3d6e25 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -89,7 +89,8 @@ - [Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-8/) - [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) - [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) - +- [Spring Boot 2.x基础教程:使用Flyway管理数据库版本](http://blog.didispace.com/spring-boot-learning-24-3-11/) + **加速利器:各种缓存的使用** - [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) diff --git a/2.x/README_zh.md b/2.x/README_zh.md index e667daab..c30a2632 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -90,6 +90,7 @@ - [Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-8/) - [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) - [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) +- [Spring Boot 2.x基础教程:使用Flyway管理数据库版本](http://blog.didispace.com/spring-boot-learning-24-3-11/) **加速利器:各种缓存的使用** diff --git a/2.x/chapter3-11/.gitignore b/2.x/chapter3-11/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter3-11/.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/2.x/chapter3-11/pom.xml b/2.x/chapter3-11/pom.xml new file mode 100644 index 00000000..ca51dc20 --- /dev/null +++ b/2.x/chapter3-11/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.4.1 + + + + com.didispace + chapter3-11 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + mysql + mysql-connector-java + + + + org.flywaydb + flyway-core + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter3-11/src/main/java/com/didispace/chapter311/Chapter311Application.java b/2.x/chapter3-11/src/main/java/com/didispace/chapter311/Chapter311Application.java new file mode 100644 index 00000000..9273268c --- /dev/null +++ b/2.x/chapter3-11/src/main/java/com/didispace/chapter311/Chapter311Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter311; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter311Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter311Application.class, args); + } + +} diff --git a/2.x/chapter3-11/src/main/java/com/didispace/chapter311/User.java b/2.x/chapter3-11/src/main/java/com/didispace/chapter311/User.java new file mode 100644 index 00000000..1ca17f9c --- /dev/null +++ b/2.x/chapter3-11/src/main/java/com/didispace/chapter311/User.java @@ -0,0 +1,14 @@ +package com.didispace.chapter311; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class User { + + private Long id; + private String name; + private Integer age; + +} \ No newline at end of file diff --git a/2.x/chapter3-11/src/main/java/com/didispace/chapter311/UserService.java b/2.x/chapter3-11/src/main/java/com/didispace/chapter311/UserService.java new file mode 100644 index 00000000..d5591de0 --- /dev/null +++ b/2.x/chapter3-11/src/main/java/com/didispace/chapter311/UserService.java @@ -0,0 +1,40 @@ +package com.didispace.chapter311; + +import java.util.List; + +public interface UserService { + + /** + * 新增一个用户 + * + * @param name + * @param age + */ + int create(String name, Integer age); + + /** + * 根据name查询用户 + * + * @param name + * @return + */ + List getByName(String name); + + /** + * 根据name删除用户 + * + * @param name + */ + int deleteByName(String name); + + /** + * 获取用户总量 + */ + int getAllUsers(); + + /** + * 删除所有用户 + */ + int deleteAllUsers(); + +} \ No newline at end of file diff --git a/2.x/chapter3-11/src/main/java/com/didispace/chapter311/UserServiceImpl.java b/2.x/chapter3-11/src/main/java/com/didispace/chapter311/UserServiceImpl.java new file mode 100644 index 00000000..54aa40fe --- /dev/null +++ b/2.x/chapter3-11/src/main/java/com/didispace/chapter311/UserServiceImpl.java @@ -0,0 +1,49 @@ +package com.didispace.chapter311; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class UserServiceImpl implements UserService { + + private JdbcTemplate jdbcTemplate; + + UserServiceImpl(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public int create(String name, Integer age) { + return jdbcTemplate.update("insert into USER(NAME, AGE) values(?, ?)", name, age); + } + + @Override + public List getByName(String name) { + List users = jdbcTemplate.query("select * from USER where NAME = ?", (resultSet, i) -> { + User user = new User(); + user.setId(resultSet.getLong("ID")); + user.setName(resultSet.getString("NAME")); + user.setAge(resultSet.getInt("AGE")); + return user; + }, name); + return users; + } + + @Override + public int deleteByName(String name) { + return jdbcTemplate.update("delete from USER where NAME = ?", name); + } + + @Override + public int getAllUsers() { + return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class); + } + + @Override + public int deleteAllUsers() { + return jdbcTemplate.update("delete from USER"); + } + +} \ No newline at end of file diff --git a/2.x/chapter3-11/src/main/resources/application.properties b/2.x/chapter3-11/src/main/resources/application.properties new file mode 100644 index 00000000..b36e87bd --- /dev/null +++ b/2.x/chapter3-11/src/main/resources/application.properties @@ -0,0 +1,6 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=12345678 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.flyway.locations=classpath:db/migration \ No newline at end of file diff --git a/2.x/chapter3-11/src/main/resources/db/migration/V1_1__alter_table_user.sql b/2.x/chapter3-11/src/main/resources/db/migration/V1_1__alter_table_user.sql new file mode 100644 index 00000000..667486c5 --- /dev/null +++ b/2.x/chapter3-11/src/main/resources/db/migration/V1_1__alter_table_user.sql @@ -0,0 +1 @@ +ALTER TABLE `user` ADD COLUMN `address` VARCHAR(20) DEFAULT NULL; diff --git a/2.x/chapter3-11/src/main/resources/db/migration/V1__Base_version.sql b/2.x/chapter3-11/src/main/resources/db/migration/V1__Base_version.sql new file mode 100644 index 00000000..428f2187 --- /dev/null +++ b/2.x/chapter3-11/src/main/resources/db/migration/V1__Base_version.sql @@ -0,0 +1,7 @@ +DROP TABLE IF EXISTS user ; +CREATE TABLE `user` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(20) NOT NULL COMMENT '姓名', + `age` int(5) DEFAULT NULL COMMENT '年龄', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/2.x/chapter3-11/src/test/java/com/didispace/chapter311/Chapter311ApplicationTests.java b/2.x/chapter3-11/src/test/java/com/didispace/chapter311/Chapter311ApplicationTests.java new file mode 100644 index 00000000..4b902ab9 --- /dev/null +++ b/2.x/chapter3-11/src/test/java/com/didispace/chapter311/Chapter311ApplicationTests.java @@ -0,0 +1,45 @@ +package com.didispace.chapter311; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +@Slf4j +@SpringBootTest +public class Chapter311ApplicationTests { + + @Autowired + private UserService userSerivce; + + @Test + public void test() throws Exception { + userSerivce.deleteAllUsers(); + + // 插入5个用户 + userSerivce.create("Tom", 10); + userSerivce.create("Mike", 11); + userSerivce.create("Didispace", 30); + userSerivce.create("Oscar", 21); + userSerivce.create("Linda", 17); + + // 查询名为Oscar的用户,判断年龄是否匹配 + List userList = userSerivce.getByName("Oscar"); + Assertions.assertEquals(21, userList.get(0).getAge().intValue()); + + // 查数据库,应该有5个用户 + Assertions.assertEquals(5, userSerivce.getAllUsers()); + + // 删除两个用户 + userSerivce.deleteByName("Tom"); + userSerivce.deleteByName("Mike"); + + // 查数据库,应该有5个用户 + Assertions.assertEquals(3, userSerivce.getAllUsers()); + + } + +} diff --git a/2.x/pom.xml b/2.x/pom.xml index ea1d82a2..b1280a90 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -37,15 +37,16 @@ chapter3-8 chapter3-9 chapter3-10 - + chapter3-11 chapter4-1 chapter4-2 - chapter4-3 - chapter4-4 + chapter4-3 + chapter4-4 + chapter5-1 From 4b7b971c8ca988c089382635470c63a7c792645f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 13 Jan 2021 11:45:11 +0800 Subject: [PATCH 058/160] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 2 ++ 2.x/README_zh.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/2.x/README.md b/2.x/README.md index 8f3d6e25..c836a156 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -4,6 +4,8 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://mp.weixin.qq.com/s/K0BHKqZohfK4jllzLyQA1g) + **如何支持**: 1. 关注我的公众号”**程序猿DD**“ diff --git a/2.x/README_zh.md b/2.x/README_zh.md index c30a2632..6d182153 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -4,6 +4,8 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://mp.weixin.qq.com/s/K0BHKqZohfK4jllzLyQA1g) + **如何支持**: 1. 关注我的公众号”**程序猿DD**“ 2. 点个`Star`并`Follow`我 From 9feedee36592658f5902539d2bdec186d85cf563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Fri, 15 Jan 2021 13:31:45 +0800 Subject: [PATCH 059/160] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 2 +- 2.x/README_zh.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index c836a156..1c59a932 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -40,7 +40,7 @@ - + diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 6d182153..eefb4376 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -41,7 +41,7 @@ - + From 787aa90ddd83ee0c6d7518481fbed659aa4c75d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Fri, 15 Jan 2021 13:39:24 +0800 Subject: [PATCH 060/160] update --- 1.x/README.md | 4 +++- 1.x/README_zh.md | 4 +++- README.md | 4 +++- README_zh.md | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/1.x/README.md b/1.x/README.md index a8859ead..4abf6dda 100644 --- a/1.x/README.md +++ b/1.x/README.md @@ -4,6 +4,8 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://mp.weixin.qq.com/s/K0BHKqZohfK4jllzLyQA1g) + **如何支持**: 1. 关注我的公众号”**程序猿DD**“ 2. 点个`Star`并`Follow`我 @@ -42,7 +44,7 @@ - + diff --git a/1.x/README_zh.md b/1.x/README_zh.md index 148244c3..4f9e75c1 100644 --- a/1.x/README_zh.md +++ b/1.x/README_zh.md @@ -4,6 +4,8 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://mp.weixin.qq.com/s/K0BHKqZohfK4jllzLyQA1g) + **如何支持**: 1. 关注我的公众号”**程序猿DD**“ 2. 点个`Star`并`Follow`我 @@ -42,7 +44,7 @@ - + diff --git a/README.md b/README.md index d194facf..77d729ee 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://mp.weixin.qq.com/s/K0BHKqZohfK4jllzLyQA1g) + **如何支持**: 1. 关注我的公众号”**程序猿DD**“ 2. 点个`Star`并`Follow`我 @@ -44,7 +46,7 @@ - + diff --git a/README_zh.md b/README_zh.md index c8a1f954..0c0946db 100644 --- a/README_zh.md +++ b/README_zh.md @@ -4,6 +4,8 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://mp.weixin.qq.com/s/K0BHKqZohfK4jllzLyQA1g) + **如何支持**: 1. 关注我的公众号”**程序猿DD**“ 2. 点个`Star`并`Follow`我 @@ -44,7 +46,7 @@ - + From 45e0515894e91a02b3e340abd3cb75f3cd85aee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Mon, 18 Jan 2021 16:40:16 +0800 Subject: [PATCH 061/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E9=85=8D=E7=BD=AE=E5=85=83=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E5=BA=94=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter1-4/.gitignore | 29 +++++++++++ 2.x/chapter1-4/pom.xml | 52 +++++++++++++++++++ .../chapter14/Chapter14Application.java | 13 +++++ .../didispace/chapter14/DidiProperties.java | 17 ++++++ .../didispace/chapter14/HelloController.java | 14 +++++ .../src/main/resources/application.properties | 3 ++ 2.x/pom.xml | 1 + 7 files changed, 129 insertions(+) create mode 100644 2.x/chapter1-4/.gitignore create mode 100644 2.x/chapter1-4/pom.xml create mode 100644 2.x/chapter1-4/src/main/java/com/didispace/chapter14/Chapter14Application.java create mode 100644 2.x/chapter1-4/src/main/java/com/didispace/chapter14/DidiProperties.java create mode 100644 2.x/chapter1-4/src/main/java/com/didispace/chapter14/HelloController.java create mode 100644 2.x/chapter1-4/src/main/resources/application.properties diff --git a/2.x/chapter1-4/.gitignore b/2.x/chapter1-4/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter1-4/.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/2.x/chapter1-4/pom.xml b/2.x/chapter1-4/pom.xml new file mode 100644 index 00000000..e64ae735 --- /dev/null +++ b/2.x/chapter1-4/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.1 + + + com.didispace + chapter1-4 + 0.0.1-SNAPSHOT + chapter1-1 + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-configuration-processor + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter1-4/src/main/java/com/didispace/chapter14/Chapter14Application.java b/2.x/chapter1-4/src/main/java/com/didispace/chapter14/Chapter14Application.java new file mode 100644 index 00000000..ff6b7d72 --- /dev/null +++ b/2.x/chapter1-4/src/main/java/com/didispace/chapter14/Chapter14Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter14; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter14Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter14Application.class, args); + } + +} diff --git a/2.x/chapter1-4/src/main/java/com/didispace/chapter14/DidiProperties.java b/2.x/chapter1-4/src/main/java/com/didispace/chapter14/DidiProperties.java new file mode 100644 index 00000000..d283aef1 --- /dev/null +++ b/2.x/chapter1-4/src/main/java/com/didispace/chapter14/DidiProperties.java @@ -0,0 +1,17 @@ +package com.didispace.chapter14; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "com.didispace") +public class DidiProperties { + + /** + * 这是一个测试配置 + */ + private String from; + +} diff --git a/2.x/chapter1-4/src/main/java/com/didispace/chapter14/HelloController.java b/2.x/chapter1-4/src/main/java/com/didispace/chapter14/HelloController.java new file mode 100644 index 00000000..d19b5ef6 --- /dev/null +++ b/2.x/chapter1-4/src/main/java/com/didispace/chapter14/HelloController.java @@ -0,0 +1,14 @@ +package com.didispace.chapter11; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloController { + + @RequestMapping("/hello") + public String index() { + return "Hello World"; + } + +} \ No newline at end of file diff --git a/2.x/chapter1-4/src/main/resources/application.properties b/2.x/chapter1-4/src/main/resources/application.properties new file mode 100644 index 00000000..20da7c87 --- /dev/null +++ b/2.x/chapter1-4/src/main/resources/application.properties @@ -0,0 +1,3 @@ + +com.didispace.from=didi + diff --git a/2.x/pom.xml b/2.x/pom.xml index b1280a90..616e4c34 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -15,6 +15,7 @@ chapter1-2 chapter1-3 + chapter1-4 chapter2-1 From 54a27b1dd14c9b901d45035335d2de686b05b53c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Mon, 18 Jan 2021 17:06:11 +0800 Subject: [PATCH 062/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E9=85=8D=E7=BD=AE=E5=85=83=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E5=BA=94=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 1 + 2.x/README_zh.md | 1 + 2 files changed, 2 insertions(+) diff --git a/2.x/README.md b/2.x/README.md index 1c59a932..d9972eac 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -67,6 +67,7 @@ - [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) - [Spring Boot 2.x基础教程:2.4版本前后的多环境配置变化](http://blog.didispace.com/spring-boot-learning-24-1-4/) - [Spring Boot 2.x基础教程:2.4版本前后的分组配置变化](http://blog.didispace.com/spring-boot-learning-24-1-5/) +- [Spring Boot 2.x基础教程:配置元数据的应用 ](http://blog.didispace.com/spring-boot-learning-24-1-6/) ### Web开发 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index eefb4376..2668567c 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -68,6 +68,7 @@ - [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) - [Spring Boot 2.x基础教程:2.4版本前后的多环境配置变化](http://blog.didispace.com/spring-boot-learning-24-1-4/) - [Spring Boot 2.x基础教程:2.4版本前后的分组配置变化](http://blog.didispace.com/spring-boot-learning-24-1-5/) +- [Spring Boot 2.x基础教程:配置元数据的应用 ](http://blog.didispace.com/spring-boot-learning-24-1-6/) ### Web开发 From 2b01f8f044fa197d3438b29dfcd3e5f74cb920e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Tue, 2 Feb 2021 19:15:15 +0800 Subject: [PATCH 063/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8JTA=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=88=86=E5=B8=83=E5=BC=8F=E4=BA=8B=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 3 +- 2.x/README_zh.md | 1 + 2.x/chapter3-12/.gitignore | 29 +++++++++ 2.x/chapter3-12/pom.xml | 64 +++++++++++++++++++ .../chapter312/Chapter312Application.java | 13 ++++ .../chapter312/DataSourceConfiguration.java | 40 ++++++++++++ .../com/didispace/chapter312/TestService.java | 34 ++++++++++ .../src/main/resources/application.properties | 31 +++++++++ .../Chapter312ApplicationTests.java | 45 +++++++++++++ 2.x/pom.xml | 2 + 10 files changed, 261 insertions(+), 1 deletion(-) create mode 100644 2.x/chapter3-12/.gitignore create mode 100644 2.x/chapter3-12/pom.xml create mode 100644 2.x/chapter3-12/src/main/java/com/didispace/chapter312/Chapter312Application.java create mode 100644 2.x/chapter3-12/src/main/java/com/didispace/chapter312/DataSourceConfiguration.java create mode 100644 2.x/chapter3-12/src/main/java/com/didispace/chapter312/TestService.java create mode 100644 2.x/chapter3-12/src/main/resources/application.properties create mode 100644 2.x/chapter3-12/src/test/java/com/didispace/chapter312/Chapter312ApplicationTests.java diff --git a/2.x/README.md b/2.x/README.md index d9972eac..eef9aef7 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -93,7 +93,8 @@ - [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) - [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) - [Spring Boot 2.x基础教程:使用Flyway管理数据库版本](http://blog.didispace.com/spring-boot-learning-24-3-11/) - +- [Spring Boot 2.x基础教程:使用JTA实现分布式事务](http://blog.didispace.com/spring-boot-learning-24-3-12/) + **加速利器:各种缓存的使用** - [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 2668567c..b7a36e10 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -94,6 +94,7 @@ - [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) - [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) - [Spring Boot 2.x基础教程:使用Flyway管理数据库版本](http://blog.didispace.com/spring-boot-learning-24-3-11/) +- [Spring Boot 2.x基础教程:使用JTA实现分布式事务](http://blog.didispace.com/spring-boot-learning-24-3-12/) **加速利器:各种缓存的使用** diff --git a/2.x/chapter3-12/.gitignore b/2.x/chapter3-12/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter3-12/.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/2.x/chapter3-12/pom.xml b/2.x/chapter3-12/pom.xml new file mode 100644 index 00000000..f097b682 --- /dev/null +++ b/2.x/chapter3-12/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.4.2 + + + + com.didispace + chapter3-12 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + org.springframework.boot + spring-boot-starter-jta-atomikos + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter3-12/src/main/java/com/didispace/chapter312/Chapter312Application.java b/2.x/chapter3-12/src/main/java/com/didispace/chapter312/Chapter312Application.java new file mode 100644 index 00000000..325ef162 --- /dev/null +++ b/2.x/chapter3-12/src/main/java/com/didispace/chapter312/Chapter312Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter312; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter312Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter312Application.class, args); + } + +} diff --git a/2.x/chapter3-12/src/main/java/com/didispace/chapter312/DataSourceConfiguration.java b/2.x/chapter3-12/src/main/java/com/didispace/chapter312/DataSourceConfiguration.java new file mode 100644 index 00000000..8b71d643 --- /dev/null +++ b/2.x/chapter3-12/src/main/java/com/didispace/chapter312/DataSourceConfiguration.java @@ -0,0 +1,40 @@ +package com.didispace.chapter312; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.core.JdbcTemplate; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfiguration { + + @Primary + @Bean + @ConfigurationProperties(prefix = "spring.jta.atomikos.datasource.primary") + public DataSource primaryDataSource() { + return new AtomikosDataSourceBean(); + } + + @Bean + @ConfigurationProperties(prefix = "spring.jta.atomikos.datasource.secondary") + public DataSource secondaryDataSource() { + return new AtomikosDataSourceBean(); + } + + @Bean + public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource primaryDataSource) { + return new JdbcTemplate(primaryDataSource); + } + + @Bean + public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) { + return new JdbcTemplate(secondaryDataSource); + } + +} diff --git a/2.x/chapter3-12/src/main/java/com/didispace/chapter312/TestService.java b/2.x/chapter3-12/src/main/java/com/didispace/chapter312/TestService.java new file mode 100644 index 00000000..119241dc --- /dev/null +++ b/2.x/chapter3-12/src/main/java/com/didispace/chapter312/TestService.java @@ -0,0 +1,34 @@ +package com.didispace.chapter312; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class TestService { + + private JdbcTemplate primaryJdbcTemplate; + private JdbcTemplate secondaryJdbcTemplate; + + public TestService(JdbcTemplate primaryJdbcTemplate, JdbcTemplate secondaryJdbcTemplate) { + this.primaryJdbcTemplate = primaryJdbcTemplate; + this.secondaryJdbcTemplate = secondaryJdbcTemplate; + } + + @Transactional + public void tx() { + // 修改test1库中的数据 + primaryJdbcTemplate.update("update user set age = ? where name = ?", 30, "aaa"); + // 修改test2库中的数据 + secondaryJdbcTemplate.update("update user set age = ? where name = ?", 30, "aaa"); + } + + @Transactional + public void tx2() { + // 修改test1库中的数据 + primaryJdbcTemplate.update("update user set age = ? where name = ?", 40, "aaa"); + // 模拟:修改test2库之前抛出异常 + throw new RuntimeException(); + } + +} diff --git a/2.x/chapter3-12/src/main/resources/application.properties b/2.x/chapter3-12/src/main/resources/application.properties new file mode 100644 index 00000000..312835d1 --- /dev/null +++ b/2.x/chapter3-12/src/main/resources/application.properties @@ -0,0 +1,31 @@ +spring.jta.enabled=true + +spring.jta.atomikos.datasource.primary.xa-properties.url=jdbc:mysql://localhost:3306/test1 +spring.jta.atomikos.datasource.primary.xa-properties.user=root +spring.jta.atomikos.datasource.primary.xa-properties.password=12345678 +spring.jta.atomikos.datasource.primary.xa-data-source-class-name=com.mysql.cj.jdbc.MysqlXADataSource +spring.jta.atomikos.datasource.primary.unique-resource-name=test1 +spring.jta.atomikos.datasource.primary.max-pool-size=25 +spring.jta.atomikos.datasource.primary.min-pool-size=3 +spring.jta.atomikos.datasource.primary.max-lifetime=20000 +spring.jta.atomikos.datasource.primary.borrow-connection-timeout=10000 + +spring.jta.atomikos.datasource.secondary.xa-properties.url=jdbc:mysql://localhost:3306/test2 +spring.jta.atomikos.datasource.secondary.xa-properties.user=root +spring.jta.atomikos.datasource.secondary.xa-properties.password=12345678 +spring.jta.atomikos.datasource.secondary.xa-data-source-class-name=com.mysql.cj.jdbc.MysqlXADataSource +spring.jta.atomikos.datasource.secondary.unique-resource-name=test2 +spring.jta.atomikos.datasource.secondary.max-pool-size=25 +spring.jta.atomikos.datasource.secondary.min-pool-size=3 +spring.jta.atomikos.datasource.secondary.max-lifetime=20000 +spring.jta.atomikos.datasource.secondary.borrow-connection-timeout=10000 + +#spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1 +#spring.datasource.primary.username=root +#spring.datasource.primary.password=12345678 +#spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver +# +#spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2 +#spring.datasource.secondary.username=root +#spring.datasource.secondary.password=12345678 +#spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver \ No newline at end of file diff --git a/2.x/chapter3-12/src/test/java/com/didispace/chapter312/Chapter312ApplicationTests.java b/2.x/chapter3-12/src/test/java/com/didispace/chapter312/Chapter312ApplicationTests.java new file mode 100644 index 00000000..649b8b17 --- /dev/null +++ b/2.x/chapter3-12/src/test/java/com/didispace/chapter312/Chapter312ApplicationTests.java @@ -0,0 +1,45 @@ +package com.didispace.chapter312; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.transaction.annotation.Transactional; + + +@SpringBootTest(classes = Chapter312Application.class) +public class Chapter312ApplicationTests { + + @Autowired + protected JdbcTemplate primaryJdbcTemplate; + @Autowired + protected JdbcTemplate secondaryJdbcTemplate; + + @Autowired + private TestService testService; + + @Test + public void test1() throws Exception { + // 正确更新的情况 + testService.tx(); + Assertions.assertEquals(30, primaryJdbcTemplate.queryForObject("select age from user where name=?", Integer.class, "aaa")); + Assertions.assertEquals(30, secondaryJdbcTemplate.queryForObject("select age from user where name=?", Integer.class, "aaa")); + } + + @Test + public void test2() throws Exception { + // 更新失败的情况 + try { + testService.tx2(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + // 部分更新失败,test1中的更新应该回滚 + Assertions.assertEquals(30, primaryJdbcTemplate.queryForObject("select age from user where name=?", Integer.class, "aaa")); + Assertions.assertEquals(30, secondaryJdbcTemplate.queryForObject("select age from user where name=?", Integer.class, "aaa")); + } + } + +} diff --git a/2.x/pom.xml b/2.x/pom.xml index 616e4c34..e7db22a7 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -39,6 +39,8 @@ chapter3-9 chapter3-10 chapter3-11 + chapter3-12 + From ef859f7324c8dc40819acb72bd4d360b041b3bf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 3 Mar 2021 17:42:27 +0800 Subject: [PATCH 064/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8MongoDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter6-1/pom.xml | 55 +++++++++++++++++++ .../chapter61/Chapter61Application.java | 13 +++++ .../java/com/didispace/chapter61/User.java | 47 ++++++++++++++++ .../didispace/chapter61/UserRepository.java | 14 +++++ .../src/main/resources/application.properties | 3 + .../didispace/chapter61/ApplicationTests.java | 42 ++++++++++++++ 2.x/pom.xml | 8 ++- 7 files changed, 180 insertions(+), 2 deletions(-) create mode 100755 2.x/chapter6-1/pom.xml create mode 100755 2.x/chapter6-1/src/main/java/com/didispace/chapter61/Chapter61Application.java create mode 100644 2.x/chapter6-1/src/main/java/com/didispace/chapter61/User.java create mode 100644 2.x/chapter6-1/src/main/java/com/didispace/chapter61/UserRepository.java create mode 100644 2.x/chapter6-1/src/main/resources/application.properties create mode 100755 2.x/chapter6-1/src/test/java/com/didispace/chapter61/ApplicationTests.java diff --git a/2.x/chapter6-1/pom.xml b/2.x/chapter6-1/pom.xml new file mode 100755 index 00000000..ede613c5 --- /dev/null +++ b/2.x/chapter6-1/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + com.didispace + chapter6-1 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/2.x/chapter6-1/src/main/java/com/didispace/chapter61/Chapter61Application.java b/2.x/chapter6-1/src/main/java/com/didispace/chapter61/Chapter61Application.java new file mode 100755 index 00000000..184a48eb --- /dev/null +++ b/2.x/chapter6-1/src/main/java/com/didispace/chapter61/Chapter61Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter61; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter61Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter61Application.class, args); + } + +} diff --git a/2.x/chapter6-1/src/main/java/com/didispace/chapter61/User.java b/2.x/chapter6-1/src/main/java/com/didispace/chapter61/User.java new file mode 100644 index 00000000..4a4f4186 --- /dev/null +++ b/2.x/chapter6-1/src/main/java/com/didispace/chapter61/User.java @@ -0,0 +1,47 @@ +package com.didispace.chapter61; + +import org.springframework.data.annotation.Id; + +/** + * @author 程序猿DD + * @version 1.0.0 + * @blog http://blog.didispace.com + */ +public class User { + + @Id + private Long id; + + private String username; + private Integer age; + + public User(Long id, String username, Integer age) { + this.id = id; + this.username = username; + this.age = age; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } +} diff --git a/2.x/chapter6-1/src/main/java/com/didispace/chapter61/UserRepository.java b/2.x/chapter6-1/src/main/java/com/didispace/chapter61/UserRepository.java new file mode 100644 index 00000000..f1336f96 --- /dev/null +++ b/2.x/chapter6-1/src/main/java/com/didispace/chapter61/UserRepository.java @@ -0,0 +1,14 @@ +package com.didispace.chapter61; + +import org.springframework.data.mongodb.repository.MongoRepository; + +/** + * @author 程序猿DD + * @version 1.0.0 + * @blog http://blog.didispace.com + */ +public interface UserRepository extends MongoRepository { + + User findByUsername(String username); + +} diff --git a/2.x/chapter6-1/src/main/resources/application.properties b/2.x/chapter6-1/src/main/resources/application.properties new file mode 100644 index 00000000..65cdd338 --- /dev/null +++ b/2.x/chapter6-1/src/main/resources/application.properties @@ -0,0 +1,3 @@ +spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test + + diff --git a/2.x/chapter6-1/src/test/java/com/didispace/chapter61/ApplicationTests.java b/2.x/chapter6-1/src/test/java/com/didispace/chapter61/ApplicationTests.java new file mode 100755 index 00000000..bf2fd268 --- /dev/null +++ b/2.x/chapter6-1/src/test/java/com/didispace/chapter61/ApplicationTests.java @@ -0,0 +1,42 @@ +package com.didispace.chapter61; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest(classes = Chapter61Application.class) +public class ApplicationTests { + + @Autowired + private UserRepository userRepository; + + @Before + public void setUp() { + userRepository.deleteAll(); + } + + @Test + public void test() throws Exception { + userRepository.deleteAll(); + + // 创建三个User,并验证User总数 + userRepository.save(new User(1L, "didi", 30)); + userRepository.save(new User(2L, "mama", 40)); + userRepository.save(new User(3L, "kaka", 50)); + Assert.assertEquals(3, userRepository.findAll().size()); + + // 删除一个User,再验证User总数 + User u = userRepository.findById(1L).get(); + userRepository.delete(u); + Assert.assertEquals(2, userRepository.findAll().size()); + + // 删除一个User,再验证User总数 + u = userRepository.findByUsername("mama"); + userRepository.delete(u); + Assert.assertEquals(1, userRepository.findAll().size()); + + } + +} diff --git a/2.x/pom.xml b/2.x/pom.xml index e7db22a7..df920fc0 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -58,12 +58,16 @@ chapter5-4 - - + + chapter6-1 + + + + From 94ededc59d2ef67346226a81391b08848e853603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 3 Mar 2021 17:50:30 +0800 Subject: [PATCH 065/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E5=BF=AB=E9=80=9F=E5=85=A5=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/didispace/chapter11/Chapter11ApplicationTests.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/2.x/chapter1-1/src/test/java/com/didispace/chapter11/Chapter11ApplicationTests.java b/2.x/chapter1-1/src/test/java/com/didispace/chapter11/Chapter11ApplicationTests.java index 79cbf107..e39db87a 100644 --- a/2.x/chapter1-1/src/test/java/com/didispace/chapter11/Chapter11ApplicationTests.java +++ b/2.x/chapter1-1/src/test/java/com/didispace/chapter11/Chapter11ApplicationTests.java @@ -2,10 +2,8 @@ import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; @@ -15,7 +13,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@RunWith(SpringRunner.class) @SpringBootTest public class Chapter11ApplicationTests { From 3961ad214110b37a75a133c56526ace7d6ea0904 Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Wed, 3 Mar 2021 21:24:58 +0800 Subject: [PATCH 066/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8MongoDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter6-1/pom.xml | 1 - .../java/com/didispace/chapter61/Chapter61Application.java | 6 +++--- 2.x/chapter6-1/src/main/resources/application.properties | 2 +- .../test/java/com/didispace/chapter61/ApplicationTests.java | 5 +++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/2.x/chapter6-1/pom.xml b/2.x/chapter6-1/pom.xml index ede613c5..7037b09e 100755 --- a/2.x/chapter6-1/pom.xml +++ b/2.x/chapter6-1/pom.xml @@ -51,5 +51,4 @@ - diff --git a/2.x/chapter6-1/src/main/java/com/didispace/chapter61/Chapter61Application.java b/2.x/chapter6-1/src/main/java/com/didispace/chapter61/Chapter61Application.java index 184a48eb..dfd534eb 100755 --- a/2.x/chapter6-1/src/main/java/com/didispace/chapter61/Chapter61Application.java +++ b/2.x/chapter6-1/src/main/java/com/didispace/chapter61/Chapter61Application.java @@ -6,8 +6,8 @@ @SpringBootApplication public class Chapter61Application { - public static void main(String[] args) { - SpringApplication.run(Chapter61Application.class, args); - } + public static void main(String[] args) { + SpringApplication.run(Chapter61Application.class, args); + } } diff --git a/2.x/chapter6-1/src/main/resources/application.properties b/2.x/chapter6-1/src/main/resources/application.properties index 65cdd338..0e2f083f 100644 --- a/2.x/chapter6-1/src/main/resources/application.properties +++ b/2.x/chapter6-1/src/main/resources/application.properties @@ -1,3 +1,3 @@ -spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test +spring.data.mongodb.uri=mongodb://localhost:27017/test diff --git a/2.x/chapter6-1/src/test/java/com/didispace/chapter61/ApplicationTests.java b/2.x/chapter6-1/src/test/java/com/didispace/chapter61/ApplicationTests.java index bf2fd268..74d0d87f 100755 --- a/2.x/chapter6-1/src/test/java/com/didispace/chapter61/ApplicationTests.java +++ b/2.x/chapter6-1/src/test/java/com/didispace/chapter61/ApplicationTests.java @@ -3,9 +3,12 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +@RunWith(SpringRunner.class) @SpringBootTest(classes = Chapter61Application.class) public class ApplicationTests { @@ -19,8 +22,6 @@ public void setUp() { @Test public void test() throws Exception { - userRepository.deleteAll(); - // 创建三个User,并验证User总数 userRepository.save(new User(1L, "didi", 30)); userRepository.save(new User(2L, "mama", 40)); From da35cc88eb15f02f8b4b1b483f9a0732fd53b422 Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Wed, 3 Mar 2021 22:18:09 +0800 Subject: [PATCH 067/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8MongoDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 7 ++++ 2.x/README_zh.md | 9 ++++- 2.x/chapter6-1/pom.xml | 2 +- .../java/com/didispace/chapter61/User.java | 33 +++---------------- .../didispace/chapter61/ApplicationTests.java | 22 ++++--------- 5 files changed, 27 insertions(+), 46 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index eef9aef7..2b23ceba 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -77,6 +77,7 @@ - [Spring Boot 2.x基础教程:Swagger接口分类与各元素排序问题详解](http://blog.didispace.com/spring-boot-learning-21-2-4/) - [Spring Boot 2.x基础教程:Swagger静态文档的生成](http://blog.didispace.com/spring-boot-learning-21-2-5/) - [Spring Boot 2.x基础教程:找回启动日志中的请求路径列表](http://blog.didispace.com/spring-boot-learning-21-2-6/) +- [Spring Boot 2.x基础教程:使用SpringFox 3生成Swagger文档](http://blog.didispace.com/spring-boot-learning-21-2-7/) ### 数据访问 @@ -102,12 +103,18 @@ - [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) - [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/) +**其他常见存储的使用** + +- [Spring Boot 2.x基础教程:使用MongoDB](http://blog.didispace.com/spring-boot-learning-24-6-1/) + + ### Web开发 - [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) - [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) - [Spring Boot 2.x基础教程:实现文件上传](http://blog.didispace.com/spring-boot-learning-21-4-3/) - [Spring Boot 2.x基础教程:实现多文件上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) +- [Spring Boot 2.x基础教程:文件上传的单元测试怎么写](https://blog.didispace.com/spring-boot-learning-21-4-5/) ## 版本资讯 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index b7a36e10..7c1b84a6 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -70,7 +70,7 @@ - [Spring Boot 2.x基础教程:2.4版本前后的分组配置变化](http://blog.didispace.com/spring-boot-learning-24-1-5/) - [Spring Boot 2.x基础教程:配置元数据的应用 ](http://blog.didispace.com/spring-boot-learning-24-1-6/) -### Web开发 +### API开发 - [Spring Boot 2.x基础教程:构建RESTful API与单元测试](http://blog.didispace.com/spring-boot-learning-21-2-1/) - [Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档](http://blog.didispace.com/spring-boot-learning-21-2-2/) @@ -78,6 +78,7 @@ - [Spring Boot 2.x基础教程:Swagger接口分类与各元素排序问题详解](http://blog.didispace.com/spring-boot-learning-21-2-4/) - [Spring Boot 2.x基础教程:Swagger静态文档的生成](http://blog.didispace.com/spring-boot-learning-21-2-5/) - [Spring Boot 2.x基础教程:找回启动日志中的请求路径列表](http://blog.didispace.com/spring-boot-learning-21-2-6/) +- [Spring Boot 2.x基础教程:使用SpringFox 3生成Swagger文档](http://blog.didispace.com/spring-boot-learning-21-2-7/) ### 数据访问 @@ -103,12 +104,18 @@ - [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) - [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/) +**其他常见存储的使用** + +- [Spring Boot 2.x基础教程:使用MongoDB](http://blog.didispace.com/spring-boot-learning-24-6-1/) + ### Web开发 - [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) - [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) - [Spring Boot 2.x基础教程:实现文件上传](http://blog.didispace.com/spring-boot-learning-21-4-3/) - [Spring Boot 2.x基础教程:实现多文件上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) +- [Spring Boot 2.x基础教程:文件上传的单元测试怎么写](https://blog.didispace.com/spring-boot-learning-21-4-5/) + ## 版本资讯 diff --git a/2.x/chapter6-1/pom.xml b/2.x/chapter6-1/pom.xml index 7037b09e..7c21c138 100755 --- a/2.x/chapter6-1/pom.xml +++ b/2.x/chapter6-1/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.3.RELEASE + 2.4.1 diff --git a/2.x/chapter6-1/src/main/java/com/didispace/chapter61/User.java b/2.x/chapter6-1/src/main/java/com/didispace/chapter61/User.java index 4a4f4186..e94f10c0 100644 --- a/2.x/chapter6-1/src/main/java/com/didispace/chapter61/User.java +++ b/2.x/chapter6-1/src/main/java/com/didispace/chapter61/User.java @@ -1,5 +1,7 @@ package com.didispace.chapter61; +import lombok.AllArgsConstructor; +import lombok.Data; import org.springframework.data.annotation.Id; /** @@ -7,6 +9,8 @@ * @version 1.0.0 * @blog http://blog.didispace.com */ +@Data +@AllArgsConstructor public class User { @Id @@ -15,33 +19,4 @@ public class User { private String username; private Integer age; - public User(Long id, String username, Integer age) { - this.id = id; - this.username = username; - this.age = age; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public Integer getAge() { - return age; - } - - public void setAge(Integer age) { - this.age = age; - } } diff --git a/2.x/chapter6-1/src/test/java/com/didispace/chapter61/ApplicationTests.java b/2.x/chapter6-1/src/test/java/com/didispace/chapter61/ApplicationTests.java index 74d0d87f..e1ee421a 100755 --- a/2.x/chapter6-1/src/test/java/com/didispace/chapter61/ApplicationTests.java +++ b/2.x/chapter6-1/src/test/java/com/didispace/chapter61/ApplicationTests.java @@ -1,43 +1,35 @@ package com.didispace.chapter61; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -@RunWith(SpringRunner.class) @SpringBootTest(classes = Chapter61Application.class) public class ApplicationTests { @Autowired private UserRepository userRepository; - @Before - public void setUp() { - userRepository.deleteAll(); - } - @Test public void test() throws Exception { + userRepository.deleteAll(); + // 创建三个User,并验证User总数 userRepository.save(new User(1L, "didi", 30)); userRepository.save(new User(2L, "mama", 40)); userRepository.save(new User(3L, "kaka", 50)); - Assert.assertEquals(3, userRepository.findAll().size()); + Assertions.assertEquals(3, userRepository.findAll().size()); // 删除一个User,再验证User总数 User u = userRepository.findById(1L).get(); userRepository.delete(u); - Assert.assertEquals(2, userRepository.findAll().size()); + Assertions.assertEquals(2, userRepository.findAll().size()); // 删除一个User,再验证User总数 u = userRepository.findByUsername("mama"); userRepository.delete(u); - Assert.assertEquals(1, userRepository.findAll().size()); - + Assertions.assertEquals(1, userRepository.findAll().size()); } } From 00343765edab50391df75bdffd1e9865a0add542 Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Sun, 23 May 2021 18:11:26 +0800 Subject: [PATCH 068/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A2.5=E7=89=88=E6=9C=AC=E4=B9=8B?= =?UTF-8?q?=E5=90=8E=E7=9A=84=E6=95=B0=E6=8D=AE=E8=84=9A=E6=9C=AC=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-13/.gitignore | 29 ++++++++++ 2.x/chapter3-13/pom.xml | 58 +++++++++++++++++++ .../chapter313/Chapter313Application.java | 13 +++++ .../src/main/resources/application.properties | 15 +++++ .../src/main/resources/schema-all.sql | 18 ++++++ .../chapter31/Chapter31ApplicationTests.java | 17 ++++++ 2.x/pom.xml | 1 + 7 files changed, 151 insertions(+) create mode 100644 2.x/chapter3-13/.gitignore create mode 100644 2.x/chapter3-13/pom.xml create mode 100644 2.x/chapter3-13/src/main/java/com/didispace/chapter313/Chapter313Application.java create mode 100644 2.x/chapter3-13/src/main/resources/application.properties create mode 100644 2.x/chapter3-13/src/main/resources/schema-all.sql create mode 100644 2.x/chapter3-13/src/test/java/com/didispace/chapter31/Chapter31ApplicationTests.java diff --git a/2.x/chapter3-13/.gitignore b/2.x/chapter3-13/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter3-13/.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/2.x/chapter3-13/pom.xml b/2.x/chapter3-13/pom.xml new file mode 100644 index 00000000..b9728f16 --- /dev/null +++ b/2.x/chapter3-13/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.0 + + + + com.didispace + chapter3-1(2.5+) + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + mysql + mysql-connector-java + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter3-13/src/main/java/com/didispace/chapter313/Chapter313Application.java b/2.x/chapter3-13/src/main/java/com/didispace/chapter313/Chapter313Application.java new file mode 100644 index 00000000..88768410 --- /dev/null +++ b/2.x/chapter3-13/src/main/java/com/didispace/chapter313/Chapter313Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter313; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter313Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter313Application.class, args); + } + +} diff --git a/2.x/chapter3-13/src/main/resources/application.properties b/2.x/chapter3-13/src/main/resources/application.properties new file mode 100644 index 00000000..225ddd22 --- /dev/null +++ b/2.x/chapter3-13/src/main/resources/application.properties @@ -0,0 +1,15 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password= +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +# Spring Boot 2.5.0 init schema & data +spring.sql.init.username=root +spring.sql.init.password= +spring.sql.init.schema-locations=classpath*:schema-all.sql +#spring.sql.init.enabled=true +#spring.sql.init.data-locations=classpath*: +#spring.sql.init.encoding=UTF-8 +#spring.sql.init.separator=; +#spring.sql.init.continue-on-error=true + diff --git a/2.x/chapter3-13/src/main/resources/schema-all.sql b/2.x/chapter3-13/src/main/resources/schema-all.sql new file mode 100644 index 00000000..cdbe26c1 --- /dev/null +++ b/2.x/chapter3-13/src/main/resources/schema-all.sql @@ -0,0 +1,18 @@ +create table test.user_info +( + id int unsigned auto_increment comment '用户id' + primary key, + open_id varchar(255) default '' null comment '微信小程序openid', + nick_name varchar(255) default '' null comment '微信名', + head_img varchar(255) default '' null comment '微信头像', + sex varchar(255) default '' null comment '性别', + phone varchar(255) default '' null comment '手机', + province varchar(255) default '' null comment '注册地址:省', + city varchar(255) default '' null comment '注册地址:城市', + country varchar(255) default '' null comment '注册地址:县/区', + status tinyint unsigned default 0 not null comment '是否标记删除 0:否 1:是', + create_time datetime not null comment '创建时间', + update_time datetime not null comment '更新时间' +) + comment '用户表'; + diff --git a/2.x/chapter3-13/src/test/java/com/didispace/chapter31/Chapter31ApplicationTests.java b/2.x/chapter3-13/src/test/java/com/didispace/chapter31/Chapter31ApplicationTests.java new file mode 100644 index 00000000..e65f6029 --- /dev/null +++ b/2.x/chapter3-13/src/test/java/com/didispace/chapter31/Chapter31ApplicationTests.java @@ -0,0 +1,17 @@ +package com.didispace.chapter31; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + + +@SpringBootTest +public class Chapter31ApplicationTests { + + + @Test + public void test() throws Exception { + + + } + +} diff --git a/2.x/pom.xml b/2.x/pom.xml index df920fc0..68da28f3 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -40,6 +40,7 @@ chapter3-10 chapter3-11 chapter3-12 + chapter3-13 From aa19c6e723bad1ab2f020e8f17b601e3a3000ef7 Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Sun, 23 May 2021 18:21:51 +0800 Subject: [PATCH 069/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A2.5=E7=89=88=E6=9C=AC=E5=90=8E?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=84=9A=E6=9C=AC=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E5=8F=98=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 3 +++ 2.x/README_zh.md | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/2.x/README.md b/2.x/README.md index 2b23ceba..3834483f 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -96,6 +96,8 @@ - [Spring Boot 2.x基础教程:使用Flyway管理数据库版本](http://blog.didispace.com/spring-boot-learning-24-3-11/) - [Spring Boot 2.x基础教程:使用JTA实现分布式事务](http://blog.didispace.com/spring-boot-learning-24-3-12/) +- [Spring Boot 2.x基础教程:2.5版本后数据脚本初始化的变动](http://blog.didispace.com/spring-boot-learning-25-3-13/) + **加速利器:各种缓存的使用** - [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) @@ -134,6 +136,7 @@ - [Spring Boot 2.3.2 发布,解决 Too many open files 导致的应用宕机问题](http://blog.didispace.com/spring-boot-2-3-2-release/) - [Spring Boot 2.4.0 正式发布!全新的配置处理机制,拥抱云原生!](http://blog.didispace.com/spring-boot-2-4-0-ga/) - [Spring Boot 2.4.1 发布,修正大量2.4全新配置机制的Bug](http://blog.didispace.com/spring-boot-2-4-1-release/) +- [Spring Boot 2.5.0 发布:支持Java16、Gradle 7、Datasource初始化调整](https://blog.didispace.com/spring-boot-2-5-0-release/) ## 我的公众号 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 7c1b84a6..dda26e79 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -97,6 +97,8 @@ - [Spring Boot 2.x基础教程:使用Flyway管理数据库版本](http://blog.didispace.com/spring-boot-learning-24-3-11/) - [Spring Boot 2.x基础教程:使用JTA实现分布式事务](http://blog.didispace.com/spring-boot-learning-24-3-12/) +- [Spring Boot 2.x基础教程:2.5版本后数据脚本初始化的变动](http://blog.didispace.com/spring-boot-learning-25-3-13/) + **加速利器:各种缓存的使用** - [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) @@ -108,6 +110,8 @@ - [Spring Boot 2.x基础教程:使用MongoDB](http://blog.didispace.com/spring-boot-learning-24-6-1/) + + ### Web开发 - [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) @@ -135,6 +139,7 @@ - [Spring Boot 2.3.2 发布,解决 Too many open files 导致的应用宕机问题](http://blog.didispace.com/spring-boot-2-3-2-release/) - [Spring Boot 2.4.0 正式发布!全新的配置处理机制,拥抱云原生!](http://blog.didispace.com/spring-boot-2-4-0-ga/) - [Spring Boot 2.4.1 发布,修正大量2.4全新配置机制的Bug](http://blog.didispace.com/spring-boot-2-4-1-release/) +- [Spring Boot 2.5.0 发布:支持Java16、Gradle 7、Datasource初始化调整](https://blog.didispace.com/spring-boot-2-5-0-release/) ## 推荐内容 From 5d3fb25e3ef95a3cff33494931036e095d50e383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 2 Jun 2021 16:09:41 +0800 Subject: [PATCH 070/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A2.5=E7=89=88=E6=9C=AC=E5=90=8E?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=84=9A=E6=9C=AC=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E5=8F=98=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-13/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter3-13/pom.xml b/2.x/chapter3-13/pom.xml index b9728f16..8fecff2e 100644 --- a/2.x/chapter3-13/pom.xml +++ b/2.x/chapter3-13/pom.xml @@ -11,7 +11,7 @@ com.didispace - chapter3-1(2.5+) + chapter3-13 0.0.1-SNAPSHOT From 6c3633e3426c9ed85bb8af41a24c1ec89bce08b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 16 Jun 2021 14:10:54 +0800 Subject: [PATCH 071/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E5=A6=82=E4=BD=95=E6=89=A9=E5=B1=95?= =?UTF-8?q?XML=E6=A0=BC=E5=BC=8F=E7=9A=84=E8=AF=B7=E6=B1=82=E5=92=8C?= =?UTF-8?q?=E5=93=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 13 ++++- 2.x/README_zh.md | 10 +++- 2.x/chapter2-8/pom.xml | 56 +++++++++++++++++++ .../chapter28/Chapter28Application.java | 18 ++++++ .../java/com/didispace/chapter28/User.java | 26 +++++++++ .../didispace/chapter28/UserController.java | 27 +++++++++ .../src/main/resources/application.properties | 0 2.x/pom.xml | 3 +- 8 files changed, 148 insertions(+), 5 deletions(-) create mode 100644 2.x/chapter2-8/pom.xml create mode 100755 2.x/chapter2-8/src/main/java/com/didispace/chapter28/Chapter28Application.java create mode 100755 2.x/chapter2-8/src/main/java/com/didispace/chapter28/User.java create mode 100755 2.x/chapter2-8/src/main/java/com/didispace/chapter28/UserController.java create mode 100755 2.x/chapter2-8/src/main/resources/application.properties diff --git a/2.x/README.md b/2.x/README.md index 3834483f..c22d7d01 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -4,7 +4,7 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://mp.weixin.qq.com/s/K0BHKqZohfK4jllzLyQA1g) +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) **如何支持**: @@ -69,7 +69,7 @@ - [Spring Boot 2.x基础教程:2.4版本前后的分组配置变化](http://blog.didispace.com/spring-boot-learning-24-1-5/) - [Spring Boot 2.x基础教程:配置元数据的应用 ](http://blog.didispace.com/spring-boot-learning-24-1-6/) -### Web开发 +### API开发 - [Spring Boot 2.x基础教程:构建RESTful API与单元测试](http://blog.didispace.com/spring-boot-learning-21-2-1/) - [Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档](http://blog.didispace.com/spring-boot-learning-21-2-2/) @@ -78,6 +78,7 @@ - [Spring Boot 2.x基础教程:Swagger静态文档的生成](http://blog.didispace.com/spring-boot-learning-21-2-5/) - [Spring Boot 2.x基础教程:找回启动日志中的请求路径列表](http://blog.didispace.com/spring-boot-learning-21-2-6/) - [Spring Boot 2.x基础教程:使用SpringFox 3生成Swagger文档](http://blog.didispace.com/spring-boot-learning-21-2-7/) +- [Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应](http://blog.didispace.com/spring-boot-learning-21-2-8/) ### 数据访问 @@ -109,7 +110,6 @@ - [Spring Boot 2.x基础教程:使用MongoDB](http://blog.didispace.com/spring-boot-learning-24-6-1/) - ### Web开发 - [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) @@ -118,6 +118,13 @@ - [Spring Boot 2.x基础教程:实现多文件上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) - [Spring Boot 2.x基础教程:文件上传的单元测试怎么写](https://blog.didispace.com/spring-boot-learning-21-4-5/) +### 常见问题 + +- [为什么加了@Transactional注解,事务没有回滚?](http://blog.didispace.com/transactional-not-rollback/) +- [为什么启动时候API路径都没了?](http://blog.didispace.com/spring-boot-learning-21-2-6/) +- [使用Java 8中LocalDate等时间日期类的问题解决](http://blog.didispace.com/Spring-Boot-And-Feign-Use-localdate/) +- [Request header is too large 如何解决?](https://blog.didispace.com/request-header-is-too-large/) + ## 版本资讯 ### 1.x到2.x diff --git a/2.x/README_zh.md b/2.x/README_zh.md index dda26e79..5d195321 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -4,7 +4,7 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://mp.weixin.qq.com/s/K0BHKqZohfK4jllzLyQA1g) +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) **如何支持**: 1. 关注我的公众号”**程序猿DD**“ @@ -79,6 +79,7 @@ - [Spring Boot 2.x基础教程:Swagger静态文档的生成](http://blog.didispace.com/spring-boot-learning-21-2-5/) - [Spring Boot 2.x基础教程:找回启动日志中的请求路径列表](http://blog.didispace.com/spring-boot-learning-21-2-6/) - [Spring Boot 2.x基础教程:使用SpringFox 3生成Swagger文档](http://blog.didispace.com/spring-boot-learning-21-2-7/) +- [Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应](http://blog.didispace.com/spring-boot-learning-21-2-8/) ### 数据访问 @@ -120,6 +121,13 @@ - [Spring Boot 2.x基础教程:实现多文件上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) - [Spring Boot 2.x基础教程:文件上传的单元测试怎么写](https://blog.didispace.com/spring-boot-learning-21-4-5/) +### 常见问题 + +- [为什么加了@Transactional注解,事务没有回滚?](http://blog.didispace.com/transactional-not-rollback/) +- [为什么启动时候API路径都没了?](http://blog.didispace.com/spring-boot-learning-21-2-6/) +- [使用Java 8中LocalDate等时间日期类的问题解决](http://blog.didispace.com/Spring-Boot-And-Feign-Use-localdate/) +- [Request header is too large 如何解决?](https://blog.didispace.com/request-header-is-too-large/) + ## 版本资讯 diff --git a/2.x/chapter2-8/pom.xml b/2.x/chapter2-8/pom.xml new file mode 100644 index 00000000..e2746409 --- /dev/null +++ b/2.x/chapter2-8/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + com.didispace + Chapter2-8 + 1.0.0 + jar + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + + org.projectlombok + lombok + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/2.x/chapter2-8/src/main/java/com/didispace/chapter28/Chapter28Application.java b/2.x/chapter2-8/src/main/java/com/didispace/chapter28/Chapter28Application.java new file mode 100755 index 00000000..6577db14 --- /dev/null +++ b/2.x/chapter2-8/src/main/java/com/didispace/chapter28/Chapter28Application.java @@ -0,0 +1,18 @@ +package com.didispace.chapter28; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author 程序猿DD + * @version 1.0.0 + * @blog http://blog.didispace.com + */ +@SpringBootApplication +public class Chapter28Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter28Application.class, args); + } + +} diff --git a/2.x/chapter2-8/src/main/java/com/didispace/chapter28/User.java b/2.x/chapter2-8/src/main/java/com/didispace/chapter28/User.java new file mode 100755 index 00000000..5c035bd4 --- /dev/null +++ b/2.x/chapter2-8/src/main/java/com/didispace/chapter28/User.java @@ -0,0 +1,26 @@ +package com.didispace.chapter28; + + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author 程序猿DD + * @version 1.0.0 + * @blog http://blog.didispace.com + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@JacksonXmlRootElement(localName = "User") +public class User { + + @JacksonXmlProperty(localName = "name") + private String name; + @JacksonXmlProperty(localName = "age") + private Integer age; + +} diff --git a/2.x/chapter2-8/src/main/java/com/didispace/chapter28/UserController.java b/2.x/chapter2-8/src/main/java/com/didispace/chapter28/UserController.java new file mode 100755 index 00000000..055b4042 --- /dev/null +++ b/2.x/chapter2-8/src/main/java/com/didispace/chapter28/UserController.java @@ -0,0 +1,27 @@ +package com.didispace.chapter28; + +import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +/** + * + * @author 程序猿DD + * @version 1.0.0 + * @blog http://blog.didispace.com + * + */ +@Controller +public class UserController { + + @PostMapping(value = "/user", + consumes = MediaType.APPLICATION_XML_VALUE, + produces = MediaType.APPLICATION_XML_VALUE) + @ResponseBody + public User create(@RequestBody User user) { + user.setName("didispace.com : " + user.getName()); + user.setAge(user.getAge() + 100); + return user; + } + +} \ No newline at end of file diff --git a/2.x/chapter2-8/src/main/resources/application.properties b/2.x/chapter2-8/src/main/resources/application.properties new file mode 100755 index 00000000..e69de29b diff --git a/2.x/pom.xml b/2.x/pom.xml index 68da28f3..9b88b0d4 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -25,7 +25,8 @@ chapter2-5 chapter2-6 chapter2-7 - + chapter2-8 + chapter3-1 From 40c3a236e1d47ef3eb24ce86e3caac979064f05f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 16 Jun 2021 14:24:30 +0800 Subject: [PATCH 072/160] update group --- 1.x/README.md | 2 +- 1.x/README_zh.md | 2 +- README.md | 2 +- README_zh.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/1.x/README.md b/1.x/README.md index 4abf6dda..e5f191c2 100644 --- a/1.x/README.md +++ b/1.x/README.md @@ -4,7 +4,7 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://mp.weixin.qq.com/s/K0BHKqZohfK4jllzLyQA1g) +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) **如何支持**: 1. 关注我的公众号”**程序猿DD**“ diff --git a/1.x/README_zh.md b/1.x/README_zh.md index 4f9e75c1..b23d4a16 100644 --- a/1.x/README_zh.md +++ b/1.x/README_zh.md @@ -4,7 +4,7 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://mp.weixin.qq.com/s/K0BHKqZohfK4jllzLyQA1g) +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) **如何支持**: 1. 关注我的公众号”**程序猿DD**“ diff --git a/README.md b/README.md index 77d729ee..64bc8e36 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://mp.weixin.qq.com/s/K0BHKqZohfK4jllzLyQA1g) +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) **如何支持**: 1. 关注我的公众号”**程序猿DD**“ diff --git a/README_zh.md b/README_zh.md index 0c0946db..0eb939df 100644 --- a/README_zh.md +++ b/README_zh.md @@ -4,7 +4,7 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://mp.weixin.qq.com/s/K0BHKqZohfK4jllzLyQA1g) +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) **如何支持**: 1. 关注我的公众号”**程序猿DD**“ From 768fc9fc551fe72add74592551ccf9d04d446173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 17 Jun 2021 17:22:01 +0800 Subject: [PATCH 073/160] 1 --- 2.x/README_zh.md | 2 +- 2.x/chapter6-2/pom.xml | 58 +++++++++++++++++++ .../chapter62/Chapter62Application.java | 13 +++++ .../java/com/didispace/chapter62/Person.java | 22 +++++++ .../didispace/chapter62/PersonRepository.java | 10 ++++ .../src/main/resources/application.properties | 4 ++ .../didispace/chapter62/ApplicationTests.java | 41 +++++++++++++ .../src/test/resources/application.properties | 3 + .../src/test/resources/ldap-server.ldif | 18 ++++++ 2.x/pom.xml | 6 +- 10 files changed, 173 insertions(+), 4 deletions(-) create mode 100644 2.x/chapter6-2/pom.xml create mode 100644 2.x/chapter6-2/src/main/java/com/didispace/chapter62/Chapter62Application.java create mode 100644 2.x/chapter6-2/src/main/java/com/didispace/chapter62/Person.java create mode 100644 2.x/chapter6-2/src/main/java/com/didispace/chapter62/PersonRepository.java create mode 100644 2.x/chapter6-2/src/main/resources/application.properties create mode 100644 2.x/chapter6-2/src/test/java/com/didispace/chapter62/ApplicationTests.java create mode 100644 2.x/chapter6-2/src/test/resources/application.properties create mode 100644 2.x/chapter6-2/src/test/resources/ldap-server.ldif diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 5d195321..434e80a3 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -110,7 +110,7 @@ **其他常见存储的使用** - [Spring Boot 2.x基础教程:使用MongoDB](http://blog.didispace.com/spring-boot-learning-24-6-1/) - +- [Spring Boot 2.x基础教程:使用LDAP来管理用户与组织数据](http://blog.didispace.com/spring-boot-learning-24-6-2/) ### Web开发 diff --git a/2.x/chapter6-2/pom.xml b/2.x/chapter6-2/pom.xml new file mode 100644 index 00000000..30cc85ae --- /dev/null +++ b/2.x/chapter6-2/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + com.didispace + chapter6-2 + 1.0.0 + jar + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + + UTF-8 + 1.8 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-ldap + + + + com.unboundid + unboundid-ldapsdk + test + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/2.x/chapter6-2/src/main/java/com/didispace/chapter62/Chapter62Application.java b/2.x/chapter6-2/src/main/java/com/didispace/chapter62/Chapter62Application.java new file mode 100644 index 00000000..5baa9594 --- /dev/null +++ b/2.x/chapter6-2/src/main/java/com/didispace/chapter62/Chapter62Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter62; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter62Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter62Application.class, args); + } + +} diff --git a/2.x/chapter6-2/src/main/java/com/didispace/chapter62/Person.java b/2.x/chapter6-2/src/main/java/com/didispace/chapter62/Person.java new file mode 100644 index 00000000..f8a9f439 --- /dev/null +++ b/2.x/chapter6-2/src/main/java/com/didispace/chapter62/Person.java @@ -0,0 +1,22 @@ +package com.didispace.chapter62; + +import lombok.Data; +import org.springframework.ldap.odm.annotations.*; + +import javax.naming.Name; + +@Entry(base = "ou=people,dc=didispace,dc=com", objectClasses = "inetOrgPerson") +@Data +public class Person { + + @Id + private Name id; + @DnAttribute(value = "uid", index = 3) + private String uid; + @Attribute(name = "cn") + private String commonName; + @Attribute(name = "sn") + private String suerName; + private String userPassword; + +} diff --git a/2.x/chapter6-2/src/main/java/com/didispace/chapter62/PersonRepository.java b/2.x/chapter6-2/src/main/java/com/didispace/chapter62/PersonRepository.java new file mode 100644 index 00000000..53258324 --- /dev/null +++ b/2.x/chapter6-2/src/main/java/com/didispace/chapter62/PersonRepository.java @@ -0,0 +1,10 @@ +package com.didispace.chapter62; + +import org.springframework.data.repository.CrudRepository; + +import javax.naming.Name; + +public interface PersonRepository extends CrudRepository { + + +} \ No newline at end of file diff --git a/2.x/chapter6-2/src/main/resources/application.properties b/2.x/chapter6-2/src/main/resources/application.properties new file mode 100644 index 00000000..4b3fab0b --- /dev/null +++ b/2.x/chapter6-2/src/main/resources/application.properties @@ -0,0 +1,4 @@ +#spring.ldap.urls=ldap://localhost:1235 +#spring.ldap.base=dc=didispace,dc=com +#spring.ldap.username=didispace +#spring.ldap.password=123456 \ No newline at end of file diff --git a/2.x/chapter6-2/src/test/java/com/didispace/chapter62/ApplicationTests.java b/2.x/chapter6-2/src/test/java/com/didispace/chapter62/ApplicationTests.java new file mode 100644 index 00000000..955e680f --- /dev/null +++ b/2.x/chapter6-2/src/test/java/com/didispace/chapter62/ApplicationTests.java @@ -0,0 +1,41 @@ +package com.didispace.chapter62; + +import com.didispace.Person; +import com.didispace.PersonRepository; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ApplicationTests { + + @Autowired + private PersonRepository personRepository; + + @Test + public void findAll() throws Exception { + + personRepository.findAll().forEach(p -> { + System.out.println(p); + }); + + } + + @Test + public void save() throws Exception { + Person person = new Person(); + person.setUid("uid:1"); + person.setSuerName("AAA"); + person.setCommonName("aaa"); + person.setUserPassword("123456"); + personRepository.save(person); + + personRepository.findAll().forEach(p -> { + System.out.println(p); + }); + } + +} diff --git a/2.x/chapter6-2/src/test/resources/application.properties b/2.x/chapter6-2/src/test/resources/application.properties new file mode 100644 index 00000000..08bbb56b --- /dev/null +++ b/2.x/chapter6-2/src/test/resources/application.properties @@ -0,0 +1,3 @@ +spring.ldap.embedded.ldif=ldap-server.ldif +spring.ldap.embedded.base-dn=dc=didispace,dc=com + diff --git a/2.x/chapter6-2/src/test/resources/ldap-server.ldif b/2.x/chapter6-2/src/test/resources/ldap-server.ldif new file mode 100644 index 00000000..4eac0611 --- /dev/null +++ b/2.x/chapter6-2/src/test/resources/ldap-server.ldif @@ -0,0 +1,18 @@ +dn: dc=didispace,dc=com +objectClass: top +objectClass: domain + +dn: ou=people,dc=didispace,dc=com +objectclass: top +objectclass: organizationalUnit +ou: people + +dn: uid=ben,ou=people,dc=didispace,dc=com +objectclass: top +objectclass: person +objectclass: organizationalPerson +objectclass: inetOrgPerson +cn: didi +sn: zhaiyongchao +uid: didi +userPassword: {SHA}nFCebWjxfaLbHHG1Qk5UU4trbvQ= diff --git a/2.x/pom.xml b/2.x/pom.xml index 9b88b0d4..56af88a5 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -62,9 +62,9 @@ chapter6-1 - - - + chapter6-2 + + From 07bf68ae5ac0dbdaea5582e63aa57705adecf907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Fri, 18 Jun 2021 16:33:30 +0800 Subject: [PATCH 074/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8LDAP=E6=9D=A5?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=94=A8=E6=88=B7=E4=B8=8E=E7=BB=84=E7=BB=87?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter6-2/pom.xml | 6 +++ .../java/com/didispace/chapter62/Person.java | 2 +- .../src/main/resources/application.properties | 2 +- .../didispace/chapter62/ApplicationTests.java | 49 +++++++++---------- .../src/test/resources/application.properties | 2 +- .../src/test/resources/ldap-server.ldif | 2 + 6 files changed, 34 insertions(+), 29 deletions(-) diff --git a/2.x/chapter6-2/pom.xml b/2.x/chapter6-2/pom.xml index 30cc85ae..1cd64699 100644 --- a/2.x/chapter6-2/pom.xml +++ b/2.x/chapter6-2/pom.xml @@ -32,6 +32,12 @@ spring-boot-starter-data-ldap + + org.projectlombok + lombok + provided + + com.unboundid unboundid-ldapsdk diff --git a/2.x/chapter6-2/src/main/java/com/didispace/chapter62/Person.java b/2.x/chapter6-2/src/main/java/com/didispace/chapter62/Person.java index f8a9f439..cc078f67 100644 --- a/2.x/chapter6-2/src/main/java/com/didispace/chapter62/Person.java +++ b/2.x/chapter6-2/src/main/java/com/didispace/chapter62/Person.java @@ -16,7 +16,7 @@ public class Person { @Attribute(name = "cn") private String commonName; @Attribute(name = "sn") - private String suerName; + private String userName; private String userPassword; } diff --git a/2.x/chapter6-2/src/main/resources/application.properties b/2.x/chapter6-2/src/main/resources/application.properties index 4b3fab0b..d2726e89 100644 --- a/2.x/chapter6-2/src/main/resources/application.properties +++ b/2.x/chapter6-2/src/main/resources/application.properties @@ -1,4 +1,4 @@ #spring.ldap.urls=ldap://localhost:1235 #spring.ldap.base=dc=didispace,dc=com #spring.ldap.username=didispace -#spring.ldap.password=123456 \ No newline at end of file +#spring.ldap.password=123456 diff --git a/2.x/chapter6-2/src/test/java/com/didispace/chapter62/ApplicationTests.java b/2.x/chapter6-2/src/test/java/com/didispace/chapter62/ApplicationTests.java index 955e680f..b1e2a2fd 100644 --- a/2.x/chapter6-2/src/test/java/com/didispace/chapter62/ApplicationTests.java +++ b/2.x/chapter6-2/src/test/java/com/didispace/chapter62/ApplicationTests.java @@ -1,41 +1,38 @@ package com.didispace.chapter62; -import com.didispace.Person; -import com.didispace.PersonRepository; -import org.junit.Test; -import org.junit.runner.RunWith; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -@RunWith(SpringRunner.class) +@Slf4j @SpringBootTest public class ApplicationTests { - @Autowired - private PersonRepository personRepository; + @Autowired + private PersonRepository personRepository; - @Test - public void findAll() throws Exception { + @Test + public void findAll() { - personRepository.findAll().forEach(p -> { - System.out.println(p); - }); + personRepository.findAll().forEach(p -> { + System.out.println(p); + }); - } + } - @Test - public void save() throws Exception { - Person person = new Person(); - person.setUid("uid:1"); - person.setSuerName("AAA"); - person.setCommonName("aaa"); - person.setUserPassword("123456"); - personRepository.save(person); + @Test + public void save() { + Person person = new Person(); + person.setUid("uid:1"); + person.setUserName("AAA"); + person.setCommonName("aaa"); + person.setUserPassword("123456"); + personRepository.save(person); - personRepository.findAll().forEach(p -> { - System.out.println(p); - }); - } + personRepository.findAll().forEach(p -> { + System.out.println(p); + }); + } } diff --git a/2.x/chapter6-2/src/test/resources/application.properties b/2.x/chapter6-2/src/test/resources/application.properties index 08bbb56b..55e19357 100644 --- a/2.x/chapter6-2/src/test/resources/application.properties +++ b/2.x/chapter6-2/src/test/resources/application.properties @@ -1,3 +1,3 @@ -spring.ldap.embedded.ldif=ldap-server.ldif +spring.ldap.embedded.ldif=classpath:ldap-server.ldif spring.ldap.embedded.base-dn=dc=didispace,dc=com diff --git a/2.x/chapter6-2/src/test/resources/ldap-server.ldif b/2.x/chapter6-2/src/test/resources/ldap-server.ldif index 4eac0611..353a4939 100644 --- a/2.x/chapter6-2/src/test/resources/ldap-server.ldif +++ b/2.x/chapter6-2/src/test/resources/ldap-server.ldif @@ -1,6 +1,8 @@ dn: dc=didispace,dc=com objectClass: top objectClass: domain +objectclass: extensibleObject +dc: didispace dn: ou=people,dc=didispace,dc=com objectclass: top From 6ddbfc0ae87250703324d0587a3149da814f9943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Sat, 19 Jun 2021 15:07:15 +0800 Subject: [PATCH 075/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8Redis=E7=9A=84?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E8=AE=A2=E9=98=85=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 3 + 2.x/README_zh.md | 3 +- 2.x/chapter5-5/.gitignore | 29 +++++++++ 2.x/chapter5-5/pom.xml | 64 +++++++++++++++++++ .../chapter55/Chapter55Application.java | 61 ++++++++++++++++++ .../src/main/resources/application.properties | 7 ++ 2.x/pom.xml | 4 +- 7 files changed, 169 insertions(+), 2 deletions(-) create mode 100644 2.x/chapter5-5/.gitignore create mode 100644 2.x/chapter5-5/pom.xml create mode 100644 2.x/chapter5-5/src/main/java/com/didispace/chapter55/Chapter55Application.java create mode 100644 2.x/chapter5-5/src/main/resources/application.properties diff --git a/2.x/README.md b/2.x/README.md index c22d7d01..68e31e2d 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -105,10 +105,12 @@ - [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) - [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) - [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/) +- [Spring Boot 2.x基础教程:使用Redis的发布订阅功能](http://blog.didispace.com/spring-boot-learning-25-5-5/) **其他常见存储的使用** - [Spring Boot 2.x基础教程:使用MongoDB](http://blog.didispace.com/spring-boot-learning-24-6-1/) +- [Spring Boot 2.x基础教程:使用LDAP来管理用户与组织数据](http://blog.didispace.com/spring-boot-learning-24-6-2/) ### Web开发 @@ -144,6 +146,7 @@ - [Spring Boot 2.4.0 正式发布!全新的配置处理机制,拥抱云原生!](http://blog.didispace.com/spring-boot-2-4-0-ga/) - [Spring Boot 2.4.1 发布,修正大量2.4全新配置机制的Bug](http://blog.didispace.com/spring-boot-2-4-1-release/) - [Spring Boot 2.5.0 发布:支持Java16、Gradle 7、Datasource初始化调整](https://blog.didispace.com/spring-boot-2-5-0-release/) +- [Spring Boot 2.5.1 发布](https://blog.didispace.com/spring-boot-2-5-1-release/) ## 我的公众号 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 434e80a3..1a094b95 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -106,13 +106,13 @@ - [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) - [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) - [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/) +- [Spring Boot 2.x基础教程:使用Redis的发布订阅功能](http://blog.didispace.com/spring-boot-learning-25-5-5/) **其他常见存储的使用** - [Spring Boot 2.x基础教程:使用MongoDB](http://blog.didispace.com/spring-boot-learning-24-6-1/) - [Spring Boot 2.x基础教程:使用LDAP来管理用户与组织数据](http://blog.didispace.com/spring-boot-learning-24-6-2/) - ### Web开发 - [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) @@ -148,6 +148,7 @@ - [Spring Boot 2.4.0 正式发布!全新的配置处理机制,拥抱云原生!](http://blog.didispace.com/spring-boot-2-4-0-ga/) - [Spring Boot 2.4.1 发布,修正大量2.4全新配置机制的Bug](http://blog.didispace.com/spring-boot-2-4-1-release/) - [Spring Boot 2.5.0 发布:支持Java16、Gradle 7、Datasource初始化调整](https://blog.didispace.com/spring-boot-2-5-0-release/) +- [Spring Boot 2.5.1 发布](https://blog.didispace.com/spring-boot-2-5-1-release/) ## 推荐内容 diff --git a/2.x/chapter5-5/.gitignore b/2.x/chapter5-5/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter5-5/.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/2.x/chapter5-5/pom.xml b/2.x/chapter5-5/pom.xml new file mode 100644 index 00000000..6d630aed --- /dev/null +++ b/2.x/chapter5-5/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + com.didispace + chapter5-5 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.apache.commons + commons-pool2 + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter5-5/src/main/java/com/didispace/chapter55/Chapter55Application.java b/2.x/chapter5-5/src/main/java/com/didispace/chapter55/Chapter55Application.java new file mode 100644 index 00000000..8da3b8b0 --- /dev/null +++ b/2.x/chapter5-5/src/main/java/com/didispace/chapter55/Chapter55Application.java @@ -0,0 +1,61 @@ +package com.didispace.chapter55; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.nio.charset.StandardCharsets; + +@SpringBootApplication +public class Chapter55Application { + + private static String CHANNEL = "didispace"; + + public static void main(String[] args) { + SpringApplication.run(Chapter55Application.class, args); + } + + @RestController + static class RedisController { + + private RedisTemplate redisTemplate; + + public RedisController(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + @GetMapping("/publish") + public void publish(@RequestParam String message) { + // 发送消息 + redisTemplate.convertAndSend(CHANNEL, message); + } + + } + + @Slf4j + @Service + static class MessageSubscriber { + + public MessageSubscriber(RedisTemplate redisTemplate) { + RedisConnection redisConnection = redisTemplate.getConnectionFactory().getConnection(); + redisConnection.subscribe(new MessageListener() { + @Override + public void onMessage(Message message, byte[] bytes) { + // 收到消息的处理逻辑 + log.info("Receive message : " + message); + } + }, CHANNEL.getBytes(StandardCharsets.UTF_8)); + + } + + } + +} diff --git a/2.x/chapter5-5/src/main/resources/application.properties b/2.x/chapter5-5/src/main/resources/application.properties new file mode 100644 index 00000000..2992f608 --- /dev/null +++ b/2.x/chapter5-5/src/main/resources/application.properties @@ -0,0 +1,7 @@ +spring.redis.host=localhost +spring.redis.port=6379 +spring.redis.lettuce.pool.max-idle=8 +spring.redis.lettuce.pool.max-active=8 +spring.redis.lettuce.pool.max-wait=-1ms +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms diff --git a/2.x/pom.xml b/2.x/pom.xml index 56af88a5..0b23ac0b 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -58,7 +58,9 @@ chapter5-2 chapter5-3 chapter5-4 - + chapter5-5 + + chapter6-1 From 406922e2311a14762c668268353ce779da073072 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Tue, 13 Jul 2021 15:27:07 +0800 Subject: [PATCH 076/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8@Scheduled?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 4 ++ 2.x/README_zh.md | 4 ++ 2.x/chapter7-1/pom.xml | 49 +++++++++++++++++++ .../chapter71/Chapter71Application.java | 15 ++++++ .../didispace/chapter71/ScheduledTasks.java | 24 +++++++++ .../src/main/resources/application.properties | 0 2.x/pom.xml | 9 ++-- 7 files changed, 101 insertions(+), 4 deletions(-) create mode 100755 2.x/chapter7-1/pom.xml create mode 100755 2.x/chapter7-1/src/main/java/com/didispace/chapter71/Chapter71Application.java create mode 100644 2.x/chapter7-1/src/main/java/com/didispace/chapter71/ScheduledTasks.java create mode 100644 2.x/chapter7-1/src/main/resources/application.properties diff --git a/2.x/README.md b/2.x/README.md index 68e31e2d..0dc709b8 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -120,6 +120,10 @@ - [Spring Boot 2.x基础教程:实现多文件上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) - [Spring Boot 2.x基础教程:文件上传的单元测试怎么写](https://blog.didispace.com/spring-boot-learning-21-4-5/) +### 其他功能 + +- [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) + ### 常见问题 - [为什么加了@Transactional注解,事务没有回滚?](http://blog.didispace.com/transactional-not-rollback/) diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 1a094b95..24efde5c 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -121,6 +121,10 @@ - [Spring Boot 2.x基础教程:实现多文件上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) - [Spring Boot 2.x基础教程:文件上传的单元测试怎么写](https://blog.didispace.com/spring-boot-learning-21-4-5/) +### 其他功能 + +- [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) + ### 常见问题 - [为什么加了@Transactional注解,事务没有回滚?](http://blog.didispace.com/transactional-not-rollback/) diff --git a/2.x/chapter7-1/pom.xml b/2.x/chapter7-1/pom.xml new file mode 100755 index 00000000..45945209 --- /dev/null +++ b/2.x/chapter7-1/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + com.didispace + chapter7-1 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter7-1/src/main/java/com/didispace/chapter71/Chapter71Application.java b/2.x/chapter7-1/src/main/java/com/didispace/chapter71/Chapter71Application.java new file mode 100755 index 00000000..95fd0d2d --- /dev/null +++ b/2.x/chapter7-1/src/main/java/com/didispace/chapter71/Chapter71Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter71; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@EnableScheduling +@SpringBootApplication +public class Chapter71Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter71Application.class, args); + } + +} diff --git a/2.x/chapter7-1/src/main/java/com/didispace/chapter71/ScheduledTasks.java b/2.x/chapter7-1/src/main/java/com/didispace/chapter71/ScheduledTasks.java new file mode 100644 index 00000000..27f1d0db --- /dev/null +++ b/2.x/chapter7-1/src/main/java/com/didispace/chapter71/ScheduledTasks.java @@ -0,0 +1,24 @@ +package com.didispace.chapter71; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Slf4j +@Component +@AllArgsConstructor +public class ScheduledTasks { + + private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + + + @Scheduled(fixedRate = 5000) + public void reportCurrentTime() { + log.info("现在时间:" + dateFormat.format(new Date())); + } + +} \ No newline at end of file diff --git a/2.x/chapter7-1/src/main/resources/application.properties b/2.x/chapter7-1/src/main/resources/application.properties new file mode 100644 index 00000000..e69de29b diff --git a/2.x/pom.xml b/2.x/pom.xml index 0b23ac0b..79a206b6 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -26,7 +26,8 @@ chapter2-6 chapter2-7 chapter2-8 - + + chapter3-1 @@ -69,10 +70,10 @@ - + chapter7-1 - + + - From ec1c5bb36f83748142f1f1df09048c1e3131dc2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Tue, 20 Jul 2021 15:45:21 +0800 Subject: [PATCH 077/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8Elastic=20Job?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 3 +- 2.x/README_zh.md | 4 +- 2.x/chapter7-2/pom.xml | 50 +++++++++++++++++++ .../chapter72/Chapter72Application.java | 13 +++++ .../com/didispace/chapter72/MySimpleJob.java | 17 +++++++ .../src/main/resources/application.properties | 7 +++ 2.x/chapter7-3/pom.xml | 50 +++++++++++++++++++ .../chapter73/Chapter73Application.java | 13 +++++ .../didispace/chapter73/MyShardingJob.java | 27 ++++++++++ .../src/main/resources/application.properties | 9 ++++ 2.x/pom.xml | 7 +-- 11 files changed, 194 insertions(+), 6 deletions(-) create mode 100755 2.x/chapter7-2/pom.xml create mode 100755 2.x/chapter7-2/src/main/java/com/didispace/chapter72/Chapter72Application.java create mode 100644 2.x/chapter7-2/src/main/java/com/didispace/chapter72/MySimpleJob.java create mode 100644 2.x/chapter7-2/src/main/resources/application.properties create mode 100755 2.x/chapter7-3/pom.xml create mode 100755 2.x/chapter7-3/src/main/java/com/didispace/chapter73/Chapter73Application.java create mode 100644 2.x/chapter7-3/src/main/java/com/didispace/chapter73/MyShardingJob.java create mode 100644 2.x/chapter7-3/src/main/resources/application.properties diff --git a/2.x/README.md b/2.x/README.md index 0dc709b8..3586fbbe 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -120,9 +120,10 @@ - [Spring Boot 2.x基础教程:实现多文件上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) - [Spring Boot 2.x基础教程:文件上传的单元测试怎么写](https://blog.didispace.com/spring-boot-learning-21-4-5/) -### 其他功能 +### 任务管理 - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) +- [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) ### 常见问题 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 24efde5c..9023a7ac 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -121,9 +121,10 @@ - [Spring Boot 2.x基础教程:实现多文件上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) - [Spring Boot 2.x基础教程:文件上传的单元测试怎么写](https://blog.didispace.com/spring-boot-learning-21-4-5/) -### 其他功能 +### 任务管理 - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) +- [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) ### 常见问题 @@ -132,7 +133,6 @@ - [使用Java 8中LocalDate等时间日期类的问题解决](http://blog.didispace.com/Spring-Boot-And-Feign-Use-localdate/) - [Request header is too large 如何解决?](https://blog.didispace.com/request-header-is-too-large/) - ## 版本资讯 ### 1.x到2.x diff --git a/2.x/chapter7-2/pom.xml b/2.x/chapter7-2/pom.xml new file mode 100755 index 00000000..93028618 --- /dev/null +++ b/2.x/chapter7-2/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + com.didispace + chapter7-2 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.apache.shardingsphere.elasticjob + elasticjob-lite-spring-boot-starter + 3.0.0 + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter7-2/src/main/java/com/didispace/chapter72/Chapter72Application.java b/2.x/chapter7-2/src/main/java/com/didispace/chapter72/Chapter72Application.java new file mode 100755 index 00000000..236357d8 --- /dev/null +++ b/2.x/chapter7-2/src/main/java/com/didispace/chapter72/Chapter72Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter72; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter72Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter72Application.class, args); + } + +} diff --git a/2.x/chapter7-2/src/main/java/com/didispace/chapter72/MySimpleJob.java b/2.x/chapter7-2/src/main/java/com/didispace/chapter72/MySimpleJob.java new file mode 100644 index 00000000..242a8168 --- /dev/null +++ b/2.x/chapter7-2/src/main/java/com/didispace/chapter72/MySimpleJob.java @@ -0,0 +1,17 @@ +package com.didispace.chapter72; + +import lombok.extern.slf4j.Slf4j; +import org.apache.shardingsphere.elasticjob.api.ShardingContext; +import org.apache.shardingsphere.elasticjob.simple.job.SimpleJob; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class MySimpleJob implements SimpleJob { + + @Override + public void execute(ShardingContext context) { + log.info("MySimpleJob start : didispace.com {}", System.currentTimeMillis()); + } + +} \ No newline at end of file diff --git a/2.x/chapter7-2/src/main/resources/application.properties b/2.x/chapter7-2/src/main/resources/application.properties new file mode 100644 index 00000000..38bca408 --- /dev/null +++ b/2.x/chapter7-2/src/main/resources/application.properties @@ -0,0 +1,7 @@ + +elasticjob.reg-center.server-lists=localhost:2181 +elasticjob.reg-center.namespace=didispace + +elasticjob.jobs.my-simple-job.elastic-job-class=com.didispace.chapter72.MySimpleJob +elasticjob.jobs.my-simple-job.cron=0/5 * * * * ? +elasticjob.jobs.my-simple-job.sharding-total-count=1 diff --git a/2.x/chapter7-3/pom.xml b/2.x/chapter7-3/pom.xml new file mode 100755 index 00000000..55b3c184 --- /dev/null +++ b/2.x/chapter7-3/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + com.didispace + chapter7-3 + 0.0.1-SNAPSHOT + + + 1.8 + + + + + org.apache.shardingsphere.elasticjob + elasticjob-lite-spring-boot-starter + 3.0.0 + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter7-3/src/main/java/com/didispace/chapter73/Chapter73Application.java b/2.x/chapter7-3/src/main/java/com/didispace/chapter73/Chapter73Application.java new file mode 100755 index 00000000..5c62c3e6 --- /dev/null +++ b/2.x/chapter7-3/src/main/java/com/didispace/chapter73/Chapter73Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter73; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter73Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter73Application.class, args); + } + +} diff --git a/2.x/chapter7-3/src/main/java/com/didispace/chapter73/MyShardingJob.java b/2.x/chapter7-3/src/main/java/com/didispace/chapter73/MyShardingJob.java new file mode 100644 index 00000000..039eb5b4 --- /dev/null +++ b/2.x/chapter7-3/src/main/java/com/didispace/chapter73/MyShardingJob.java @@ -0,0 +1,27 @@ +package com.didispace.chapter73; + +import lombok.extern.slf4j.Slf4j; +import org.apache.shardingsphere.elasticjob.api.ShardingContext; +import org.apache.shardingsphere.elasticjob.simple.job.SimpleJob; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class MyShardingJob implements SimpleJob { + + @Override + public void execute(ShardingContext context) { + switch (context.getShardingItem()) { + case 0: + log.info("do something by sharding item 0"); + break; + case 1: + log.info("do something by sharding item 1"); + break; + case 2: + log.info("do something by sharding item 2"); + break; + } + } + +} \ No newline at end of file diff --git a/2.x/chapter7-3/src/main/resources/application.properties b/2.x/chapter7-3/src/main/resources/application.properties new file mode 100644 index 00000000..92517831 --- /dev/null +++ b/2.x/chapter7-3/src/main/resources/application.properties @@ -0,0 +1,9 @@ +elasticjob.reg-center.server-lists=localhost:2181 +elasticjob.reg-center.namespace=didispace + + +elasticjob.jobs.my-sharding-job.elastic-job-class=com.didispace.chapter73.MyShardingJob +elasticjob.jobs.my-sharding-job.cron=0/5 * * * * ? +elasticjob.jobs.my-sharding-job.sharding-total-count=3 +elasticjob.jobs.my-elastic-job.sharding-item-parameters=0=BJ,1=SH,2=GZ + diff --git a/2.x/pom.xml b/2.x/pom.xml index 79a206b6..9da32871 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -71,9 +71,10 @@ chapter7-1 - - - + chapter7-2 + + + From aa4a2881f0b5c28e8b9226f3b0b9800c6611adef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Tue, 20 Jul 2021 15:48:17 +0800 Subject: [PATCH 078/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8Elastic=20Job?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter2-9/pom.xml | 75 +++++++++++++++++++ .../chapter29/Chapter29Application.java | 18 +++++ .../java/com/didispace/chapter29/User.java | 26 +++++++ .../didispace/chapter29/UserController.java | 27 +++++++ .../src/main/resources/application.properties | 0 5 files changed, 146 insertions(+) create mode 100644 2.x/chapter2-9/pom.xml create mode 100755 2.x/chapter2-9/src/main/java/com/didispace/chapter29/Chapter29Application.java create mode 100755 2.x/chapter2-9/src/main/java/com/didispace/chapter29/User.java create mode 100755 2.x/chapter2-9/src/main/java/com/didispace/chapter29/UserController.java create mode 100755 2.x/chapter2-9/src/main/resources/application.properties diff --git a/2.x/chapter2-9/pom.xml b/2.x/chapter2-9/pom.xml new file mode 100644 index 00000000..9f670750 --- /dev/null +++ b/2.x/chapter2-9/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + com.didispace + chapter2-9 + 1.0.0 + jar + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.experimental + graphql-spring-boot-starter + 1.0.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + + org.projectlombok + lombok + provided + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + spring-snapshots + https://repo.spring.io/snapshot + true + + + spring-milestones + https://repo.spring.io/milestone + + + + \ No newline at end of file diff --git a/2.x/chapter2-9/src/main/java/com/didispace/chapter29/Chapter29Application.java b/2.x/chapter2-9/src/main/java/com/didispace/chapter29/Chapter29Application.java new file mode 100755 index 00000000..c72319b2 --- /dev/null +++ b/2.x/chapter2-9/src/main/java/com/didispace/chapter29/Chapter29Application.java @@ -0,0 +1,18 @@ +package com.didispace.chapter29; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author 程序猿DD + * @version 1.0.0 + * @blog http://blog.didispace.com + */ +@SpringBootApplication +public class Chapter29Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter29Application.class, args); + } + +} diff --git a/2.x/chapter2-9/src/main/java/com/didispace/chapter29/User.java b/2.x/chapter2-9/src/main/java/com/didispace/chapter29/User.java new file mode 100755 index 00000000..40b2725f --- /dev/null +++ b/2.x/chapter2-9/src/main/java/com/didispace/chapter29/User.java @@ -0,0 +1,26 @@ +package com.didispace.chapter29; + + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author 程序猿DD + * @version 1.0.0 + * @blog http://blog.didispace.com + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@JacksonXmlRootElement(localName = "User") +public class User { + + @JacksonXmlProperty(localName = "name") + private String name; + @JacksonXmlProperty(localName = "age") + private Integer age; + +} diff --git a/2.x/chapter2-9/src/main/java/com/didispace/chapter29/UserController.java b/2.x/chapter2-9/src/main/java/com/didispace/chapter29/UserController.java new file mode 100755 index 00000000..d7711fa5 --- /dev/null +++ b/2.x/chapter2-9/src/main/java/com/didispace/chapter29/UserController.java @@ -0,0 +1,27 @@ +package com.didispace.chapter29; + +import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +/** + * + * @author 程序猿DD + * @version 1.0.0 + * @blog http://blog.didispace.com + * + */ +@Controller +public class UserController { + + @PostMapping(value = "/user", + consumes = MediaType.APPLICATION_XML_VALUE, + produces = MediaType.APPLICATION_XML_VALUE) + @ResponseBody + public User create(@RequestBody User user) { + user.setName("didispace.com : " + user.getName()); + user.setAge(user.getAge() + 100); + return user; + } + +} \ No newline at end of file diff --git a/2.x/chapter2-9/src/main/resources/application.properties b/2.x/chapter2-9/src/main/resources/application.properties new file mode 100755 index 00000000..e69de29b From 1fe9c48c771fb0564d0d5b5aa533f979a45f1c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 21 Jul 2021 17:53:44 +0800 Subject: [PATCH 079/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8Elastic=20Job?= =?UTF-8?q?=E7=9A=84=E5=88=86=E7=89=87=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/didispace/chapter73/MyShardingJob.java | 7 ++++--- 2.x/chapter7-3/src/main/resources/application.properties | 3 --- 2.x/pom.xml | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/2.x/chapter7-3/src/main/java/com/didispace/chapter73/MyShardingJob.java b/2.x/chapter7-3/src/main/java/com/didispace/chapter73/MyShardingJob.java index 039eb5b4..d1f535ae 100644 --- a/2.x/chapter7-3/src/main/java/com/didispace/chapter73/MyShardingJob.java +++ b/2.x/chapter7-3/src/main/java/com/didispace/chapter73/MyShardingJob.java @@ -11,15 +11,16 @@ public class MyShardingJob implements SimpleJob { @Override public void execute(ShardingContext context) { + // sharding-total-count=3,所以任务被分为三个分片 switch (context.getShardingItem()) { case 0: - log.info("do something by sharding item 0"); + log.info("分片1:执行任务"); break; case 1: - log.info("do something by sharding item 1"); + log.info("分片2:执行任务"); break; case 2: - log.info("do something by sharding item 2"); + log.info("分片3:执行任务"); break; } } diff --git a/2.x/chapter7-3/src/main/resources/application.properties b/2.x/chapter7-3/src/main/resources/application.properties index 92517831..cb7d3cd8 100644 --- a/2.x/chapter7-3/src/main/resources/application.properties +++ b/2.x/chapter7-3/src/main/resources/application.properties @@ -1,9 +1,6 @@ elasticjob.reg-center.server-lists=localhost:2181 elasticjob.reg-center.namespace=didispace - elasticjob.jobs.my-sharding-job.elastic-job-class=com.didispace.chapter73.MyShardingJob elasticjob.jobs.my-sharding-job.cron=0/5 * * * * ? elasticjob.jobs.my-sharding-job.sharding-total-count=3 -elasticjob.jobs.my-elastic-job.sharding-item-parameters=0=BJ,1=SH,2=GZ - diff --git a/2.x/pom.xml b/2.x/pom.xml index 9da32871..37415270 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -72,7 +72,7 @@ chapter7-1 chapter7-2 - + chapter7-3 From 118290f711cca392e19296a3ec7987aa544c73ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 21 Jul 2021 17:56:07 +0800 Subject: [PATCH 080/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8Elastic=20Job?= =?UTF-8?q?=E7=9A=84=E5=88=86=E7=89=87=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 2 ++ 2.x/README_zh.md | 1 + 2 files changed, 3 insertions(+) diff --git a/2.x/README.md b/2.x/README.md index 3586fbbe..2f79e3b5 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -124,6 +124,8 @@ - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) - [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) +- [Spring Boot 2.x基础教程:使用Elastic Job的分片配置](https://blog.didispace.com/spring-boot-learning-2-7-3) + ### 常见问题 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 9023a7ac..2a57f5ac 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -125,6 +125,7 @@ - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) - [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) +- [Spring Boot 2.x基础教程:使用Elastic Job的分片配置](https://blog.didispace.com/spring-boot-learning-2-7-3) ### 常见问题 From 44052ed3a86bc4bd8f7c7c5b2720f80f6a212cd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:26:40 +0800 Subject: [PATCH 081/160] =?UTF-8?q?=E6=9E=84=E5=BB=BARESTful=20API?= =?UTF-8?q?=E4=B8=8E=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter2-1/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter2-1/pom.xml b/2.x/chapter2-1/pom.xml index 8c292e60..3b306388 100644 --- a/2.x/chapter2-1/pom.xml +++ b/2.x/chapter2-1/pom.xml @@ -14,7 +14,7 @@ chapter2-1 0.0.1-SNAPSHOT chapter2-1 - Demo project for Spring Boot + 构建RESTful API与单元测试 1.8 From f745d84a37d904082900112a7d303e1a98d61996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:27:03 +0800 Subject: [PATCH 082/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8Swagger2=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E5=BC=BA=E5=A4=A7=E7=9A=84API=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter2-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter2-2/pom.xml b/2.x/chapter2-2/pom.xml index aa373bc4..7d31c5eb 100644 --- a/2.x/chapter2-2/pom.xml +++ b/2.x/chapter2-2/pom.xml @@ -14,7 +14,7 @@ chapter2-2 0.0.1-SNAPSHOT chapter2-2 - Demo project for Spring Boot + 使用Swagger2构建强大的API文档 1.8 From 45743a4cbbec67a2f92c2ae6931d6fb0b8b9f92c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:27:36 +0800 Subject: [PATCH 083/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8JSR-303=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E8=AF=B7=E6=B1=82=E5=8F=82=E6=95=B0=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter2-3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter2-3/pom.xml b/2.x/chapter2-3/pom.xml index 284c9d0d..da056f65 100644 --- a/2.x/chapter2-3/pom.xml +++ b/2.x/chapter2-3/pom.xml @@ -14,7 +14,7 @@ chapter2-3 0.0.1-SNAPSHOT chapter2-3 - Demo project for Spring Boot + 使用JSR-303实现请求参数校验 1.8 From fa96338a6c0ae5883efc64a369311f2e55e405f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:30:11 +0800 Subject: [PATCH 084/160] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=85=83=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E5=BA=94=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter1-4/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter1-4/pom.xml b/2.x/chapter1-4/pom.xml index e64ae735..8c5539f1 100644 --- a/2.x/chapter1-4/pom.xml +++ b/2.x/chapter1-4/pom.xml @@ -12,7 +12,7 @@ chapter1-4 0.0.1-SNAPSHOT chapter1-1 - Demo project for Spring Boot + 配置元数据的应用 1.8 From 1611c4cc6cddf9625bab84da54d3dd56adcf6e38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:30:32 +0800 Subject: [PATCH 085/160] =?UTF-8?q?2.4=E7=89=88=E6=9C=AC=E5=89=8D=E5=90=8E?= =?UTF-8?q?=E7=9A=84=E9=85=8D=E7=BD=AE=E5=88=86=E7=BB=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter1-3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter1-3/pom.xml b/2.x/chapter1-3/pom.xml index 75bb4754..93b6ec3a 100644 --- a/2.x/chapter1-3/pom.xml +++ b/2.x/chapter1-3/pom.xml @@ -12,7 +12,7 @@ chapter1-3 0.0.1-SNAPSHOT chapter1-3 - Demo project for Spring Boot + 2.4版本前后的配置分组配置 1.8 From cbb4892377bfe8686df13df806cbd7b32fe7c202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:30:57 +0800 Subject: [PATCH 086/160] =?UTF-8?q?2.4=E7=89=88=E6=9C=AC=E5=89=8D=E5=90=8E?= =?UTF-8?q?=E7=9A=84=E5=A4=9A=E7=8E=AF=E5=A2=83=E9=85=8D=E7=BD=AE=E4=B8=8E?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=BF=80=E6=B4=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter1-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter1-2/pom.xml b/2.x/chapter1-2/pom.xml index 3dd49659..4bee1018 100644 --- a/2.x/chapter1-2/pom.xml +++ b/2.x/chapter1-2/pom.xml @@ -12,7 +12,7 @@ chapter1-2 0.0.1-SNAPSHOT chapter1-2 - Demo project for Spring Boot + 2.4版本前后的多环境配置与配置激活 1.8 From b0e82aebdea1a4f62c61ad54a5eaef761730c3eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:31:14 +0800 Subject: [PATCH 087/160] =?UTF-8?q?=E5=BF=AB=E9=80=9F=E5=85=A5=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter1-1/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter1-1/pom.xml b/2.x/chapter1-1/pom.xml index d849128d..d4e872a6 100644 --- a/2.x/chapter1-1/pom.xml +++ b/2.x/chapter1-1/pom.xml @@ -12,7 +12,7 @@ chapter1-1 0.0.1-SNAPSHOT chapter1-1 - Demo project for Spring Boot + 快速入门 1.8 From a52c050aacf436c06cb270b99652d9940321aa8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:31:40 +0800 Subject: [PATCH 088/160] =?UTF-8?q?Swagger=E6=8E=A5=E5=8F=A3=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E4=B8=8E=E5=90=84=E5=85=83=E7=B4=A0=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E8=AF=A6=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter2-4/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter2-4/pom.xml b/2.x/chapter2-4/pom.xml index 8dcad73d..844ae4d1 100644 --- a/2.x/chapter2-4/pom.xml +++ b/2.x/chapter2-4/pom.xml @@ -14,7 +14,7 @@ chapter2-4 0.0.1-SNAPSHOT chapter2-4 - Demo project for Spring Boot + Swagger接口分类与各元素排序问题详解 1.8 From 6ac4845663c514992499e445b867a9d583f86bef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:31:54 +0800 Subject: [PATCH 089/160] =?UTF-8?q?Swagger=E9=9D=99=E6=80=81=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E7=9A=84=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter2-5/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter2-5/pom.xml b/2.x/chapter2-5/pom.xml index 9ffaafe8..2b81ca3b 100644 --- a/2.x/chapter2-5/pom.xml +++ b/2.x/chapter2-5/pom.xml @@ -14,7 +14,7 @@ chapter2-5 0.0.1-SNAPSHOT chapter2-5 - Demo project for Spring Boot + Swagger静态文档的生成 1.8 From 6c797ffc846cbae3791ff367e1201be5bd2c82ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:32:19 +0800 Subject: [PATCH 090/160] =?UTF-8?q?=E6=89=BE=E5=9B=9E=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=B8=AD=E7=9A=84=E8=AF=B7=E6=B1=82=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter2-6/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter2-6/pom.xml b/2.x/chapter2-6/pom.xml index 09ba9399..f4252540 100644 --- a/2.x/chapter2-6/pom.xml +++ b/2.x/chapter2-6/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter2-6 0.0.1-SNAPSHOT + 找回启动日志中的请求路径列表 1.8 From cf654dcbd24596c9d8da6e37aff1b2d1e0fae185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:32:43 +0800 Subject: [PATCH 091/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8SpringFox3=E7=94=9F?= =?UTF-8?q?=E6=88=90Swagger=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter2-7/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter2-7/pom.xml b/2.x/chapter2-7/pom.xml index 882a8176..285eeeea 100644 --- a/2.x/chapter2-7/pom.xml +++ b/2.x/chapter2-7/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter2-7 0.0.1-SNAPSHOT + 使用SpringFox3生成Swagger文档 1.8 From 7e55b34ff2615be8eb18492eb9511972a04d9b84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:33:17 +0800 Subject: [PATCH 092/160] =?UTF-8?q?=E5=A6=82=E4=BD=95=E6=89=A9=E5=B1=95XML?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E7=9A=84=E8=AF=B7=E6=B1=82=E5=92=8C=E5=93=8D?= =?UTF-8?q?=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter2-8/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/2.x/chapter2-8/pom.xml b/2.x/chapter2-8/pom.xml index e2746409..86a98950 100644 --- a/2.x/chapter2-8/pom.xml +++ b/2.x/chapter2-8/pom.xml @@ -4,9 +4,10 @@ 4.0.0 com.didispace - Chapter2-8 + chapter2-8 1.0.0 jar + 如何扩展XML格式的请求和响应 org.springframework.boot From bd19eb27caaffd1d6f460035d1ad7680c57f363a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:33:43 +0800 Subject: [PATCH 093/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8JdbcTemplate=E8=AE=BF?= =?UTF-8?q?=E9=97=AEMySQL=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-1/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter3-1/pom.xml b/2.x/chapter3-1/pom.xml index 4621591e..e70062b4 100644 --- a/2.x/chapter3-1/pom.xml +++ b/2.x/chapter3-1/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter3-1 0.0.1-SNAPSHOT + 使用JdbcTemplate访问MySQL数据库 1.8 From ee86666712cd235f52f33ff15502a1a5a168201f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:34:00 +0800 Subject: [PATCH 094/160] =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90Hikari=E7=9A=84=E9=85=8D=E7=BD=AE=E8=AF=A6=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-2/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter3-2/pom.xml b/2.x/chapter3-2/pom.xml index 2de383a2..d3a5f35d 100644 --- a/2.x/chapter3-2/pom.xml +++ b/2.x/chapter3-2/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter3-2 0.0.1-SNAPSHOT + 默认数据源Hikari的配置详解 1.8 From aada619881e7572faa52d7208bcb3de60871a057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:34:17 +0800 Subject: [PATCH 095/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=9B=BD=E4=BA=A7?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E8=BF=9E=E6=8E=A5=E6=B1=A0Druid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-3/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter3-3/pom.xml b/2.x/chapter3-3/pom.xml index c83eddc6..63a0dbe3 100644 --- a/2.x/chapter3-3/pom.xml +++ b/2.x/chapter3-3/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter3-3 0.0.1-SNAPSHOT + 使用国产数据库连接池Druid 1.8 From dcdbce71bfa2c386108a5b66daa84067e3437b1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:34:33 +0800 Subject: [PATCH 096/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8Spring=20Data=20JPA?= =?UTF-8?q?=E8=AE=BF=E9=97=AEMySQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-4/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter3-4/pom.xml b/2.x/chapter3-4/pom.xml index 602beb6d..d529c02b 100644 --- a/2.x/chapter3-4/pom.xml +++ b/2.x/chapter3-4/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter3-4 0.0.1-SNAPSHOT + 使用Spring Data JPA访问MySQL 1.8 From bc1798ec1d95430d738c252a4ad6fe8b28f4d443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:35:23 +0800 Subject: [PATCH 097/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8MyBatis=E8=AE=BF?= =?UTF-8?q?=E9=97=AEMySQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-5/pom.xml | 1 + 2.x/pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/2.x/chapter3-5/pom.xml b/2.x/chapter3-5/pom.xml index 2cb4f499..43bfeb2a 100644 --- a/2.x/chapter3-5/pom.xml +++ b/2.x/chapter3-5/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter3-5 0.0.1-SNAPSHOT + 使用MyBatis访问MySQL 1.8 diff --git a/2.x/pom.xml b/2.x/pom.xml index 37415270..d367e897 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -34,8 +34,8 @@ chapter3-2 chapter3-3 chapter3-4 - chapter3-5 - chapter3-6 + chapter3-5 + chapter3-6 chapter3-7 chapter3-8 chapter3-9 From 4e3ec310d277a25c998d4502d153aa1e00cecbec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:35:46 +0800 Subject: [PATCH 098/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8MyBatis=EF=BC=88xml?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=B9=E5=BC=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-6/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter3-6/pom.xml b/2.x/chapter3-6/pom.xml index 2f515975..97869305 100644 --- a/2.x/chapter3-6/pom.xml +++ b/2.x/chapter3-6/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter3-6 0.0.1-SNAPSHOT + 使用MyBatis(xml配置方式) 1.8 From 401b9e6997510cacc83704d3604992a01f9cd0c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:36:03 +0800 Subject: [PATCH 099/160] =?UTF-8?q?JdbcTemplate=E7=9A=84=E5=A4=9A=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-7/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter3-7/pom.xml b/2.x/chapter3-7/pom.xml index f8314a33..589d40ec 100644 --- a/2.x/chapter3-7/pom.xml +++ b/2.x/chapter3-7/pom.xml @@ -13,7 +13,7 @@ com.didispace chapter3-7 0.0.1-SNAPSHOT - 使用JDBCTemplate的多数据源配置 + JdbcTemplate的多数据源配置 1.8 From 9643954ba203c99b2d691ec2d7690a195fa7ba01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:36:17 +0800 Subject: [PATCH 100/160] =?UTF-8?q?Spring=20Data=20JPA=E7=9A=84=E5=A4=9A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-8/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter3-8/pom.xml b/2.x/chapter3-8/pom.xml index cd677906..fcb9d03a 100644 --- a/2.x/chapter3-8/pom.xml +++ b/2.x/chapter3-8/pom.xml @@ -13,7 +13,7 @@ com.didispace chapter3-8 0.0.1-SNAPSHOT - 使用spring-data-jpa的多数据源配置 + Spring Data JPA的多数据源配置 1.8 From 3cf14689668c5a3a9fbae2f04bc812b8e993eb9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:36:33 +0800 Subject: [PATCH 101/160] =?UTF-8?q?MyBatis=E7=9A=84=E5=A4=9A=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-9/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter3-9/pom.xml b/2.x/chapter3-9/pom.xml index f8572620..c8f731ef 100644 --- a/2.x/chapter3-9/pom.xml +++ b/2.x/chapter3-9/pom.xml @@ -13,7 +13,7 @@ com.didispace chapter3-9 0.0.1-SNAPSHOT - 使用MyBatis的多数据源配置 + MyBatis的多数据源配置 1.8 From 2533d8e1feb043df5c4fa1153f196d511c875036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:36:52 +0800 Subject: [PATCH 102/160] =?UTF-8?q?=E4=BA=8B=E5=8A=A1=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=85=A5=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-10/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter3-10/pom.xml b/2.x/chapter3-10/pom.xml index 9b2abc07..72162203 100644 --- a/2.x/chapter3-10/pom.xml +++ b/2.x/chapter3-10/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter3-10 0.0.1-SNAPSHOT + 事务管理入门 1.8 From f3ee045c01c9e44e0631377e2d5d646275bd1411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:37:08 +0800 Subject: [PATCH 103/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8Flyway=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=95=B0=E6=8D=AE=E5=BA=93=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-11/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter3-11/pom.xml b/2.x/chapter3-11/pom.xml index ca51dc20..c9692e8d 100644 --- a/2.x/chapter3-11/pom.xml +++ b/2.x/chapter3-11/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter3-11 0.0.1-SNAPSHOT + 使用Flyway管理数据库版本 1.8 From d2771e64788e9344ef864a0066b960a41347d9e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:37:47 +0800 Subject: [PATCH 104/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8JTA=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=A4=9A=E6=95=B0=E6=8D=AE=E6=BA=90=E7=9A=84=E4=BA=8B=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-12/pom.xml | 1 + 2.x/pom.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/2.x/chapter3-12/pom.xml b/2.x/chapter3-12/pom.xml index f097b682..a61772d3 100644 --- a/2.x/chapter3-12/pom.xml +++ b/2.x/chapter3-12/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter3-12 0.0.1-SNAPSHOT + 使用JTA实现多数据源的事务 1.8 diff --git a/2.x/pom.xml b/2.x/pom.xml index d367e897..06cdc815 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -41,7 +41,7 @@ chapter3-9 chapter3-10 chapter3-11 - chapter3-12 + chapter3-12 chapter3-13 From e1769e09626a822d1c9c4fefe817a1267192c7f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:38:02 +0800 Subject: [PATCH 105/160] =?UTF-8?q?2.5=E7=89=88=E6=9C=AC=E4=B9=8B=E5=90=8E?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E8=84=9A=E6=9C=AC=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter3-13/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter3-13/pom.xml b/2.x/chapter3-13/pom.xml index 8fecff2e..de7746d3 100644 --- a/2.x/chapter3-13/pom.xml +++ b/2.x/chapter3-13/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter3-13 0.0.1-SNAPSHOT + 2.5版本之后的数据脚本初始化 1.8 From bfcfea35889896b50c5b50681ce8d4d77014278c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:38:26 +0800 Subject: [PATCH 106/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20Thymeleaf=E5=BC=80?= =?UTF-8?q?=E5=8F=91Web=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter4-1/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter4-1/pom.xml b/2.x/chapter4-1/pom.xml index e8191b85..07c54958 100644 --- a/2.x/chapter4-1/pom.xml +++ b/2.x/chapter4-1/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter4-1 0.0.1-SNAPSHOT + 使用 Thymeleaf开发Web页面 1.8 From b91099d8d2f607e7fd0e97ba9ab947b32234ec8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:38:49 +0800 Subject: [PATCH 107/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20ECharts=20?= =?UTF-8?q?=E7=BB=98=E5=88=B6=E6=8A=98=E7=BA=BF=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter4-2/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter4-2/pom.xml b/2.x/chapter4-2/pom.xml index d6022db9..26b9d0e6 100644 --- a/2.x/chapter4-2/pom.xml +++ b/2.x/chapter4-2/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter4-2 0.0.1-SNAPSHOT + 使用 ECharts 绘制折线图 1.8 From fda096905e4a46356bc8927109aed34939dbeeb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:39:09 +0800 Subject: [PATCH 108/160] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter4-3/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter4-3/pom.xml b/2.x/chapter4-3/pom.xml index 47dc30ce..21238608 100644 --- a/2.x/chapter4-3/pom.xml +++ b/2.x/chapter4-3/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter4-3 0.0.1-SNAPSHOT + 文件上传 1.8 From ccdaa070b295bd66789aa8a3b56de6060c8933a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:39:25 +0800 Subject: [PATCH 109/160] =?UTF-8?q?=E5=A4=9A=E6=96=87=E4=BB=B6=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter4-4/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter4-4/pom.xml b/2.x/chapter4-4/pom.xml index d575ab1d..49da68de 100644 --- a/2.x/chapter4-4/pom.xml +++ b/2.x/chapter4-4/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter4-4 0.0.1-SNAPSHOT + 多文件上传 1.8 From 559e12cb4e7063015c650660e745cfd32b968dfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:40:36 +0800 Subject: [PATCH 110/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=BF=9B=E7=A8=8B?= =?UTF-8?q?=E5=86=85=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter5-1/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter5-1/pom.xml b/2.x/chapter5-1/pom.xml index 2af64776..19540eff 100644 --- a/2.x/chapter5-1/pom.xml +++ b/2.x/chapter5-1/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter5-1 0.0.1-SNAPSHOT + 使用进程内缓存 1.8 From fa21d0e9e7d661dad5a680a3d8931f6c4dd768c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:40:50 +0800 Subject: [PATCH 111/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=BF=9B=E7=A8=8B?= =?UTF-8?q?=E5=86=85=E7=BC=93=E5=AD=98=20EhCache?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter5-2/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter5-2/pom.xml b/2.x/chapter5-2/pom.xml index bb82477e..affc2e9c 100644 --- a/2.x/chapter5-2/pom.xml +++ b/2.x/chapter5-2/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter5-2 0.0.1-SNAPSHOT + 使用进程内缓存 EhCache 1.8 From 593b19e6fb24160f2cc270563f986bce2f972588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:41:02 +0800 Subject: [PATCH 112/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8EhCache=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E9=9B=86=E7=BE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter5-3/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter5-3/pom.xml b/2.x/chapter5-3/pom.xml index c0bb21fd..5c729543 100644 --- a/2.x/chapter5-3/pom.xml +++ b/2.x/chapter5-3/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter5-3 0.0.1-SNAPSHOT + 使用EhCache缓存集群 1.8 From 5cd65480f7c2b420b1ca77ddd21c4f1330194b0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:41:24 +0800 Subject: [PATCH 113/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E9=9B=86=E4=B8=AD?= =?UTF-8?q?=E5=BC=8F=E7=BC=93=E5=AD=98Redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter5-4/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter5-4/pom.xml b/2.x/chapter5-4/pom.xml index c33d2854..1f4de65e 100644 --- a/2.x/chapter5-4/pom.xml +++ b/2.x/chapter5-4/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter5-4 0.0.1-SNAPSHOT + 使用集中式缓存Redis 1.8 From 9dfade97455f9729652e37b925c035a27ca8b6c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:41:40 +0800 Subject: [PATCH 114/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8Redis=E7=9A=84?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E8=AE=A2=E9=98=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter5-5/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter5-5/pom.xml b/2.x/chapter5-5/pom.xml index 6d630aed..dc1d2874 100644 --- a/2.x/chapter5-5/pom.xml +++ b/2.x/chapter5-5/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter5-5 0.0.1-SNAPSHOT + 使用Redis的发布订阅 1.8 From 966809163794ab143cfe492af9d86f05e8548dbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:42:02 +0800 Subject: [PATCH 115/160] =?UTF-8?q?=20=E4=BD=BF=E7=94=A8MongoDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter6-1/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter6-1/pom.xml b/2.x/chapter6-1/pom.xml index 7c21c138..10a0116e 100755 --- a/2.x/chapter6-1/pom.xml +++ b/2.x/chapter6-1/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter6-1 0.0.1-SNAPSHOT + 使用MongoDB 1.8 From 9ab2bd5fc1975ecf6da5d3f37e6940ae08d62a32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:42:18 +0800 Subject: [PATCH 116/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=BD=BB=E9=87=8F?= =?UTF-8?q?=E7=BA=A7=E6=A0=91=E7=8A=B6=E5=AD=98=E5=82=A8=20LDAP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter6-2/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter6-2/pom.xml b/2.x/chapter6-2/pom.xml index 1cd64699..dc1b63bd 100644 --- a/2.x/chapter6-2/pom.xml +++ b/2.x/chapter6-2/pom.xml @@ -7,6 +7,7 @@ chapter6-2 1.0.0 jar + 使用轻量级树状存储 LDAP org.springframework.boot From 8b382804c89f98a516789baac983b268a5eac81e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:42:34 +0800 Subject: [PATCH 117/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8@Scheduled=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter7-1/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter7-1/pom.xml b/2.x/chapter7-1/pom.xml index 45945209..fc9142ad 100755 --- a/2.x/chapter7-1/pom.xml +++ b/2.x/chapter7-1/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter7-1 0.0.1-SNAPSHOT + 使用@Scheduled实现定时任务 1.8 From 2823ce127613d3d49b23b842defc52cd2c4b663c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:42:51 +0800 Subject: [PATCH 118/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8Elastic=20Job?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter7-2/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter7-2/pom.xml b/2.x/chapter7-2/pom.xml index 93028618..e1987da5 100755 --- a/2.x/chapter7-2/pom.xml +++ b/2.x/chapter7-2/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter7-2 0.0.1-SNAPSHOT + 使用Elastic Job实现定时任务 1.8 From 648b6d8eb7e4af09f2d1ed28c2d686f508c5ca25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:43:03 +0800 Subject: [PATCH 119/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8Elastic=20Job?= =?UTF-8?q?=E7=9A=84=E5=88=86=E7=89=87=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter7-3/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/2.x/chapter7-3/pom.xml b/2.x/chapter7-3/pom.xml index 55b3c184..55d4ff9f 100755 --- a/2.x/chapter7-3/pom.xml +++ b/2.x/chapter7-3/pom.xml @@ -13,6 +13,7 @@ com.didispace chapter7-3 0.0.1-SNAPSHOT + 使用Elastic Job的分片配置 1.8 From 5f33cb5d0c4c0c37970d92f7a5092c511297a05f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:44:37 +0800 Subject: [PATCH 120/160] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 79 +++++++++++++++++++++++---------------------- 2.x/README_zh.md | 83 +++++++++++++++++++++++------------------------- 2 files changed, 79 insertions(+), 83 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index 2f79e3b5..a6b40a1e 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -12,46 +12,6 @@ 2. 点个`Star`并`Follow`我 3. 把该仓库分享给更多的朋友 -## 特别赞助商 - - - - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - - -
- -> 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` - ## 教程目录(2.x版本) 连载中...Star关注支持一下,随时获得更新信息! @@ -159,3 +119,42 @@ +## 特别赞助商 + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + +
+ +> 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` \ No newline at end of file diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 2a57f5ac..d5e8d2b2 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -13,46 +13,6 @@ > **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
-## 特别赞助商 - - - - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - - -
- -> 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` - ## 教程目录(2.x版本) 连载中...Star关注支持一下,随时获得更新信息! @@ -159,9 +119,6 @@ - [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 - [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 -- [GitHub](https://github.com/dyc87112/SpringBoot-Learning):Star支持一下呗 -- [Gitee](https://gitee.com/didispace/SpringBoot-Learning):Star支持一下呗 -- [Spring问答社区](http://www.spring4all.com/):如果您有什么问题,可以去这里发帖 - [Spring Boot基础教程](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 - [Spring Cloud基础教程](http://blog.didispace.com/Spring-Cloud%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网最早最全的免费Spring Cloud基础教程 @@ -172,3 +129,43 @@ ## 推荐我的书 ![](https://git.oschina.net/uploads/images/2017/0416/233656_dd3bce94_437188.png "在这里输入图片标题") + +## 特别赞助商 + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + +
+ +> 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` \ No newline at end of file From feb99e5d7980edc7c4e400fa69c9ab7d99573c75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:48:26 +0800 Subject: [PATCH 121/160] update --- README.md | 24 ++++++++++++------------ README_zh.md | 27 ++++++++++++--------------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 64bc8e36..37f45d5e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Spring Boot基础教程 -本项目内容为[《Spring Boot基础教程》](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 +本项目内容为[《Spring Boot基础教程》](https://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! @@ -13,11 +13,21 @@ ## 教程目录 -- [Spring Boot 1.x 版本教程](./1.x) - [Spring Boot 2.x 版本教程](./2.x) +- [Spring Boot 1.x 版本教程](./1.x) > **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
+## 推荐内容 + +- [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 +- [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 +- [阿里云:ECS云服务器2折起](https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=wxfqkr0o&utm_source=wxfqkr0o) +- [腾讯云:轻松应对建站成本问题](https://cloud.tencent.com/redirect.php?redirect=1027&cps_key=f6a8af1297bfac40b9d10ffa1270029a&from=console) +- [Spring问答社区](http://www.spring4all.com/):如果您有什么问题,可以去这里发帖 +- [Spring Boot基础教程](https://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 +- [Spring Cloud基础教程](https://blog.didispace.com/spring-cloud-learning/):全网最早最全的免费Spring Cloud基础教程 + ## 特别赞助商 @@ -58,16 +68,6 @@ > 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` -## 推荐内容 - -- [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 -- [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 -- [GitHub](https://github.com/dyc87112/SpringBoot-Learning):Star支持一下呗 -- [Gitee](https://gitee.com/didispace/SpringBoot-Learning):Star支持一下呗 -- [Spring问答社区](http://www.spring4all.com/):如果您有什么问题,可以去这里发帖 -- [Spring Boot基础教程](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 -- [Spring Cloud基础教程](http://blog.didispace.com/Spring-Cloud%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网最早最全的免费Spring Cloud基础教程 - ## 我的公众号 diff --git a/README_zh.md b/README_zh.md index 0eb939df..37f45d5e 100644 --- a/README_zh.md +++ b/README_zh.md @@ -1,6 +1,6 @@ # Spring Boot基础教程 -本项目内容为[《Spring Boot基础教程》](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 +本项目内容为[《Spring Boot基础教程》](https://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! @@ -13,11 +13,21 @@ ## 教程目录 -- [Spring Boot 1.x 版本教程](./1.x) - [Spring Boot 2.x 版本教程](./2.x) +- [Spring Boot 1.x 版本教程](./1.x) > **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
+## 推荐内容 + +- [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 +- [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 +- [阿里云:ECS云服务器2折起](https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=wxfqkr0o&utm_source=wxfqkr0o) +- [腾讯云:轻松应对建站成本问题](https://cloud.tencent.com/redirect.php?redirect=1027&cps_key=f6a8af1297bfac40b9d10ffa1270029a&from=console) +- [Spring问答社区](http://www.spring4all.com/):如果您有什么问题,可以去这里发帖 +- [Spring Boot基础教程](https://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 +- [Spring Cloud基础教程](https://blog.didispace.com/spring-cloud-learning/):全网最早最全的免费Spring Cloud基础教程 + ## 特别赞助商
@@ -58,19 +68,6 @@ > 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` -- [阿里云:ECS云服务器2折起](https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=wxfqkr0o&utm_source=wxfqkr0o) -- [腾讯云:轻松应对建站成本问题](https://cloud.tencent.com/redirect.php?redirect=1027&cps_key=f6a8af1297bfac40b9d10ffa1270029a&from=console) - -## 推荐内容 - -- [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 -- [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 -- [GitHub](https://github.com/dyc87112/SpringBoot-Learning):Star支持一下呗 -- [Gitee](https://gitee.com/didispace/SpringBoot-Learning):Star支持一下呗 -- [Spring问答社区](http://www.spring4all.com/):如果您有什么问题,可以去这里发帖 -- [Spring Boot基础教程](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 -- [Spring Cloud基础教程](http://blog.didispace.com/Spring-Cloud%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网最早最全的免费Spring Cloud基础教程 - ## 我的公众号 From 2b89525926467d9337ba50d5dce69eb9eb996923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 22 Jul 2021 16:57:47 +0800 Subject: [PATCH 122/160] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 1 - 2.x/README_zh.md | 1 - 2 files changed, 2 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index a6b40a1e..ef299949 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -56,7 +56,6 @@ - [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) - [Spring Boot 2.x基础教程:使用Flyway管理数据库版本](http://blog.didispace.com/spring-boot-learning-24-3-11/) - [Spring Boot 2.x基础教程:使用JTA实现分布式事务](http://blog.didispace.com/spring-boot-learning-24-3-12/) - - [Spring Boot 2.x基础教程:2.5版本后数据脚本初始化的变动](http://blog.didispace.com/spring-boot-learning-25-3-13/) **加速利器:各种缓存的使用** diff --git a/2.x/README_zh.md b/2.x/README_zh.md index d5e8d2b2..e2e5fd5e 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -57,7 +57,6 @@ - [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) - [Spring Boot 2.x基础教程:使用Flyway管理数据库版本](http://blog.didispace.com/spring-boot-learning-24-3-11/) - [Spring Boot 2.x基础教程:使用JTA实现分布式事务](http://blog.didispace.com/spring-boot-learning-24-3-12/) - - [Spring Boot 2.x基础教程:2.5版本后数据脚本初始化的变动](http://blog.didispace.com/spring-boot-learning-25-3-13/) **加速利器:各种缓存的使用** From 134940da0998595d0a4e05f3d9c98cdf8d17b807 Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Mon, 26 Jul 2021 22:20:43 +0800 Subject: [PATCH 123/160] =?UTF-8?q?Elastic=20Job=E7=9A=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=A4=84=E7=90=86=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter7-4/pom.xml | 51 +++++++++++++++++++ .../chapter74/Chapter74Application.java | 13 +++++ .../com/didispace/chapter74/MySimpleJob.java | 18 +++++++ .../src/main/resources/application.properties | 6 +++ 2.x/pom.xml | 7 ++- 5 files changed, 91 insertions(+), 4 deletions(-) create mode 100755 2.x/chapter7-4/pom.xml create mode 100755 2.x/chapter7-4/src/main/java/com/didispace/chapter74/Chapter74Application.java create mode 100644 2.x/chapter7-4/src/main/java/com/didispace/chapter74/MySimpleJob.java create mode 100644 2.x/chapter7-4/src/main/resources/application.properties diff --git a/2.x/chapter7-4/pom.xml b/2.x/chapter7-4/pom.xml new file mode 100755 index 00000000..5bab3842 --- /dev/null +++ b/2.x/chapter7-4/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + com.didispace + chapter7-4 + 0.0.1-SNAPSHOT + Elastic Job的错误处理策略 + + + 1.8 + + + + + org.apache.shardingsphere.elasticjob + elasticjob-lite-spring-boot-starter + 3.0.0 + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter7-4/src/main/java/com/didispace/chapter74/Chapter74Application.java b/2.x/chapter7-4/src/main/java/com/didispace/chapter74/Chapter74Application.java new file mode 100755 index 00000000..e2674e95 --- /dev/null +++ b/2.x/chapter7-4/src/main/java/com/didispace/chapter74/Chapter74Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter74; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter74Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter74Application.class, args); + } + +} diff --git a/2.x/chapter7-4/src/main/java/com/didispace/chapter74/MySimpleJob.java b/2.x/chapter7-4/src/main/java/com/didispace/chapter74/MySimpleJob.java new file mode 100644 index 00000000..d51c2ebb --- /dev/null +++ b/2.x/chapter7-4/src/main/java/com/didispace/chapter74/MySimpleJob.java @@ -0,0 +1,18 @@ +package com.didispace.chapter74; + +import lombok.extern.slf4j.Slf4j; +import org.apache.shardingsphere.elasticjob.api.ShardingContext; +import org.apache.shardingsphere.elasticjob.simple.job.SimpleJob; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class MySimpleJob implements SimpleJob { + + @Override + public void execute(ShardingContext context) { + log.info("MySimpleJob start : didispace.com {}", System.currentTimeMillis()); + throw new RuntimeException("模拟任务出现异常"); + } + +} \ No newline at end of file diff --git a/2.x/chapter7-4/src/main/resources/application.properties b/2.x/chapter7-4/src/main/resources/application.properties new file mode 100644 index 00000000..83abb028 --- /dev/null +++ b/2.x/chapter7-4/src/main/resources/application.properties @@ -0,0 +1,6 @@ +elasticjob.reg-center.server-lists=localhost:2181 +elasticjob.reg-center.namespace=didispace + +elasticjob.jobs.my-simple-job.elastic-job-class=com.didispace.chapter74.MySimpleJob +elasticjob.jobs.my-simple-job.cron=0/5 * * * * ? +elasticjob.jobs.my-simple-job.sharding-total-count=1 diff --git a/2.x/pom.xml b/2.x/pom.xml index 06cdc815..877a1b16 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -60,7 +60,6 @@ chapter5-3 chapter5-4 chapter5-5 - @@ -69,12 +68,12 @@ - + chapter7-1 chapter7-2 chapter7-3 - - + chapter7-4 + From 2f1a25fb4f2039b0ef626e9dfc8a32fee55e0a5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 28 Jul 2021 15:05:14 +0800 Subject: [PATCH 124/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8Elastic=20Job?= =?UTF-8?q?=E7=9A=84namespace=E9=98=B2=E6=AD=A2=E4=BB=BB=E5=8A=A1=E5=90=8D?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 2 +- 2.x/README_zh.md | 1 + .../java/com/didispace/chapter74/Chapter74Application.java | 0 .../src/main/java/com/didispace/chapter74/MySimpleJob.java | 1 - 2.x/chapter7-4/src/main/resources/application.properties | 4 +++- 2.x/pom.xml | 2 +- 6 files changed, 6 insertions(+), 4 deletions(-) mode change 100755 => 100644 2.x/chapter7-4/src/main/java/com/didispace/chapter74/Chapter74Application.java diff --git a/2.x/README.md b/2.x/README.md index ef299949..4b63af1b 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -84,7 +84,7 @@ - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) - [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) - [Spring Boot 2.x基础教程:使用Elastic Job的分片配置](https://blog.didispace.com/spring-boot-learning-2-7-3) - +- [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) ### 常见问题 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index e2e5fd5e..1ae48722 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -85,6 +85,7 @@ - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) - [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) - [Spring Boot 2.x基础教程:使用Elastic Job的分片配置](https://blog.didispace.com/spring-boot-learning-2-7-3) +- [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) ### 常见问题 diff --git a/2.x/chapter7-4/src/main/java/com/didispace/chapter74/Chapter74Application.java b/2.x/chapter7-4/src/main/java/com/didispace/chapter74/Chapter74Application.java old mode 100755 new mode 100644 diff --git a/2.x/chapter7-4/src/main/java/com/didispace/chapter74/MySimpleJob.java b/2.x/chapter7-4/src/main/java/com/didispace/chapter74/MySimpleJob.java index d51c2ebb..4e651c3e 100644 --- a/2.x/chapter7-4/src/main/java/com/didispace/chapter74/MySimpleJob.java +++ b/2.x/chapter7-4/src/main/java/com/didispace/chapter74/MySimpleJob.java @@ -12,7 +12,6 @@ public class MySimpleJob implements SimpleJob { @Override public void execute(ShardingContext context) { log.info("MySimpleJob start : didispace.com {}", System.currentTimeMillis()); - throw new RuntimeException("模拟任务出现异常"); } } \ No newline at end of file diff --git a/2.x/chapter7-4/src/main/resources/application.properties b/2.x/chapter7-4/src/main/resources/application.properties index 83abb028..16a59e0f 100644 --- a/2.x/chapter7-4/src/main/resources/application.properties +++ b/2.x/chapter7-4/src/main/resources/application.properties @@ -1,5 +1,7 @@ +spring.application.name=chapter74 + elasticjob.reg-center.server-lists=localhost:2181 -elasticjob.reg-center.namespace=didispace +elasticjob.reg-center.namespace=${spring.application.name} elasticjob.jobs.my-simple-job.elastic-job-class=com.didispace.chapter74.MySimpleJob elasticjob.jobs.my-simple-job.cron=0/5 * * * * ? diff --git a/2.x/pom.xml b/2.x/pom.xml index 877a1b16..8fa69fa4 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -72,7 +72,7 @@ chapter7-1 chapter7-2 chapter7-3 - chapter7-4 + chapter7-4 From 6275fa479f9ce485a5b5dc6f2cacd9528bdc8985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Wed, 28 Jul 2021 15:17:51 +0800 Subject: [PATCH 125/160] update --- 2.x/README.md | 2 +- 2.x/README_zh.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index 4b63af1b..175d3aa8 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -83,7 +83,7 @@ - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) - [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) -- [Spring Boot 2.x基础教程:使用Elastic Job的分片配置](https://blog.didispace.com/spring-boot-learning-2-7-3) +- [Spring Boot 2.x基础教程:使用Elastic Job的分片配置提高执行效率](https://blog.didispace.com/spring-boot-learning-2-7-3) - [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) ### 常见问题 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 1ae48722..bb1e39dc 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -84,7 +84,7 @@ - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) - [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) -- [Spring Boot 2.x基础教程:使用Elastic Job的分片配置](https://blog.didispace.com/spring-boot-learning-2-7-3) +- [Spring Boot 2.x基础教程:使用Elastic Job的分片配置提高执行效率](https://blog.didispace.com/spring-boot-learning-2-7-3) - [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) ### 常见问题 From a8948d92618268dd6c4ecd8209c1ac000cc5655a Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Tue, 3 Aug 2021 02:05:13 +0800 Subject: [PATCH 126/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=97=B6=E5=BA=8F?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=20InfluxDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 1 + 2.x/README_zh.md | 2 + 2.x/chapter6-3/pom.xml | 59 +++++++++++++++++++ .../chapter63/Chapter63Application.java | 15 +++++ .../java/com/didispace/chapter63/Monitor.java | 43 ++++++++++++++ .../src/main/resources/application.properties | 5 ++ .../didispace/chapter63/ApplicationTests.java | 22 +++++++ 2.x/pom.xml | 2 +- 8 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 2.x/chapter6-3/pom.xml create mode 100644 2.x/chapter6-3/src/main/java/com/didispace/chapter63/Chapter63Application.java create mode 100644 2.x/chapter6-3/src/main/java/com/didispace/chapter63/Monitor.java create mode 100644 2.x/chapter6-3/src/main/resources/application.properties create mode 100644 2.x/chapter6-3/src/test/java/com/didispace/chapter63/ApplicationTests.java diff --git a/2.x/README.md b/2.x/README.md index 175d3aa8..3553630f 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -70,6 +70,7 @@ - [Spring Boot 2.x基础教程:使用MongoDB](http://blog.didispace.com/spring-boot-learning-24-6-1/) - [Spring Boot 2.x基础教程:使用LDAP来管理用户与组织数据](http://blog.didispace.com/spring-boot-learning-24-6-2/) +- [Spring Boot 2.x基础教程:使用时序数据库InfluxDB](http://blog.didispace.com/spring-boot-learning-2-6-3/) ### Web开发 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index bb1e39dc..94a3ed95 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -71,6 +71,8 @@ - [Spring Boot 2.x基础教程:使用MongoDB](http://blog.didispace.com/spring-boot-learning-24-6-1/) - [Spring Boot 2.x基础教程:使用LDAP来管理用户与组织数据](http://blog.didispace.com/spring-boot-learning-24-6-2/) +- [Spring Boot 2.x基础教程:使用时序数据库InfluxDB](http://blog.didispace.com/spring-boot-learning-2-6-3/) + ### Web开发 diff --git a/2.x/chapter6-3/pom.xml b/2.x/chapter6-3/pom.xml new file mode 100644 index 00000000..686e3150 --- /dev/null +++ b/2.x/chapter6-3/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + com.didispace + chapter6-3 + 1.0.0 + jar + 使用时序数据库InfluxDB + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + + UTF-8 + 1.8 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.influxdb + influxdb-java + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/2.x/chapter6-3/src/main/java/com/didispace/chapter63/Chapter63Application.java b/2.x/chapter6-3/src/main/java/com/didispace/chapter63/Chapter63Application.java new file mode 100644 index 00000000..54cc0e22 --- /dev/null +++ b/2.x/chapter6-3/src/main/java/com/didispace/chapter63/Chapter63Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter63; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@EnableScheduling +@SpringBootApplication +public class Chapter63Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter63Application.class, args); + } + +} diff --git a/2.x/chapter6-3/src/main/java/com/didispace/chapter63/Monitor.java b/2.x/chapter6-3/src/main/java/com/didispace/chapter63/Monitor.java new file mode 100644 index 00000000..fd62dc20 --- /dev/null +++ b/2.x/chapter6-3/src/main/java/com/didispace/chapter63/Monitor.java @@ -0,0 +1,43 @@ +package com.didispace.chapter63; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.influxdb.InfluxDB; +import org.influxdb.dto.Point; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.util.Random; +import java.util.concurrent.TimeUnit; + +/** + * Created by 程序猿DD on 2021/8/2. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +@Service +@AllArgsConstructor +@Slf4j +public class Monitor { + + private InfluxDB influxDB; + + @Scheduled(fixedRate = 5000) + public void writeQPS() { + // 模拟要上报的统计数据 + int count = (int) (Math.random() * 100); + + Point point = Point.measurement("ApiQPS") // ApiQPS表 + .tag("url", "/hello") // url字段 + .addField("count", count) // 统计数据 + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) // 时间 + .build(); + + // 往test库写数据 + influxDB.write("test", "autogen", point); + + log.info("上报统计数据:" + count); + } + +} diff --git a/2.x/chapter6-3/src/main/resources/application.properties b/2.x/chapter6-3/src/main/resources/application.properties new file mode 100644 index 00000000..0df52b44 --- /dev/null +++ b/2.x/chapter6-3/src/main/resources/application.properties @@ -0,0 +1,5 @@ + +spring.influx.url=http://localhost:8086 +spring.influx.user=admin +spring.influx.password= + diff --git a/2.x/chapter6-3/src/test/java/com/didispace/chapter63/ApplicationTests.java b/2.x/chapter6-3/src/test/java/com/didispace/chapter63/ApplicationTests.java new file mode 100644 index 00000000..4720d3cc --- /dev/null +++ b/2.x/chapter6-3/src/test/java/com/didispace/chapter63/ApplicationTests.java @@ -0,0 +1,22 @@ +package com.didispace.chapter63; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@Slf4j +@SpringBootTest +public class ApplicationTests { + + @Test + public void findAll() { + + } + + @Test + public void save() { + + } + +} diff --git a/2.x/pom.xml b/2.x/pom.xml index 8fa69fa4..792f409b 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -65,7 +65,7 @@ chapter6-1 chapter6-2 - + chapter6-3 From e12aa4f076d5029fb18e7aeefb580b3961174619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Thu, 12 Aug 2021 17:18:44 +0800 Subject: [PATCH 127/160] update --- 2.x/chapter1-5/.gitignore | 29 ++++++++++++ 2.x/chapter1-5/pom.xml | 47 +++++++++++++++++++ .../chapter15/Chapter15Application.java | 13 +++++ .../didispace/chapter15/HelloController.java | 14 ++++++ .../src/main/resources/application.properties | 3 ++ 2.x/pom.xml | 1 + 6 files changed, 107 insertions(+) create mode 100644 2.x/chapter1-5/.gitignore create mode 100644 2.x/chapter1-5/pom.xml create mode 100644 2.x/chapter1-5/src/main/java/com/didispace/chapter15/Chapter15Application.java create mode 100644 2.x/chapter1-5/src/main/java/com/didispace/chapter15/HelloController.java create mode 100644 2.x/chapter1-5/src/main/resources/application.properties diff --git a/2.x/chapter1-5/.gitignore b/2.x/chapter1-5/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/2.x/chapter1-5/.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/2.x/chapter1-5/pom.xml b/2.x/chapter1-5/pom.xml new file mode 100644 index 00000000..23e61eaa --- /dev/null +++ b/2.x/chapter1-5/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + com.didispace + chapter1-5 + 0.0.1-SNAPSHOT + 敏感配置信息的加密 + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter1-5/src/main/java/com/didispace/chapter15/Chapter15Application.java b/2.x/chapter1-5/src/main/java/com/didispace/chapter15/Chapter15Application.java new file mode 100644 index 00000000..1547f9b5 --- /dev/null +++ b/2.x/chapter1-5/src/main/java/com/didispace/chapter15/Chapter15Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter15; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter15Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter15Application.class, args); + } + +} diff --git a/2.x/chapter1-5/src/main/java/com/didispace/chapter15/HelloController.java b/2.x/chapter1-5/src/main/java/com/didispace/chapter15/HelloController.java new file mode 100644 index 00000000..91236867 --- /dev/null +++ b/2.x/chapter1-5/src/main/java/com/didispace/chapter15/HelloController.java @@ -0,0 +1,14 @@ +package com.didispace.chapter15; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloController { + + @RequestMapping("/hello") + public String index() { + return "Hello World"; + } + +} \ No newline at end of file diff --git a/2.x/chapter1-5/src/main/resources/application.properties b/2.x/chapter1-5/src/main/resources/application.properties new file mode 100644 index 00000000..20da7c87 --- /dev/null +++ b/2.x/chapter1-5/src/main/resources/application.properties @@ -0,0 +1,3 @@ + +com.didispace.from=didi + diff --git a/2.x/pom.xml b/2.x/pom.xml index 792f409b..6876b899 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -16,6 +16,7 @@ chapter1-2 chapter1-3 chapter1-4 + chapter1-5 chapter2-1 From e440510a23a3012daff1d6b04bb1bbcf493354a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Fri, 13 Aug 2021 16:59:21 +0800 Subject: [PATCH 128/160] update --- 2.x/chapter1-5/pom.xml | 12 ++++++++++ .../chapter15/Chapter15Application.java | 24 ++++++++++++++++--- .../didispace/chapter15/HelloController.java | 14 ----------- .../didispace/chapter15/JasyptExample.java | 18 ++++++++++++++ .../src/main/resources/application.properties | 10 +++++++- .../didispace/chapter15/PropertiesTest.java | 21 ++++++++++++++++ 6 files changed, 81 insertions(+), 18 deletions(-) delete mode 100644 2.x/chapter1-5/src/main/java/com/didispace/chapter15/HelloController.java create mode 100644 2.x/chapter1-5/src/main/java/com/didispace/chapter15/JasyptExample.java create mode 100644 2.x/chapter1-5/src/test/java/com/didispace/chapter15/PropertiesTest.java diff --git a/2.x/chapter1-5/pom.xml b/2.x/chapter1-5/pom.xml index 23e61eaa..35d5fb02 100644 --- a/2.x/chapter1-5/pom.xml +++ b/2.x/chapter1-5/pom.xml @@ -23,6 +23,12 @@ spring-boot-starter-web + + com.github.ulisesbocchio + jasypt-spring-boot-starter + 3.0.3 + + org.projectlombok lombok @@ -41,6 +47,12 @@ org.springframework.boot spring-boot-maven-plugin + + + com.github.ulisesbocchio + jasypt-maven-plugin + 3.0.3 + diff --git a/2.x/chapter1-5/src/main/java/com/didispace/chapter15/Chapter15Application.java b/2.x/chapter1-5/src/main/java/com/didispace/chapter15/Chapter15Application.java index 1547f9b5..df4e07eb 100644 --- a/2.x/chapter1-5/src/main/java/com/didispace/chapter15/Chapter15Application.java +++ b/2.x/chapter1-5/src/main/java/com/didispace/chapter15/Chapter15Application.java @@ -1,13 +1,31 @@ package com.didispace.chapter15; +import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; @SpringBootApplication +@EnableEncryptableProperties public class Chapter15Application { - public static void main(String[] args) { - SpringApplication.run(Chapter15Application.class, args); - } + public static void main(String[] args) { + SpringApplication.run(Chapter15Application.class, args); + } + + @RestController + static class HelloController { + + @Autowired + private JasyptExample jasyptExample; + + @GetMapping("/hello") + public String hello() { + return "Hello World, " + jasyptExample.getFrom2(); + } + + } } diff --git a/2.x/chapter1-5/src/main/java/com/didispace/chapter15/HelloController.java b/2.x/chapter1-5/src/main/java/com/didispace/chapter15/HelloController.java deleted file mode 100644 index 91236867..00000000 --- a/2.x/chapter1-5/src/main/java/com/didispace/chapter15/HelloController.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.didispace.chapter15; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class HelloController { - - @RequestMapping("/hello") - public String index() { - return "Hello World"; - } - -} \ No newline at end of file diff --git a/2.x/chapter1-5/src/main/java/com/didispace/chapter15/JasyptExample.java b/2.x/chapter1-5/src/main/java/com/didispace/chapter15/JasyptExample.java new file mode 100644 index 00000000..c87ca75f --- /dev/null +++ b/2.x/chapter1-5/src/main/java/com/didispace/chapter15/JasyptExample.java @@ -0,0 +1,18 @@ +package com.didispace.chapter15; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Slf4j +@Data +@Component +public class JasyptExample { + + @Value("${com.didispace.from1:}") + private String from1; + @Value("${com.didispace.from2:}") + private String from2; + +} \ No newline at end of file diff --git a/2.x/chapter1-5/src/main/resources/application.properties b/2.x/chapter1-5/src/main/resources/application.properties index 20da7c87..1cbf505e 100644 --- a/2.x/chapter1-5/src/main/resources/application.properties +++ b/2.x/chapter1-5/src/main/resources/application.properties @@ -1,3 +1,11 @@ -com.didispace.from=didi +com.didispace.from1=didi +com.didispace.from2=ENC(1I1oWHryzOJt+Gm81xnGnOUbBUpEBEFYES/NprA/q6ec3jBkU1xlBZWsHCaj71ds) +jasypt.encryptor.password=didispace + +#[INFO] Encryptor config not found for property jasypt.encryptor.salt-generator-classname, using default value: org.jasypt.salt.RandomSaltGenerator +#[INFO] Encryptor config not found for property jasypt.encryptor.iv-generator-classname, using default value: org.jasypt.iv.RandomIvGenerator + +# mvn jasypt:encrypt -Djasypt.encryptor.password=didispace +# mvn jasypt:decrypt -Djasypt.encryptor.password=didispace \ No newline at end of file diff --git a/2.x/chapter1-5/src/test/java/com/didispace/chapter15/PropertiesTest.java b/2.x/chapter1-5/src/test/java/com/didispace/chapter15/PropertiesTest.java new file mode 100644 index 00000000..1185ff4a --- /dev/null +++ b/2.x/chapter1-5/src/test/java/com/didispace/chapter15/PropertiesTest.java @@ -0,0 +1,21 @@ +package com.didispace.chapter15; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@Slf4j +@SpringBootTest +public class PropertiesTest { + + @Autowired + private JasyptExample jasyptExample; + + @Test + public void test() { + log.info("from1 : {}", jasyptExample.getFrom1()); + log.info("from2 : {}", jasyptExample.getFrom2()); + } + +} From b28477aad3a2b4d9c11122b2b3ab89855b44fc7d Mon Sep 17 00:00:00 2001 From: zhaiyongchao Date: Fri, 13 Aug 2021 23:04:01 +0800 Subject: [PATCH 129/160] =?UTF-8?q?=E5=8A=A0=E5=AF=86=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=AD=E7=9A=84=E6=95=8F=E6=84=9F=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 3 ++- 2.x/README_zh.md | 3 ++- 2.x/chapter1-5/pom.xml | 2 +- .../chapter15/Chapter15Application.java | 18 ------------------ .../com/didispace/chapter15/JasyptExample.java | 18 ------------------ .../src/main/resources/application.properties | 11 +++++------ .../didispace/chapter15/PropertiesTest.java | 8 ++++---- 2.x/pom.xml | 2 +- 8 files changed, 15 insertions(+), 50 deletions(-) delete mode 100644 2.x/chapter1-5/src/main/java/com/didispace/chapter15/JasyptExample.java diff --git a/2.x/README.md b/2.x/README.md index 3553630f..623f5393 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -25,9 +25,10 @@ ### 配置文件 - [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) +- [Spring Boot 2.x基础教程:配置元数据的应用 ](http://blog.didispace.com/spring-boot-learning-24-1-6/) - [Spring Boot 2.x基础教程:2.4版本前后的多环境配置变化](http://blog.didispace.com/spring-boot-learning-24-1-4/) - [Spring Boot 2.x基础教程:2.4版本前后的分组配置变化](http://blog.didispace.com/spring-boot-learning-24-1-5/) -- [Spring Boot 2.x基础教程:配置元数据的应用 ](http://blog.didispace.com/spring-boot-learning-24-1-6/) +- [Spring Boot 2.x基础教程:加密配置中的敏感信息](http://blog.didispace.com/spring-boot-learning-2-1-5/) ### API开发 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 94a3ed95..2958f22c 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -26,9 +26,10 @@ ### 配置文件 - [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) +- [Spring Boot 2.x基础教程:配置元数据的应用 ](http://blog.didispace.com/spring-boot-learning-24-1-6/) - [Spring Boot 2.x基础教程:2.4版本前后的多环境配置变化](http://blog.didispace.com/spring-boot-learning-24-1-4/) - [Spring Boot 2.x基础教程:2.4版本前后的分组配置变化](http://blog.didispace.com/spring-boot-learning-24-1-5/) -- [Spring Boot 2.x基础教程:配置元数据的应用 ](http://blog.didispace.com/spring-boot-learning-24-1-6/) +- [Spring Boot 2.x基础教程:加密配置中的敏感信息](http://blog.didispace.com/spring-boot-learning-2-1-5/) ### API开发 diff --git a/2.x/chapter1-5/pom.xml b/2.x/chapter1-5/pom.xml index 35d5fb02..a9c25152 100644 --- a/2.x/chapter1-5/pom.xml +++ b/2.x/chapter1-5/pom.xml @@ -11,7 +11,7 @@ com.didispace chapter1-5 0.0.1-SNAPSHOT - 敏感配置信息的加密 + 加密配置中的敏感信息 1.8 diff --git a/2.x/chapter1-5/src/main/java/com/didispace/chapter15/Chapter15Application.java b/2.x/chapter1-5/src/main/java/com/didispace/chapter15/Chapter15Application.java index df4e07eb..6b0c79d6 100644 --- a/2.x/chapter1-5/src/main/java/com/didispace/chapter15/Chapter15Application.java +++ b/2.x/chapter1-5/src/main/java/com/didispace/chapter15/Chapter15Application.java @@ -1,31 +1,13 @@ package com.didispace.chapter15; -import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; @SpringBootApplication -@EnableEncryptableProperties public class Chapter15Application { public static void main(String[] args) { SpringApplication.run(Chapter15Application.class, args); } - @RestController - static class HelloController { - - @Autowired - private JasyptExample jasyptExample; - - @GetMapping("/hello") - public String hello() { - return "Hello World, " + jasyptExample.getFrom2(); - } - - } - } diff --git a/2.x/chapter1-5/src/main/java/com/didispace/chapter15/JasyptExample.java b/2.x/chapter1-5/src/main/java/com/didispace/chapter15/JasyptExample.java deleted file mode 100644 index c87ca75f..00000000 --- a/2.x/chapter1-5/src/main/java/com/didispace/chapter15/JasyptExample.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.didispace.chapter15; - -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -@Slf4j -@Data -@Component -public class JasyptExample { - - @Value("${com.didispace.from1:}") - private String from1; - @Value("${com.didispace.from2:}") - private String from2; - -} \ No newline at end of file diff --git a/2.x/chapter1-5/src/main/resources/application.properties b/2.x/chapter1-5/src/main/resources/application.properties index 1cbf505e..b5780fe0 100644 --- a/2.x/chapter1-5/src/main/resources/application.properties +++ b/2.x/chapter1-5/src/main/resources/application.properties @@ -1,11 +1,10 @@ -com.didispace.from1=didi -com.didispace.from2=ENC(1I1oWHryzOJt+Gm81xnGnOUbBUpEBEFYES/NprA/q6ec3jBkU1xlBZWsHCaj71ds) +datasource.password=ENC(/AL9nJENCYCh9Pfzdf2xLPsqOZ6HwNgQ3AnMybFAMeOM5GphZlOK6PxzozwtCm+Q) jasypt.encryptor.password=didispace -#[INFO] Encryptor config not found for property jasypt.encryptor.salt-generator-classname, using default value: org.jasypt.salt.RandomSaltGenerator -#[INFO] Encryptor config not found for property jasypt.encryptor.iv-generator-classname, using default value: org.jasypt.iv.RandomIvGenerator - # mvn jasypt:encrypt -Djasypt.encryptor.password=didispace -# mvn jasypt:decrypt -Djasypt.encryptor.password=didispace \ No newline at end of file +# mvn jasypt:decrypt -Djasypt.encryptor.password=didispace + +#jasypt.encryptor.property.prefix=ENC( +#jasypt.encryptor.property.suffix=) \ No newline at end of file diff --git a/2.x/chapter1-5/src/test/java/com/didispace/chapter15/PropertiesTest.java b/2.x/chapter1-5/src/test/java/com/didispace/chapter15/PropertiesTest.java index 1185ff4a..db8ff86d 100644 --- a/2.x/chapter1-5/src/test/java/com/didispace/chapter15/PropertiesTest.java +++ b/2.x/chapter1-5/src/test/java/com/didispace/chapter15/PropertiesTest.java @@ -3,19 +3,19 @@ import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; @Slf4j @SpringBootTest public class PropertiesTest { - @Autowired - private JasyptExample jasyptExample; + @Value("${datasource.password:}") + private String password; @Test public void test() { - log.info("from1 : {}", jasyptExample.getFrom1()); - log.info("from2 : {}", jasyptExample.getFrom2()); + log.info("datasource.password : {}", password); } } diff --git a/2.x/pom.xml b/2.x/pom.xml index 6876b899..755a140f 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -16,7 +16,7 @@ chapter1-2 chapter1-3 chapter1-4 - chapter1-5 + chapter1-5 chapter2-1 From f52bb67ab896642ad0d7f4d7a783571d053612f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Mon, 16 Aug 2021 12:51:41 +0800 Subject: [PATCH 130/160] =?UTF-8?q?=E8=AF=A5=E7=9B=AE=E5=BD=95=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E5=B7=B2=E8=BF=81=E7=A7=BB=E8=87=B32.x=E7=9B=AE?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/README.md | 124 ++----------------------------------------- 2.1.x/README_zh.md | 129 ++------------------------------------------- 2 files changed, 6 insertions(+), 247 deletions(-) diff --git a/2.1.x/README.md b/2.1.x/README.md index de29ff83..5f07e37b 100644 --- a/2.1.x/README.md +++ b/2.1.x/README.md @@ -1,122 +1,4 @@ -# Spring Boot基础教程(2.x版本) - -本项目内容为[《Spring Boot基础教程》](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 - -**专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! - -**如何支持**: - -1. 关注我的公众号”**程序猿DD**“ -2. 点个`Star`并`Follow`我 -3. 把该仓库分享给更多的朋友 - -## 特别赞助商 - -

- - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - - -
- -> 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` - -## 教程目录(2.x版本) - -连载中...Star关注支持一下,随时获得更新信息! - -### 基础知识 - -- [Spring Boot 2.x基础教程:版本关系](http://blog.didispace.com/spring-cloud-alibaba-version/) -- [Spring Boot 2.x基础教程:快速入门](http://blog.didispace.com/spring-boot-learning-21-1-1/) -- [Spring Boot 2.x基础教程:工程结构推荐](http://blog.didispace.com/spring-boot-learning-21-1-2/) -- [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) - -### Web开发 - -- [Spring Boot 2.x基础教程:构建RESTful API与单元测试](http://blog.didispace.com/spring-boot-learning-21-2-1/) -- [Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档](http://blog.didispace.com/spring-boot-learning-21-2-2/) -- [Spring Boot 2.x基础教程:JSR-303实现请求参数校验](http://blog.didispace.com/spring-boot-learning-21-2-3/) -- [Spring Boot 2.x基础教程:Swagger接口分类与各元素排序问题详解](http://blog.didispace.com/spring-boot-learning-21-2-4/) -- [Spring Boot 2.x基础教程:Swagger静态文档的生成](http://blog.didispace.com/spring-boot-learning-21-2-5/) -- [Spring Boot 2.x基础教程:找回启动日志中的请求路径列表](http://blog.didispace.com/spring-boot-learning-21-2-6/) - -### 数据访问 - -**关系型数据库** - -- [Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库](http://blog.didispace.com/spring-boot-learning-21-3-1/) -- [Spring Boot 2.x基础教程:默认数据源Hikari的配置详解](http://blog.didispace.com/spring-boot-learning-21-3-2/) -- [Spring Boot 2.x基础教程:使用国产数据库连接池Druid](http://blog.didispace.com/spring-boot-learning-21-3-3/) -- [Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL](http://blog.didispace.com/spring-boot-learning-21-3-4/) -- [Spring Boot 2.x基础教程:使用MyBatis访问MySQL](http://blog.didispace.com/spring-boot-learning-21-3-5/) -- [Spring Boot 2.x基础教程:使用MyBatis的XML配置方式](http://blog.didispace.com/spring-boot-learning-21-3-6/) -- [Spring Boot 2.x基础教程:JdbcTemplate的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-7/) -- [Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-8/) -- [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) -- [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) - -**加速利器:各种缓存的使用** - -- [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) -- [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) -- [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) -- [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/) - -### Web开发 - -- [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) -- [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) - -### 1.x到2.x - -- [Spring Boot 2.0 正式发布,升还是不升呢?](http://blog.didispace.com/spring-boot-2-release/) -- [Spring Boot 2.0 新特性和发展方向](http://blog.didispace.com/Spring-Boot-2-0-%E6%96%B0%E7%89%B9%E6%80%A7%E5%92%8C%E5%8F%91%E5%B1%95%E6%96%B9%E5%90%91/) -- [Spring Boot 2.0 与 Java 9](http://blog.didispace.com/Spring-Boot-2.0%E4%B8%8EJava-9/) -- [Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析](http://blog.didispace.com/Spring-Boot-2-0-feature-1-relaxed-binding-2/) -- [Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent](http://blog.didispace.com/Spring-Boot-2-0-feature-2-ApplicationStartedEvent/) - -## 推荐内容 - -- [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 -- [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 -- [GitHub](https://github.com/dyc87112/SpringBoot-Learning):Star支持一下呗 -- [Gitee](https://gitee.com/didispace/SpringBoot-Learning):Star支持一下呗 -- [Spring问答社区](http://www.spring4all.com/):如果您有什么问题,可以去这里发帖 -- [Spring Boot基础教程](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 -- [Spring Cloud基础教程](http://blog.didispace.com/Spring-Cloud%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网最早最全的免费Spring Cloud基础教程 - -## 我的公众号 - - - +该目录下内容已迁移道`2.x`目录,本文件夹不继续维护。 +- 教程汇总(1.x版本):[《Spring Boot基础教程》](https://blog.didispace.com/spring-boot-learning-1x/) +- 教程汇总(2.x版本):[《Spring Boot基础教程》](https://blog.didispace.com/spring-boot-learning-2x/) diff --git a/2.1.x/README_zh.md b/2.1.x/README_zh.md index 301ec021..5f07e37b 100644 --- a/2.1.x/README_zh.md +++ b/2.1.x/README_zh.md @@ -1,127 +1,4 @@ -# Spring Boot基础教程(2.x版本) +该目录下内容已迁移道`2.x`目录,本文件夹不继续维护。 -本项目内容为[《Spring Boot基础教程》](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 - -**专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! - -**如何支持**: -1. 关注我的公众号”**程序猿DD**“ -2. 点个`Star`并`Follow`我 -3. 把该仓库分享给更多的朋友 - -如果您对文字类教程不感冒或者想要通过综合案例学习Spring,那么给您推荐这个我觉得目前内容与价格最良心的视频课程:["玩转Spring全家桶"](https://time.geekbang.org/course/intro/100023501?code=d1se%2F7ugeBEyuU%2FIYp1ynfSZa6ulbGhhDK%2Fkpn3-lFc%3D) - -> **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
- -## 特别赞助商 - - - - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - - -
- -> 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` - -## 教程目录(2.x版本) - -连载中...Star关注支持一下,随时获得更新信息! - -### 基础知识 - -- [Spring Boot 2.x基础教程:版本关系](http://blog.didispace.com/spring-cloud-alibaba-version/) -- [Spring Boot 2.x基础教程:快速入门](http://blog.didispace.com/spring-boot-learning-21-1-1/) -- [Spring Boot 2.x基础教程:工程结构推荐](http://blog.didispace.com/spring-boot-learning-21-1-2/) -- [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) - -### Web开发 - -- [Spring Boot 2.x基础教程:构建RESTful API与单元测试](http://blog.didispace.com/spring-boot-learning-21-2-1/) -- [Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档](http://blog.didispace.com/spring-boot-learning-21-2-2/) -- [Spring Boot 2.x基础教程:JSR-303实现请求参数校验](http://blog.didispace.com/spring-boot-learning-21-2-3/) -- [Spring Boot 2.x基础教程:Swagger接口分类与各元素排序问题详解](http://blog.didispace.com/spring-boot-learning-21-2-4/) -- [Spring Boot 2.x基础教程:Swagger静态文档的生成](http://blog.didispace.com/spring-boot-learning-21-2-5/) -- [Spring Boot 2.x基础教程:找回启动日志中的请求路径列表](http://blog.didispace.com/spring-boot-learning-21-2-6/) - -### 数据访问 - -**关系型数据库** - -- [Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库](http://blog.didispace.com/spring-boot-learning-21-3-1/) -- [Spring Boot 2.x基础教程:默认数据源Hikari的配置详解](http://blog.didispace.com/spring-boot-learning-21-3-2/) -- [Spring Boot 2.x基础教程:使用国产数据库连接池Druid](http://blog.didispace.com/spring-boot-learning-21-3-3/) -- [Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL](http://blog.didispace.com/spring-boot-learning-21-3-4/) -- [Spring Boot 2.x基础教程:使用MyBatis访问MySQL](http://blog.didispace.com/spring-boot-learning-21-3-5/) -- [Spring Boot 2.x基础教程:使用MyBatis的XML配置方式](http://blog.didispace.com/spring-boot-learning-21-3-6/) -- [Spring Boot 2.x基础教程:JdbcTemplate的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-7/) -- [Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-8/) -- [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) -- [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) - -**加速利器:各种缓存的使用** - -- [Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解](http://blog.didispace.com/spring-boot-learning-21-5-1/) -- [Spring Boot 2.x基础教程:EhCache缓存的使用](http://blog.didispace.com/spring-boot-learning-21-5-2/) -- [Spring Boot 2.x基础教程:使用EhCache缓存集群](http://blog.didispace.com/spring-boot-learning-21-5-3/) -- [Spring Boot 2.x基础教程:使用集中式缓存Redis](http://blog.didispace.com/spring-boot-learning-21-5-4/) - -### Web开发 - -- [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) -- [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) - -### 1.x到2.x - -- [Spring Boot 2.0 正式发布,升还是不升呢?](http://blog.didispace.com/spring-boot-2-release/) -- [Spring Boot 2.0 新特性和发展方向](http://blog.didispace.com/Spring-Boot-2-0-%E6%96%B0%E7%89%B9%E6%80%A7%E5%92%8C%E5%8F%91%E5%B1%95%E6%96%B9%E5%90%91/) -- [Spring Boot 2.0 与 Java 9](http://blog.didispace.com/Spring-Boot-2.0%E4%B8%8EJava-9/) -- [Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析](http://blog.didispace.com/Spring-Boot-2-0-feature-1-relaxed-binding-2/) -- [Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent](http://blog.didispace.com/Spring-Boot-2-0-feature-2-ApplicationStartedEvent/) - -## 推荐内容 - -- [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 -- [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 -- [GitHub](https://github.com/dyc87112/SpringBoot-Learning):Star支持一下呗 -- [Gitee](https://gitee.com/didispace/SpringBoot-Learning):Star支持一下呗 -- [Spring问答社区](http://www.spring4all.com/):如果您有什么问题,可以去这里发帖 -- [Spring Boot基础教程](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 -- [Spring Cloud基础教程](http://blog.didispace.com/Spring-Cloud%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网最早最全的免费Spring Cloud基础教程 - -## 我的公众号 - - - -## 我出版的书 - -![输入图片说明](https://git.oschina.net/uploads/images/2017/0416/233656_dd3bce94_437188.png "在这里输入图片标题") +- 教程汇总(1.x版本):[《Spring Boot基础教程》](https://blog.didispace.com/spring-boot-learning-1x/) +- 教程汇总(2.x版本):[《Spring Boot基础教程》](https://blog.didispace.com/spring-boot-learning-2x/) From 1246efed24ac91188d1cf6795aa079132f4ea459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Mon, 16 Aug 2021 12:59:37 +0800 Subject: [PATCH 131/160] =?UTF-8?q?1.x=E6=95=99=E7=A8=8B=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.x/README.md | 65 ++++++------------------------------------- 1.x/README_zh.md | 72 ++++++------------------------------------------ 2 files changed, 17 insertions(+), 120 deletions(-) diff --git a/1.x/README.md b/1.x/README.md index e5f191c2..a1fcc0fe 100644 --- a/1.x/README.md +++ b/1.x/README.md @@ -1,60 +1,11 @@ -# Spring Boot基础教程(1.x版本) - -本项目内容为[《Spring Boot基础教程》](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 - -**专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! - -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) - -**如何支持**: -1. 关注我的公众号”**程序猿DD**“ -2. 点个`Star`并`Follow`我 -3. 把该仓库分享给更多的朋友 - -如果您对文字类教程不感冒或者想要通过综合案例学习Spring,那么给您推荐这个我觉得目前内容与价格最良心的视频课程:["玩转Spring全家桶"](https://time.geekbang.org/course/intro/100023501?code=d1se%2F7ugeBEyuU%2FIYp1ynfSZa6ulbGhhDK%2Fkpn3-lFc%3D) - - -> **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
- -## 特别赞助商 - - - - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - - -
- -> 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` +该目录下为Spring Boot 1.x版本的教程,因为版本落后,**后续不再继续更新**。 + +推荐下面的2.x版本,还在持续更新哦! + +- 教程汇总(1.x版本):[《Spring Boot基础教程》](https://blog.didispace.com/spring-boot-learning-1x/) +- 教程汇总(2.x版本):[《Spring Boot基础教程》](https://blog.didispace.com/spring-boot-learning-2x/) + +Spring Boot 2.x版本的教程可在`2.x`目录下查看。 ## 教程目录(1.x版本) diff --git a/1.x/README_zh.md b/1.x/README_zh.md index b23d4a16..a1fcc0fe 100644 --- a/1.x/README_zh.md +++ b/1.x/README_zh.md @@ -1,63 +1,11 @@ -# Spring Boot基础教程(1.x版本) - -本项目内容为[《Spring Boot基础教程》](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 - -**专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! - -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) - -**如何支持**: -1. 关注我的公众号”**程序猿DD**“ -2. 点个`Star`并`Follow`我 -3. 把该仓库分享给更多的朋友 - -如果您对文字类教程不感冒或者想要通过综合案例学习Spring,那么给您推荐这个我觉得目前内容与价格最良心的视频课程:["玩转Spring全家桶"](https://time.geekbang.org/course/intro/100023501?code=d1se%2F7ugeBEyuU%2FIYp1ynfSZa6ulbGhhDK%2Fkpn3-lFc%3D) - - -> **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
- -## 特别赞助商 - - - - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - - -
- -> 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` - -- [阿里云:ECS云服务器2折起](https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=wxfqkr0o&utm_source=wxfqkr0o) -- [腾讯云:轻松应对建站成本问题](https://cloud.tencent.com/redirect.php?redirect=1027&cps_key=f6a8af1297bfac40b9d10ffa1270029a&from=console) +该目录下为Spring Boot 1.x版本的教程,因为版本落后,**后续不再继续更新**。 + +推荐下面的2.x版本,还在持续更新哦! + +- 教程汇总(1.x版本):[《Spring Boot基础教程》](https://blog.didispace.com/spring-boot-learning-1x/) +- 教程汇总(2.x版本):[《Spring Boot基础教程》](https://blog.didispace.com/spring-boot-learning-2x/) + +Spring Boot 2.x版本的教程可在`2.x`目录下查看。 ## 教程目录(1.x版本) @@ -170,8 +118,6 @@ ## 我的公众号 - + -## 我出版的书 -![输入图片说明](https://git.oschina.net/uploads/images/2017/0416/233656_dd3bce94_437188.png "在这里输入图片标题") From cc65093ef06a961f7e79642f732cc41cd69dea23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Mon, 16 Aug 2021 13:01:22 +0800 Subject: [PATCH 132/160] =?UTF-8?q?=E7=9B=AE=E5=BD=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/pom.xml | 3 ++- README.md | 12 +++++++----- README_zh.md | 12 +++++++----- pom.xml | 5 +++++ 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/2.x/pom.xml b/2.x/pom.xml index 755a140f..1252ae43 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -4,8 +4,9 @@ 4.0.0 com.didispace - SpringBoot-Learning + 2.x 2.0-SNAPSHOT + pom 全网Star最多的Spring Boot基础教程 diff --git a/README.md b/README.md index 37f45d5e..e962dabe 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,17 @@ **加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) **如何支持**: + 1. 关注我的公众号”**程序猿DD**“ 2. 点个`Star`并`Follow`我 3. 把该仓库分享给更多的朋友 ## 教程目录 +该教程自2016年连载至今,因内容较多,经历过多个版本的迭代。为方便查看学习,这里重新做了整理,根据1.x版本和2.x版本做了区分汇总。 + +可以通过下面的链接,进入具体版本的教程目录: + - [Spring Boot 2.x 版本教程](./2.x) - [Spring Boot 1.x 版本教程](./1.x) @@ -21,12 +26,9 @@ ## 推荐内容 - [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 +- [我的Spring Boot教程](https://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 +- [我的Spring Cloud教程](https://blog.didispace.com/spring-cloud-learning/):全网最早最全的免费Spring Cloud基础教程 - [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 -- [阿里云:ECS云服务器2折起](https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=wxfqkr0o&utm_source=wxfqkr0o) -- [腾讯云:轻松应对建站成本问题](https://cloud.tencent.com/redirect.php?redirect=1027&cps_key=f6a8af1297bfac40b9d10ffa1270029a&from=console) -- [Spring问答社区](http://www.spring4all.com/):如果您有什么问题,可以去这里发帖 -- [Spring Boot基础教程](https://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 -- [Spring Cloud基础教程](https://blog.didispace.com/spring-cloud-learning/):全网最早最全的免费Spring Cloud基础教程 ## 特别赞助商 diff --git a/README_zh.md b/README_zh.md index 37f45d5e..e962dabe 100644 --- a/README_zh.md +++ b/README_zh.md @@ -7,12 +7,17 @@ **加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) **如何支持**: + 1. 关注我的公众号”**程序猿DD**“ 2. 点个`Star`并`Follow`我 3. 把该仓库分享给更多的朋友 ## 教程目录 +该教程自2016年连载至今,因内容较多,经历过多个版本的迭代。为方便查看学习,这里重新做了整理,根据1.x版本和2.x版本做了区分汇总。 + +可以通过下面的链接,进入具体版本的教程目录: + - [Spring Boot 2.x 版本教程](./2.x) - [Spring Boot 1.x 版本教程](./1.x) @@ -21,12 +26,9 @@ ## 推荐内容 - [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 +- [我的Spring Boot教程](https://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 +- [我的Spring Cloud教程](https://blog.didispace.com/spring-cloud-learning/):全网最早最全的免费Spring Cloud基础教程 - [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 -- [阿里云:ECS云服务器2折起](https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=wxfqkr0o&utm_source=wxfqkr0o) -- [腾讯云:轻松应对建站成本问题](https://cloud.tencent.com/redirect.php?redirect=1027&cps_key=f6a8af1297bfac40b9d10ffa1270029a&from=console) -- [Spring问答社区](http://www.spring4all.com/):如果您有什么问题,可以去这里发帖 -- [Spring Boot基础教程](https://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 -- [Spring Cloud基础教程](https://blog.didispace.com/spring-cloud-learning/):全网最早最全的免费Spring Cloud基础教程 ## 特别赞助商 diff --git a/pom.xml b/pom.xml index bbb1474b..469fe5a3 100644 --- a/pom.xml +++ b/pom.xml @@ -6,6 +6,11 @@ com.didispace SpringBoot-Learning 1.0-SNAPSHOT + pom + + + 2.x + From 12284303a3a188f2cdfd3165aa11385001d59f38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Thu, 26 Aug 2021 17:51:56 +0800 Subject: [PATCH 133/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8@Async=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=BC=82=E6=AD=A5=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 3 ++ 2.x/README_zh.md | 2 + 2.x/chapter7-5/pom.xml | 50 +++++++++++++++++++ .../com/didispace/chapter75/AsyncTasks.java | 40 +++++++++++++++ .../chapter75/Chapter75Application.java | 13 +++++ .../src/main/resources/application.properties | 0 .../chapter75/Chapter75ApplicationTests.java | 22 ++++++++ 2.x/pom.xml | 3 +- 8 files changed, 132 insertions(+), 1 deletion(-) create mode 100755 2.x/chapter7-5/pom.xml create mode 100644 2.x/chapter7-5/src/main/java/com/didispace/chapter75/AsyncTasks.java create mode 100644 2.x/chapter7-5/src/main/java/com/didispace/chapter75/Chapter75Application.java create mode 100644 2.x/chapter7-5/src/main/resources/application.properties create mode 100644 2.x/chapter7-5/src/test/java/com/didispace/chapter75/Chapter75ApplicationTests.java diff --git a/2.x/README.md b/2.x/README.md index 623f5393..7ce6922a 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -88,6 +88,9 @@ - [Spring Boot 2.x基础教程:使用Elastic Job的分片配置提高执行效率](https://blog.didispace.com/spring-boot-learning-2-7-3) - [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) +- [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) + + ### 常见问题 - [为什么加了@Transactional注解,事务没有回滚?](http://blog.didispace.com/transactional-not-rollback/) diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 2958f22c..ed03e29c 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -90,6 +90,8 @@ - [Spring Boot 2.x基础教程:使用Elastic Job的分片配置提高执行效率](https://blog.didispace.com/spring-boot-learning-2-7-3) - [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) +- [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) + ### 常见问题 - [为什么加了@Transactional注解,事务没有回滚?](http://blog.didispace.com/transactional-not-rollback/) diff --git a/2.x/chapter7-5/pom.xml b/2.x/chapter7-5/pom.xml new file mode 100755 index 00000000..4ff53d56 --- /dev/null +++ b/2.x/chapter7-5/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + com.didispace + chapter7-5 + 0.0.1-SNAPSHOT + 使用@Async实现异步任务 + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter7-5/src/main/java/com/didispace/chapter75/AsyncTasks.java b/2.x/chapter7-5/src/main/java/com/didispace/chapter75/AsyncTasks.java new file mode 100644 index 00000000..2db5b26d --- /dev/null +++ b/2.x/chapter7-5/src/main/java/com/didispace/chapter75/AsyncTasks.java @@ -0,0 +1,40 @@ +package com.didispace.chapter75; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Random; + +@Slf4j +@Component +@AllArgsConstructor +public class AsyncTasks { + + public static Random random = new Random(); + + public void doTaskOne() throws Exception { + log.info("开始做任务一"); + long start = System.currentTimeMillis(); + Thread.sleep(random.nextInt(10000)); + long end = System.currentTimeMillis(); + log.info("完成任务一,耗时:" + (end - start) + "毫秒"); + } + + public void doTaskTwo() throws Exception { + log.info("开始做任务二"); + long start = System.currentTimeMillis(); + Thread.sleep(random.nextInt(10000)); + long end = System.currentTimeMillis(); + log.info("完成任务二,耗时:" + (end - start) + "毫秒"); + } + + public void doTaskThree() throws Exception { + log.info("开始做任务三"); + long start = System.currentTimeMillis(); + Thread.sleep(random.nextInt(10000)); + long end = System.currentTimeMillis(); + log.info("完成任务三,耗时:" + (end - start) + "毫秒"); + } + +} \ No newline at end of file diff --git a/2.x/chapter7-5/src/main/java/com/didispace/chapter75/Chapter75Application.java b/2.x/chapter7-5/src/main/java/com/didispace/chapter75/Chapter75Application.java new file mode 100644 index 00000000..b7d233ee --- /dev/null +++ b/2.x/chapter7-5/src/main/java/com/didispace/chapter75/Chapter75Application.java @@ -0,0 +1,13 @@ +package com.didispace.chapter75; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Chapter75Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter75Application.class, args); + } + +} diff --git a/2.x/chapter7-5/src/main/resources/application.properties b/2.x/chapter7-5/src/main/resources/application.properties new file mode 100644 index 00000000..e69de29b diff --git a/2.x/chapter7-5/src/test/java/com/didispace/chapter75/Chapter75ApplicationTests.java b/2.x/chapter7-5/src/test/java/com/didispace/chapter75/Chapter75ApplicationTests.java new file mode 100644 index 00000000..61aa967e --- /dev/null +++ b/2.x/chapter7-5/src/test/java/com/didispace/chapter75/Chapter75ApplicationTests.java @@ -0,0 +1,22 @@ +package com.didispace.chapter75; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@Slf4j +@SpringBootTest +public class Chapter75ApplicationTests { + + @Autowired + private AsyncTasks asyncTasks; + + @Test + public void test() throws Exception { + asyncTasks.doTaskOne(); + asyncTasks.doTaskTwo(); + asyncTasks.doTaskThree(); + } + +} diff --git a/2.x/pom.xml b/2.x/pom.xml index 1252ae43..3c743265 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -75,7 +75,8 @@ chapter7-2 chapter7-3 chapter7-4 - + chapter7-5 + From 679ebf65924a2b8cc2594ac440f2fc5e23261432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Sat, 11 Sep 2021 23:36:09 +0800 Subject: [PATCH 134/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8@Async=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=BC=82=E6=AD=A5=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/didispace/chapter75/AsyncTasks.java | 16 +++++++++++----- .../chapter75/Chapter75Application.java | 2 ++ .../chapter75/Chapter75ApplicationTests.java | 17 ++++++++++++++--- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/2.x/chapter7-5/src/main/java/com/didispace/chapter75/AsyncTasks.java b/2.x/chapter7-5/src/main/java/com/didispace/chapter75/AsyncTasks.java index 2db5b26d..e2f1be13 100644 --- a/2.x/chapter7-5/src/main/java/com/didispace/chapter75/AsyncTasks.java +++ b/2.x/chapter7-5/src/main/java/com/didispace/chapter75/AsyncTasks.java @@ -1,40 +1,46 @@ package com.didispace.chapter75; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.Random; +import java.util.concurrent.CompletableFuture; @Slf4j @Component -@AllArgsConstructor public class AsyncTasks { public static Random random = new Random(); - public void doTaskOne() throws Exception { + @Async + public CompletableFuture doTaskOne() throws Exception { log.info("开始做任务一"); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt(10000)); long end = System.currentTimeMillis(); log.info("完成任务一,耗时:" + (end - start) + "毫秒"); + return CompletableFuture.completedFuture("任务一完成"); } - public void doTaskTwo() throws Exception { + @Async + public CompletableFuture doTaskTwo() throws Exception { log.info("开始做任务二"); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt(10000)); long end = System.currentTimeMillis(); log.info("完成任务二,耗时:" + (end - start) + "毫秒"); + return CompletableFuture.completedFuture("任务二完成"); } - public void doTaskThree() throws Exception { + @Async + public CompletableFuture doTaskThree() throws Exception { log.info("开始做任务三"); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt(10000)); long end = System.currentTimeMillis(); log.info("完成任务三,耗时:" + (end - start) + "毫秒"); + return CompletableFuture.completedFuture("任务三完成"); } } \ No newline at end of file diff --git a/2.x/chapter7-5/src/main/java/com/didispace/chapter75/Chapter75Application.java b/2.x/chapter7-5/src/main/java/com/didispace/chapter75/Chapter75Application.java index b7d233ee..e8aef549 100644 --- a/2.x/chapter7-5/src/main/java/com/didispace/chapter75/Chapter75Application.java +++ b/2.x/chapter7-5/src/main/java/com/didispace/chapter75/Chapter75Application.java @@ -2,7 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; +@EnableAsync @SpringBootApplication public class Chapter75Application { diff --git a/2.x/chapter7-5/src/test/java/com/didispace/chapter75/Chapter75ApplicationTests.java b/2.x/chapter7-5/src/test/java/com/didispace/chapter75/Chapter75ApplicationTests.java index 61aa967e..af32b972 100644 --- a/2.x/chapter7-5/src/test/java/com/didispace/chapter75/Chapter75ApplicationTests.java +++ b/2.x/chapter7-5/src/test/java/com/didispace/chapter75/Chapter75ApplicationTests.java @@ -5,6 +5,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; + @Slf4j @SpringBootTest public class Chapter75ApplicationTests { @@ -14,9 +17,17 @@ public class Chapter75ApplicationTests { @Test public void test() throws Exception { - asyncTasks.doTaskOne(); - asyncTasks.doTaskTwo(); - asyncTasks.doTaskThree(); + long start = System.currentTimeMillis(); + + CompletableFuture task1 = asyncTasks.doTaskOne(); + CompletableFuture task2 = asyncTasks.doTaskTwo(); + CompletableFuture task3 = asyncTasks.doTaskThree(); + + CompletableFuture.allOf(task1, task2, task3).join(); + + long end = System.currentTimeMillis(); + + log.info("任务全部完成,总耗时:" + (end - start) + "毫秒"); } } From ee785269238f00c1a60904757e6998d26fe9b92f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Tue, 14 Sep 2021 17:24:54 +0800 Subject: [PATCH 135/160] =?UTF-8?q?@Async=E5=BC=82=E6=AD=A5=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=9A=84=E7=BA=BF=E7=A8=8B=E6=B1=A0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter7-6/pom.xml | 50 +++++++++++++++++++ .../com/didispace/chapter76/AsyncTasks.java | 46 +++++++++++++++++ .../chapter76/Chapter76Application.java | 15 ++++++ .../src/main/resources/application.properties | 0 .../chapter76/Chapter76ApplicationTests.java | 33 ++++++++++++ 2.x/pom.xml | 2 +- 6 files changed, 145 insertions(+), 1 deletion(-) create mode 100755 2.x/chapter7-6/pom.xml create mode 100644 2.x/chapter7-6/src/main/java/com/didispace/chapter76/AsyncTasks.java create mode 100644 2.x/chapter7-6/src/main/java/com/didispace/chapter76/Chapter76Application.java create mode 100644 2.x/chapter7-6/src/main/resources/application.properties create mode 100644 2.x/chapter7-6/src/test/java/com/didispace/chapter76/Chapter76ApplicationTests.java diff --git a/2.x/chapter7-6/pom.xml b/2.x/chapter7-6/pom.xml new file mode 100755 index 00000000..c67956f5 --- /dev/null +++ b/2.x/chapter7-6/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + com.didispace + chapter7-6 + 0.0.1-SNAPSHOT + @Async异步任务的线程池配置 + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter7-6/src/main/java/com/didispace/chapter76/AsyncTasks.java b/2.x/chapter7-6/src/main/java/com/didispace/chapter76/AsyncTasks.java new file mode 100644 index 00000000..3af4adcf --- /dev/null +++ b/2.x/chapter7-6/src/main/java/com/didispace/chapter76/AsyncTasks.java @@ -0,0 +1,46 @@ +package com.didispace.chapter76; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.util.Random; +import java.util.concurrent.CompletableFuture; + +@Slf4j +@Component +public class AsyncTasks { + + public static Random random = new Random(); + + @Async + public CompletableFuture doTaskOne() throws Exception { + log.info("开始做任务一"); + long start = System.currentTimeMillis(); + Thread.sleep(random.nextInt(10000)); + long end = System.currentTimeMillis(); + log.info("完成任务一,耗时:" + (end - start) + "毫秒"); + return CompletableFuture.completedFuture("任务一完成"); + } + + @Async + public CompletableFuture doTaskTwo() throws Exception { + log.info("开始做任务二"); + long start = System.currentTimeMillis(); + Thread.sleep(random.nextInt(10000)); + long end = System.currentTimeMillis(); + log.info("完成任务二,耗时:" + (end - start) + "毫秒"); + return CompletableFuture.completedFuture("任务二完成"); + } + + @Async + public CompletableFuture doTaskThree() throws Exception { + log.info("开始做任务三"); + long start = System.currentTimeMillis(); + Thread.sleep(random.nextInt(10000)); + long end = System.currentTimeMillis(); + log.info("完成任务三,耗时:" + (end - start) + "毫秒"); + return CompletableFuture.completedFuture("任务三完成"); + } + +} \ No newline at end of file diff --git a/2.x/chapter7-6/src/main/java/com/didispace/chapter76/Chapter76Application.java b/2.x/chapter7-6/src/main/java/com/didispace/chapter76/Chapter76Application.java new file mode 100644 index 00000000..4f856eba --- /dev/null +++ b/2.x/chapter7-6/src/main/java/com/didispace/chapter76/Chapter76Application.java @@ -0,0 +1,15 @@ +package com.didispace.chapter76; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; + +@EnableAsync +@SpringBootApplication +public class Chapter76Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter76Application.class, args); + } + +} diff --git a/2.x/chapter7-6/src/main/resources/application.properties b/2.x/chapter7-6/src/main/resources/application.properties new file mode 100644 index 00000000..e69de29b diff --git a/2.x/chapter7-6/src/test/java/com/didispace/chapter76/Chapter76ApplicationTests.java b/2.x/chapter7-6/src/test/java/com/didispace/chapter76/Chapter76ApplicationTests.java new file mode 100644 index 00000000..44d7267c --- /dev/null +++ b/2.x/chapter7-6/src/test/java/com/didispace/chapter76/Chapter76ApplicationTests.java @@ -0,0 +1,33 @@ +package com.didispace.chapter76; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; + +@Slf4j +@SpringBootTest +public class Chapter76ApplicationTests { + + @Autowired + private AsyncTasks asyncTasks; + + @Test + public void test() throws Exception { + long start = System.currentTimeMillis(); + + CompletableFuture task1 = asyncTasks.doTaskOne(); + CompletableFuture task2 = asyncTasks.doTaskTwo(); + CompletableFuture task3 = asyncTasks.doTaskThree(); + + CompletableFuture.allOf(task1, task2, task3).join(); + + long end = System.currentTimeMillis(); + + log.info("任务全部完成,总耗时:" + (end - start) + "毫秒"); + } + +} diff --git a/2.x/pom.xml b/2.x/pom.xml index 3c743265..d72dcbe2 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -76,7 +76,7 @@ chapter7-3 chapter7-4 chapter7-5 - + chapter7-6 From 0bfbf6500210a0da81f7da1974e7d2b2aa23d1cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 15 Sep 2021 00:57:26 +0800 Subject: [PATCH 136/160] =?UTF-8?q?=E9=85=8D=E7=BD=AE@Async=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E4=BB=BB=E5=8A=A1=E7=9A=84=E7=BA=BF=E7=A8=8B=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 5 +++++ 2.x/README_zh.md | 5 +++++ .../main/java/com/didispace/chapter76/AsyncTasks.java | 1 + 2.x/chapter7-6/src/main/resources/application.properties | 9 +++++++++ .../didispace/chapter76/Chapter76ApplicationTests.java | 3 +-- 2.x/pom.xml | 6 +++++- 6 files changed, 26 insertions(+), 3 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index 7ce6922a..82131402 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -83,12 +83,17 @@ ### 任务管理 +**定时任务** + - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) - [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) - [Spring Boot 2.x基础教程:使用Elastic Job的分片配置提高执行效率](https://blog.didispace.com/spring-boot-learning-2-7-3) - [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) +**异步任务* + - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) +- [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) ### 常见问题 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index ed03e29c..c533d737 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -85,12 +85,17 @@ ### 任务管理 +**定时任务** + - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) - [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) - [Spring Boot 2.x基础教程:使用Elastic Job的分片配置提高执行效率](https://blog.didispace.com/spring-boot-learning-2-7-3) - [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) +**异步任务* + - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) +- [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) ### 常见问题 diff --git a/2.x/chapter7-6/src/main/java/com/didispace/chapter76/AsyncTasks.java b/2.x/chapter7-6/src/main/java/com/didispace/chapter76/AsyncTasks.java index 3af4adcf..66a01d8e 100644 --- a/2.x/chapter7-6/src/main/java/com/didispace/chapter76/AsyncTasks.java +++ b/2.x/chapter7-6/src/main/java/com/didispace/chapter76/AsyncTasks.java @@ -6,6 +6,7 @@ import java.util.Random; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; @Slf4j @Component diff --git a/2.x/chapter7-6/src/main/resources/application.properties b/2.x/chapter7-6/src/main/resources/application.properties index e69de29b..070a4b71 100644 --- a/2.x/chapter7-6/src/main/resources/application.properties +++ b/2.x/chapter7-6/src/main/resources/application.properties @@ -0,0 +1,9 @@ +spring.task.execution.pool.core-size=2 +spring.task.execution.pool.max-size=5 +spring.task.execution.pool.queue-capacity=10 +spring.task.execution.pool.keep-alive=60s +spring.task.execution.pool.allow-core-thread-timeout=true +spring.task.execution.thread-name-prefix=task- + +spring.task.execution.shutdown.await-termination=false +spring.task.execution.shutdown.await-termination-period=30s \ No newline at end of file diff --git a/2.x/chapter7-6/src/test/java/com/didispace/chapter76/Chapter76ApplicationTests.java b/2.x/chapter7-6/src/test/java/com/didispace/chapter76/Chapter76ApplicationTests.java index 44d7267c..2a832502 100644 --- a/2.x/chapter7-6/src/test/java/com/didispace/chapter76/Chapter76ApplicationTests.java +++ b/2.x/chapter7-6/src/test/java/com/didispace/chapter76/Chapter76ApplicationTests.java @@ -6,7 +6,6 @@ import org.springframework.boot.test.context.SpringBootTest; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Future; @Slf4j @SpringBootTest @@ -16,7 +15,7 @@ public class Chapter76ApplicationTests { private AsyncTasks asyncTasks; @Test - public void test() throws Exception { + public void test1() throws Exception { long start = System.currentTimeMillis(); CompletableFuture task1 = asyncTasks.doTaskOne(); diff --git a/2.x/pom.xml b/2.x/pom.xml index d72dcbe2..e940e683 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -76,7 +76,11 @@ chapter7-3 chapter7-4 chapter7-5 - chapter7-6 + chapter7-6 + + + + chapter8-1 From 2a5e47d005ca69e0a71440dd32278deb83677c32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 15 Sep 2021 00:57:49 +0800 Subject: [PATCH 137/160] =?UTF-8?q?@Async=E5=BC=82=E6=AD=A5=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=9A=84=E7=BA=BF=E7=A8=8B=E6=B1=A0=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter7-7/pom.xml | 50 ++++++++++++++++ .../com/didispace/chapter77/AsyncTasks.java | 57 +++++++++++++++++++ .../chapter77/Chapter77Application.java | 43 ++++++++++++++ .../src/main/resources/application.properties | 9 +++ .../chapter77/Chapter77ApplicationTests.java | 48 ++++++++++++++++ 5 files changed, 207 insertions(+) create mode 100755 2.x/chapter7-7/pom.xml create mode 100644 2.x/chapter7-7/src/main/java/com/didispace/chapter77/AsyncTasks.java create mode 100644 2.x/chapter7-7/src/main/java/com/didispace/chapter77/Chapter77Application.java create mode 100644 2.x/chapter7-7/src/main/resources/application.properties create mode 100644 2.x/chapter7-7/src/test/java/com/didispace/chapter77/Chapter77ApplicationTests.java diff --git a/2.x/chapter7-7/pom.xml b/2.x/chapter7-7/pom.xml new file mode 100755 index 00000000..bed2f64b --- /dev/null +++ b/2.x/chapter7-7/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + com.didispace + chapter7-6 + 0.0.1-SNAPSHOT + @Async异步任务的线程池隔离 + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter7-7/src/main/java/com/didispace/chapter77/AsyncTasks.java b/2.x/chapter7-7/src/main/java/com/didispace/chapter77/AsyncTasks.java new file mode 100644 index 00000000..a538e379 --- /dev/null +++ b/2.x/chapter7-7/src/main/java/com/didispace/chapter77/AsyncTasks.java @@ -0,0 +1,57 @@ +package com.didispace.chapter77; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.util.Random; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; + +@Slf4j +@Component +public class AsyncTasks { + + public static Random random = new Random(); + + @Async + public CompletableFuture doTaskOne() throws Exception { + log.info("开始做任务一"); + long start = System.currentTimeMillis(); + Thread.sleep(random.nextInt(10000)); + long end = System.currentTimeMillis(); + log.info("完成任务一,耗时:" + (end - start) + "毫秒"); + return CompletableFuture.completedFuture("任务一完成"); + } + + @Async + public CompletableFuture doTaskTwo() throws Exception { + log.info("开始做任务二"); + long start = System.currentTimeMillis(); + Thread.sleep(random.nextInt(10000)); + long end = System.currentTimeMillis(); + log.info("完成任务二,耗时:" + (end - start) + "毫秒"); + return CompletableFuture.completedFuture("任务二完成"); + } + + @Async + public CompletableFuture doTaskThree() throws Exception { + log.info("开始做任务三"); + long start = System.currentTimeMillis(); + Thread.sleep(random.nextInt(10000)); + long end = System.currentTimeMillis(); + log.info("完成任务三,耗时:" + (end - start) + "毫秒"); + return CompletableFuture.completedFuture("任务三完成"); + } + + @Async("taskExecutor2") + public CompletableFuture doTaskFour() throws Exception { + log.info("开始做任务四"); + long start = System.currentTimeMillis(); + Thread.sleep(random.nextInt(10000)); + long end = System.currentTimeMillis(); + log.info("完成任务四,耗时:" + (end - start) + "毫秒"); + return CompletableFuture.completedFuture("任务四完成"); + } + +} \ No newline at end of file diff --git a/2.x/chapter7-7/src/main/java/com/didispace/chapter77/Chapter77Application.java b/2.x/chapter7-7/src/main/java/com/didispace/chapter77/Chapter77Application.java new file mode 100644 index 00000000..127eaf46 --- /dev/null +++ b/2.x/chapter7-7/src/main/java/com/didispace/chapter77/Chapter77Application.java @@ -0,0 +1,43 @@ +package com.didispace.chapter77; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@EnableAsync +@SpringBootApplication +public class Chapter76Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter76Application.class, args); + } + + @EnableAsync + @Configuration + class TaskPoolConfig { + +// @Bean +// public Executor taskExecutor2() { +// ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); +// executor.setCorePoolSize(1); +// executor.setMaxPoolSize(2); +// executor.setQueueCapacity(50); +// executor.setKeepAliveSeconds(60); +// executor.setThreadNamePrefix("taskExecutor2-"); +// executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); +// return executor; +// } + + } + +} diff --git a/2.x/chapter7-7/src/main/resources/application.properties b/2.x/chapter7-7/src/main/resources/application.properties new file mode 100644 index 00000000..070a4b71 --- /dev/null +++ b/2.x/chapter7-7/src/main/resources/application.properties @@ -0,0 +1,9 @@ +spring.task.execution.pool.core-size=2 +spring.task.execution.pool.max-size=5 +spring.task.execution.pool.queue-capacity=10 +spring.task.execution.pool.keep-alive=60s +spring.task.execution.pool.allow-core-thread-timeout=true +spring.task.execution.thread-name-prefix=task- + +spring.task.execution.shutdown.await-termination=false +spring.task.execution.shutdown.await-termination-period=30s \ No newline at end of file diff --git a/2.x/chapter7-7/src/test/java/com/didispace/chapter77/Chapter77ApplicationTests.java b/2.x/chapter7-7/src/test/java/com/didispace/chapter77/Chapter77ApplicationTests.java new file mode 100644 index 00000000..84f52c48 --- /dev/null +++ b/2.x/chapter7-7/src/test/java/com/didispace/chapter77/Chapter77ApplicationTests.java @@ -0,0 +1,48 @@ +package com.didispace.chapter76; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; + +@Slf4j +@SpringBootTest +public class Chapter76ApplicationTests { + + @Autowired + private AsyncTasks asyncTasks; + + @Test + public void test1() throws Exception { + long start = System.currentTimeMillis(); + + CompletableFuture task1 = asyncTasks.doTaskOne(); + CompletableFuture task2 = asyncTasks.doTaskTwo(); + CompletableFuture task3 = asyncTasks.doTaskThree(); + + CompletableFuture.allOf(task1, task2, task3).join(); + + long end = System.currentTimeMillis(); + + log.info("任务全部完成,总耗时:" + (end - start) + "毫秒"); + } + + @Test + public void test2() throws Exception { + long start = System.currentTimeMillis(); + + CompletableFuture task1 = asyncTasks.doTaskFour(); + CompletableFuture task2 = asyncTasks.doTaskFour(); + CompletableFuture task3 = asyncTasks.doTaskFour(); + + CompletableFuture.allOf(task1, task2, task3).join(); + + long end = System.currentTimeMillis(); + + log.info("任务全部完成,总耗时:" + (end - start) + "毫秒"); + } + +} From 3dae3e62b9516491241c8d6559ef321b1f9fb1cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 15 Sep 2021 00:58:22 +0800 Subject: [PATCH 138/160] =?UTF-8?q?Spring=20Security=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E5=85=A5=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter8-1/pom.xml | 63 +++++++++++++++++++ .../com/didispace/chapter81/Application.java | 22 +++++++ .../didispace/chapter81/HelloController.java | 33 ++++++++++ .../chapter81/WebSecurityConfig.java | 36 +++++++++++ .../src/main/resources/application.properties | 0 .../src/main/resources/templates/hello.html | 13 ++++ .../src/main/resources/templates/index.html | 12 ++++ .../src/main/resources/templates/login.html | 21 +++++++ 8 files changed, 200 insertions(+) create mode 100644 2.x/chapter8-1/pom.xml create mode 100644 2.x/chapter8-1/src/main/java/com/didispace/chapter81/Application.java create mode 100644 2.x/chapter8-1/src/main/java/com/didispace/chapter81/HelloController.java create mode 100644 2.x/chapter8-1/src/main/java/com/didispace/chapter81/WebSecurityConfig.java create mode 100644 2.x/chapter8-1/src/main/resources/application.properties create mode 100644 2.x/chapter8-1/src/main/resources/templates/hello.html create mode 100644 2.x/chapter8-1/src/main/resources/templates/index.html create mode 100644 2.x/chapter8-1/src/main/resources/templates/login.html diff --git a/2.x/chapter8-1/pom.xml b/2.x/chapter8-1/pom.xml new file mode 100644 index 00000000..81817f27 --- /dev/null +++ b/2.x/chapter8-1/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + com.didispace + chapter8-1 + 0.0.1-SNAPSHOT + Spring Security快速入门 + + + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-security + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + \ No newline at end of file diff --git a/2.x/chapter8-1/src/main/java/com/didispace/chapter81/Application.java b/2.x/chapter8-1/src/main/java/com/didispace/chapter81/Application.java new file mode 100644 index 00000000..f7a9e16e --- /dev/null +++ b/2.x/chapter8-1/src/main/java/com/didispace/chapter81/Application.java @@ -0,0 +1,22 @@ +package com.didispace; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * + * @author 程序猿DD + * @version 1.0.0 + * @blog http://blog.didispace.com + * + */ +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + + SpringApplication.run(Application.class, args); + + } + +} diff --git a/2.x/chapter8-1/src/main/java/com/didispace/chapter81/HelloController.java b/2.x/chapter8-1/src/main/java/com/didispace/chapter81/HelloController.java new file mode 100644 index 00000000..f5a6770b --- /dev/null +++ b/2.x/chapter8-1/src/main/java/com/didispace/chapter81/HelloController.java @@ -0,0 +1,33 @@ +package com.didispace.chapter81; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +/** + * + * @author 程序猿DD + * @version 1.0.0 + * @blog http://blog.didispace.com + * + */ +@Controller +public class HelloController { + + @RequestMapping("/") + public String index() { + return "index"; + } + + @RequestMapping("/hello") + public String hello() { + return "hello"; + } + + @RequestMapping(value = "/login", method = RequestMethod.GET) + public String login() { + return "login"; + } + +} \ No newline at end of file diff --git a/2.x/chapter8-1/src/main/java/com/didispace/chapter81/WebSecurityConfig.java b/2.x/chapter8-1/src/main/java/com/didispace/chapter81/WebSecurityConfig.java new file mode 100644 index 00000000..1f3da340 --- /dev/null +++ b/2.x/chapter8-1/src/main/java/com/didispace/chapter81/WebSecurityConfig.java @@ -0,0 +1,36 @@ +package com.didispace.chapter81; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableWebSecurity +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests() + .antMatchers("/", "/home").permitAll() + .anyRequest().authenticated() + .and() + .formLogin() + .loginPage("/login") + .permitAll() + .and() + .logout() + .permitAll(); + } + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + auth + .inMemoryAuthentication() + .withUser("user").password("password").roles("USER"); + } + +} \ No newline at end of file diff --git a/2.x/chapter8-1/src/main/resources/application.properties b/2.x/chapter8-1/src/main/resources/application.properties new file mode 100644 index 00000000..e69de29b diff --git a/2.x/chapter8-1/src/main/resources/templates/hello.html b/2.x/chapter8-1/src/main/resources/templates/hello.html new file mode 100644 index 00000000..51477131 --- /dev/null +++ b/2.x/chapter8-1/src/main/resources/templates/hello.html @@ -0,0 +1,13 @@ + + + + Hello World! + + +

Hello [[${#httpServletRequest.remoteUser}]]!

+
+ +
+ + \ No newline at end of file diff --git a/2.x/chapter8-1/src/main/resources/templates/index.html b/2.x/chapter8-1/src/main/resources/templates/index.html new file mode 100644 index 00000000..ffe28340 --- /dev/null +++ b/2.x/chapter8-1/src/main/resources/templates/index.html @@ -0,0 +1,12 @@ + + + + Spring Security入门 + + +

欢迎使用Spring Security!

+ +

点击 这里 打个招呼吧

+ + \ No newline at end of file diff --git a/2.x/chapter8-1/src/main/resources/templates/login.html b/2.x/chapter8-1/src/main/resources/templates/login.html new file mode 100644 index 00000000..f5cbe8e2 --- /dev/null +++ b/2.x/chapter8-1/src/main/resources/templates/login.html @@ -0,0 +1,21 @@ + + + + Spring Security Example + + +
+ 用户名或密码错 +
+
+ 您已注销成功 +
+
+
+
+
+
+ + \ No newline at end of file From 854720573ee7306d5aa5f5df05244f65eb6d0951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 15 Sep 2021 12:31:35 +0800 Subject: [PATCH 139/160] 1 --- 2.x/README.md | 2 +- 2.x/README_zh.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/2.x/README.md b/2.x/README.md index 82131402..08ae2291 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -94,7 +94,7 @@ - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) - [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) - +- [Spring Boot 2.x基础教程:@Async异步任务的线程池隔离](https://blog.didispace.com/spring-boot-learning-2-7-7) ### 常见问题 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index c533d737..0566a534 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -96,6 +96,7 @@ - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) - [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) +- [Spring Boot 2.x基础教程:@Async异步任务的线程池隔离](https://blog.didispace.com/spring-boot-learning-2-7-7) ### 常见问题 From 7866b41a8030364d546145b47a460a35cd543826 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 15 Sep 2021 23:51:10 +0800 Subject: [PATCH 140/160] =?UTF-8?q?=E5=A6=82=E4=BD=95=E9=9A=94=E7=A6=BB@As?= =?UTF-8?q?ync=E5=BC=82=E6=AD=A5=E4=BB=BB=E5=8A=A1=E7=9A=84=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 2 +- 2.x/README_zh.md | 2 +- 2.x/chapter7-7/pom.xml | 4 +- .../com/didispace/chapter77/AsyncTasks.java | 39 +++++-------------- .../chapter77/Chapter77Application.java | 38 +++++++++++------- .../src/main/resources/application.properties | 9 ----- .../chapter77/Chapter77ApplicationTests.java | 34 +++++++--------- 2.x/pom.xml | 2 +- 8 files changed, 52 insertions(+), 78 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index 08ae2291..936fa1b3 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -94,7 +94,7 @@ - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) - [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) -- [Spring Boot 2.x基础教程:@Async异步任务的线程池隔离](https://blog.didispace.com/spring-boot-learning-2-7-7) +- [Spring Boot 2.x基础教程:如何隔离@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-7) ### 常见问题 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 0566a534..0c10db16 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -96,7 +96,7 @@ - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) - [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) -- [Spring Boot 2.x基础教程:@Async异步任务的线程池隔离](https://blog.didispace.com/spring-boot-learning-2-7-7) +- [Spring Boot 2.x基础教程:如何隔离@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-7) ### 常见问题 diff --git a/2.x/chapter7-7/pom.xml b/2.x/chapter7-7/pom.xml index bed2f64b..2a69afe0 100755 --- a/2.x/chapter7-7/pom.xml +++ b/2.x/chapter7-7/pom.xml @@ -11,9 +11,9 @@
com.didispace - chapter7-6 + chapter7-7 0.0.1-SNAPSHOT - @Async异步任务的线程池隔离 + 如何隔离@Async异步任务的线程池 1.8 diff --git a/2.x/chapter7-7/src/main/java/com/didispace/chapter77/AsyncTasks.java b/2.x/chapter7-7/src/main/java/com/didispace/chapter77/AsyncTasks.java index a538e379..90185dc8 100644 --- a/2.x/chapter7-7/src/main/java/com/didispace/chapter77/AsyncTasks.java +++ b/2.x/chapter7-7/src/main/java/com/didispace/chapter77/AsyncTasks.java @@ -6,7 +6,6 @@ import java.util.Random; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Future; @Slf4j @Component @@ -14,44 +13,24 @@ public class AsyncTasks { public static Random random = new Random(); - @Async - public CompletableFuture doTaskOne() throws Exception { - log.info("开始做任务一"); + @Async("taskExecutor1") + public CompletableFuture doTaskOne(String taskNo) throws Exception { + log.info("开始任务:{}", taskNo); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt(10000)); long end = System.currentTimeMillis(); - log.info("完成任务一,耗时:" + (end - start) + "毫秒"); - return CompletableFuture.completedFuture("任务一完成"); - } - - @Async - public CompletableFuture doTaskTwo() throws Exception { - log.info("开始做任务二"); - long start = System.currentTimeMillis(); - Thread.sleep(random.nextInt(10000)); - long end = System.currentTimeMillis(); - log.info("完成任务二,耗时:" + (end - start) + "毫秒"); - return CompletableFuture.completedFuture("任务二完成"); - } - - @Async - public CompletableFuture doTaskThree() throws Exception { - log.info("开始做任务三"); - long start = System.currentTimeMillis(); - Thread.sleep(random.nextInt(10000)); - long end = System.currentTimeMillis(); - log.info("完成任务三,耗时:" + (end - start) + "毫秒"); - return CompletableFuture.completedFuture("任务三完成"); + log.info("完成任务:{},耗时:{} 毫秒", taskNo, end - start); + return CompletableFuture.completedFuture("任务完成"); } @Async("taskExecutor2") - public CompletableFuture doTaskFour() throws Exception { - log.info("开始做任务四"); + public CompletableFuture doTaskTwo(String taskNo) throws Exception { + log.info("开始任务:{}", taskNo); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt(10000)); long end = System.currentTimeMillis(); - log.info("完成任务四,耗时:" + (end - start) + "毫秒"); - return CompletableFuture.completedFuture("任务四完成"); + log.info("完成任务:{},耗时:{} 毫秒", taskNo, end - start); + return CompletableFuture.completedFuture("任务完成"); } } \ No newline at end of file diff --git a/2.x/chapter7-7/src/main/java/com/didispace/chapter77/Chapter77Application.java b/2.x/chapter7-7/src/main/java/com/didispace/chapter77/Chapter77Application.java index 127eaf46..e598f26d 100644 --- a/2.x/chapter7-7/src/main/java/com/didispace/chapter77/Chapter77Application.java +++ b/2.x/chapter7-7/src/main/java/com/didispace/chapter77/Chapter77Application.java @@ -16,27 +16,39 @@ @EnableAsync @SpringBootApplication -public class Chapter76Application { +public class Chapter77Application { public static void main(String[] args) { - SpringApplication.run(Chapter76Application.class, args); + SpringApplication.run(Chapter77Application.class, args); } @EnableAsync @Configuration class TaskPoolConfig { -// @Bean -// public Executor taskExecutor2() { -// ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); -// executor.setCorePoolSize(1); -// executor.setMaxPoolSize(2); -// executor.setQueueCapacity(50); -// executor.setKeepAliveSeconds(60); -// executor.setThreadNamePrefix("taskExecutor2-"); -// executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); -// return executor; -// } + @Bean + public Executor taskExecutor1() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(2); + executor.setMaxPoolSize(2); + executor.setQueueCapacity(10); + executor.setKeepAliveSeconds(60); + executor.setThreadNamePrefix("executor-1-"); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } + + @Bean + public Executor taskExecutor2() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(2); + executor.setMaxPoolSize(2); + executor.setQueueCapacity(10); + executor.setKeepAliveSeconds(60); + executor.setThreadNamePrefix("executor-2-"); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } } diff --git a/2.x/chapter7-7/src/main/resources/application.properties b/2.x/chapter7-7/src/main/resources/application.properties index 070a4b71..e69de29b 100644 --- a/2.x/chapter7-7/src/main/resources/application.properties +++ b/2.x/chapter7-7/src/main/resources/application.properties @@ -1,9 +0,0 @@ -spring.task.execution.pool.core-size=2 -spring.task.execution.pool.max-size=5 -spring.task.execution.pool.queue-capacity=10 -spring.task.execution.pool.keep-alive=60s -spring.task.execution.pool.allow-core-thread-timeout=true -spring.task.execution.thread-name-prefix=task- - -spring.task.execution.shutdown.await-termination=false -spring.task.execution.shutdown.await-termination-period=30s \ No newline at end of file diff --git a/2.x/chapter7-7/src/test/java/com/didispace/chapter77/Chapter77ApplicationTests.java b/2.x/chapter7-7/src/test/java/com/didispace/chapter77/Chapter77ApplicationTests.java index 84f52c48..d6479787 100644 --- a/2.x/chapter7-7/src/test/java/com/didispace/chapter77/Chapter77ApplicationTests.java +++ b/2.x/chapter7-7/src/test/java/com/didispace/chapter77/Chapter77ApplicationTests.java @@ -1,4 +1,4 @@ -package com.didispace.chapter76; +package com.didispace.chapter77; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; @@ -10,35 +10,27 @@ @Slf4j @SpringBootTest -public class Chapter76ApplicationTests { +public class Chapter77ApplicationTests { @Autowired private AsyncTasks asyncTasks; @Test - public void test1() throws Exception { + public void test() throws Exception { long start = System.currentTimeMillis(); - CompletableFuture task1 = asyncTasks.doTaskOne(); - CompletableFuture task2 = asyncTasks.doTaskTwo(); - CompletableFuture task3 = asyncTasks.doTaskThree(); + // 线程池1 + CompletableFuture task1 = asyncTasks.doTaskOne("1"); + CompletableFuture task2 = asyncTasks.doTaskOne("2"); + CompletableFuture task3 = asyncTasks.doTaskOne("3"); - CompletableFuture.allOf(task1, task2, task3).join(); + // 线程池2 + CompletableFuture task4 = asyncTasks.doTaskTwo("4"); + CompletableFuture task5 = asyncTasks.doTaskTwo("5"); + CompletableFuture task6 = asyncTasks.doTaskTwo("6"); - long end = System.currentTimeMillis(); - - log.info("任务全部完成,总耗时:" + (end - start) + "毫秒"); - } - - @Test - public void test2() throws Exception { - long start = System.currentTimeMillis(); - - CompletableFuture task1 = asyncTasks.doTaskFour(); - CompletableFuture task2 = asyncTasks.doTaskFour(); - CompletableFuture task3 = asyncTasks.doTaskFour(); - - CompletableFuture.allOf(task1, task2, task3).join(); + // 一起执行 + CompletableFuture.allOf(task1, task2, task3, task4, task5, task6).join(); long end = System.currentTimeMillis(); diff --git a/2.x/pom.xml b/2.x/pom.xml index e940e683..1a260592 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -77,7 +77,7 @@ chapter7-4 chapter7-5 chapter7-6 - + chapter7-7 chapter8-1 From 9feeec755da9b5b54bfc115236652983c572c6e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 22 Sep 2021 17:03:27 +0800 Subject: [PATCH 141/160] =?UTF-8?q?=E4=B8=BA@Async=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=BA=BF=E7=A8=8B=E6=B1=A0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=8B=92=E7=BB=9D=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 1 + 2.x/README_zh.md | 1 + 2.x/chapter7-8/pom.xml | 50 +++++++++++++++ .../com/didispace/chapter78/AsyncTasks.java | 36 +++++++++++ .../chapter78/Chapter78Application.java | 45 ++++++++++++++ .../src/main/resources/application.properties | 0 .../chapter78/Chapter78ApplicationTests.java | 61 +++++++++++++++++++ 2.x/pom.xml | 4 +- 8 files changed, 197 insertions(+), 1 deletion(-) create mode 100755 2.x/chapter7-8/pom.xml create mode 100644 2.x/chapter7-8/src/main/java/com/didispace/chapter78/AsyncTasks.java create mode 100644 2.x/chapter7-8/src/main/java/com/didispace/chapter78/Chapter78Application.java create mode 100644 2.x/chapter7-8/src/main/resources/application.properties create mode 100644 2.x/chapter7-8/src/test/java/com/didispace/chapter78/Chapter78ApplicationTests.java diff --git a/2.x/README.md b/2.x/README.md index 936fa1b3..324ba82b 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -95,6 +95,7 @@ - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) - [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) - [Spring Boot 2.x基础教程:如何隔离@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-7) +- [Spring Boot 2.x基础教程:为@Async异步任务线程池配置拒绝策略](https://blog.didispace.com/spring-boot-learning-2-7-8) ### 常见问题 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 0c10db16..c1f7c929 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -97,6 +97,7 @@ - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) - [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) - [Spring Boot 2.x基础教程:如何隔离@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-7) +- [Spring Boot 2.x基础教程:为@Async异步任务的线程池设置拒绝策略](https://blog.didispace.com/spring-boot-learning-2-7-8) ### 常见问题 diff --git a/2.x/chapter7-8/pom.xml b/2.x/chapter7-8/pom.xml new file mode 100755 index 00000000..40158a94 --- /dev/null +++ b/2.x/chapter7-8/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + com.didispace + chapter7-8 + 0.0.1-SNAPSHOT + 为@Async异步任务线程池配置拒绝策略 + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/2.x/chapter7-8/src/main/java/com/didispace/chapter78/AsyncTasks.java b/2.x/chapter7-8/src/main/java/com/didispace/chapter78/AsyncTasks.java new file mode 100644 index 00000000..c6a78519 --- /dev/null +++ b/2.x/chapter7-8/src/main/java/com/didispace/chapter78/AsyncTasks.java @@ -0,0 +1,36 @@ +package com.didispace.chapter78; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.util.Random; +import java.util.concurrent.CompletableFuture; + +@Slf4j +@Component +public class AsyncTasks { + + public static Random random = new Random(); + + @Async("taskExecutor1") + public CompletableFuture doTaskOne(String taskNo) throws Exception { + log.info("开始任务:{}", taskNo); + long start = System.currentTimeMillis(); + Thread.sleep(random.nextInt(10000)); + long end = System.currentTimeMillis(); + log.info("完成任务:{},耗时:{} 毫秒", taskNo, end - start); + return CompletableFuture.completedFuture("任务完成"); + } + + @Async("taskExecutor2") + public CompletableFuture doTaskTwo(String taskNo) throws Exception { + log.info("开始任务:{}", taskNo); + long start = System.currentTimeMillis(); + Thread.sleep(random.nextInt(10000)); + long end = System.currentTimeMillis(); + log.info("完成任务:{},耗时:{} 毫秒", taskNo, end - start); + return CompletableFuture.completedFuture("任务完成"); + } + +} \ No newline at end of file diff --git a/2.x/chapter7-8/src/main/java/com/didispace/chapter78/Chapter78Application.java b/2.x/chapter7-8/src/main/java/com/didispace/chapter78/Chapter78Application.java new file mode 100644 index 00000000..04870377 --- /dev/null +++ b/2.x/chapter7-8/src/main/java/com/didispace/chapter78/Chapter78Application.java @@ -0,0 +1,45 @@ +package com.didispace.chapter78; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@EnableAsync +@SpringBootApplication +public class Chapter78Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter78Application.class, args); + } + + @EnableAsync + @Configuration + class TaskPoolConfig { + + @Bean + public Executor taskExecutor1() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(2); + executor.setMaxPoolSize(2); + executor.setQueueCapacity(2); + executor.setKeepAliveSeconds(60); + executor.setThreadNamePrefix("executor-1-"); + + // 配置拒绝策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } + + } + +} diff --git a/2.x/chapter7-8/src/main/resources/application.properties b/2.x/chapter7-8/src/main/resources/application.properties new file mode 100644 index 00000000..e69de29b diff --git a/2.x/chapter7-8/src/test/java/com/didispace/chapter78/Chapter78ApplicationTests.java b/2.x/chapter7-8/src/test/java/com/didispace/chapter78/Chapter78ApplicationTests.java new file mode 100644 index 00000000..6b9a3919 --- /dev/null +++ b/2.x/chapter7-8/src/test/java/com/didispace/chapter78/Chapter78ApplicationTests.java @@ -0,0 +1,61 @@ +package com.didispace.chapter78; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; + +@Slf4j +@SpringBootTest +public class Chapter78ApplicationTests { + + @Autowired + private AsyncTasks asyncTasks; + + @Test + public void test() throws Exception { + // 线程池配置:core-2,max-2,queue=2,可以容纳4个任务提交 + + long start = System.currentTimeMillis(); + + // 线程池1 + CompletableFuture task1 = asyncTasks.doTaskOne("1"); + CompletableFuture task2 = asyncTasks.doTaskOne("2"); + CompletableFuture task3 = asyncTasks.doTaskOne("3"); + CompletableFuture task4 = asyncTasks.doTaskOne("4"); + + // 一起执行 + CompletableFuture.allOf(task1, task2, task3, task4).join(); + + long end = System.currentTimeMillis(); + + log.info("任务全部完成,总耗时:" + (end - start) + "毫秒"); + } + + @Test + public void test2() throws Exception { + // 线程池配置:core-2,max-2,queue=2,同时有5个任务,出现下面异常: + // org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@59901c4d[Running, pool size = 2, + // active threads = 0, queued tasks = 2, completed tasks = 4]] did not accept task: java.util.concurrent.CompletableFuture$AsyncSupply@408e96d9 + + long start = System.currentTimeMillis(); + + // 线程池1 + CompletableFuture task1 = asyncTasks.doTaskOne("1"); + CompletableFuture task2 = asyncTasks.doTaskOne("2"); + CompletableFuture task3 = asyncTasks.doTaskOne("3"); + CompletableFuture task4 = asyncTasks.doTaskOne("4"); + CompletableFuture task5 = asyncTasks.doTaskOne("5"); + + // 一起执行 + CompletableFuture.allOf(task1, task2, task3, task4, task5).join(); + + long end = System.currentTimeMillis(); + + log.info("任务全部完成,总耗时:" + (end - start) + "毫秒"); + } + +} diff --git a/2.x/pom.xml b/2.x/pom.xml index 1a260592..293aad51 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -77,7 +77,9 @@ chapter7-4 chapter7-5 chapter7-6 - chapter7-7 + chapter7-7 + chapter7-8 + chapter8-1 From ddcb8cc33230cf7465f31f4d347ca2b870703714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 22 Sep 2021 17:50:49 +0800 Subject: [PATCH 142/160] =?UTF-8?q?=E4=B8=BA@Async=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=BA=BF=E7=A8=8B=E6=B1=A0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=8B=92=E7=BB=9D=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/didispace/chapter78/AsyncTasks.java | 10 -------- .../chapter78/Chapter78Application.java | 25 +++++++++++++++++-- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/2.x/chapter7-8/src/main/java/com/didispace/chapter78/AsyncTasks.java b/2.x/chapter7-8/src/main/java/com/didispace/chapter78/AsyncTasks.java index c6a78519..5cb782f5 100644 --- a/2.x/chapter7-8/src/main/java/com/didispace/chapter78/AsyncTasks.java +++ b/2.x/chapter7-8/src/main/java/com/didispace/chapter78/AsyncTasks.java @@ -23,14 +23,4 @@ public CompletableFuture doTaskOne(String taskNo) throws Exception { return CompletableFuture.completedFuture("任务完成"); } - @Async("taskExecutor2") - public CompletableFuture doTaskTwo(String taskNo) throws Exception { - log.info("开始任务:{}", taskNo); - long start = System.currentTimeMillis(); - Thread.sleep(random.nextInt(10000)); - long end = System.currentTimeMillis(); - log.info("完成任务:{},耗时:{} 毫秒", taskNo, end - start); - return CompletableFuture.completedFuture("任务完成"); - } - } \ No newline at end of file diff --git a/2.x/chapter7-8/src/main/java/com/didispace/chapter78/Chapter78Application.java b/2.x/chapter7-8/src/main/java/com/didispace/chapter78/Chapter78Application.java index 04870377..c8573f87 100644 --- a/2.x/chapter7-8/src/main/java/com/didispace/chapter78/Chapter78Application.java +++ b/2.x/chapter7-8/src/main/java/com/didispace/chapter78/Chapter78Application.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.Executor; +import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; @EnableAsync @@ -35,8 +36,28 @@ public Executor taskExecutor1() { executor.setKeepAliveSeconds(60); executor.setThreadNamePrefix("executor-1-"); - // 配置拒绝策略 - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + /**配置拒绝策略**/ + + // AbortPolicy策略:默认策略,如果线程池队列满了丢掉这个任务并且抛出RejectedExecutionException异常。 +// executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); + + // DiscardPolicy策略:如果线程池队列满了,会直接丢掉这个任务并且不会有任何异常。 +// executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); + + // DiscardOldestPolicy策略:如果队列满了,会将最早进入队列的任务删掉腾出空间,再尝试加入队列。 +// executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy()); + + // CallerRunsPolicy策略:如果添加到线程池失败,那么主线程会自己去执行该任务,不会等待线程池中的线程去执行。 +// executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + + // 自定义策略 +// executor.setRejectedExecutionHandler(new RejectedExecutionHandler() { +// @Override +// public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { +// +// } +// }); + return executor; } From 832f5549e32dc3bcb14387763773a403aee542c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 22 Sep 2021 18:00:34 +0800 Subject: [PATCH 143/160] =?UTF-8?q?=E4=B8=BA@Async=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=BA=BF=E7=A8=8B=E6=B1=A0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=8B=92=E7=BB=9D=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/didispace/chapter78/Chapter78Application.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/2.x/chapter7-8/src/main/java/com/didispace/chapter78/Chapter78Application.java b/2.x/chapter7-8/src/main/java/com/didispace/chapter78/Chapter78Application.java index c8573f87..f04169be 100644 --- a/2.x/chapter7-8/src/main/java/com/didispace/chapter78/Chapter78Application.java +++ b/2.x/chapter7-8/src/main/java/com/didispace/chapter78/Chapter78Application.java @@ -1,19 +1,13 @@ package com.didispace.chapter78; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.Executor; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadPoolExecutor; @EnableAsync @SpringBootApplication From f3e71f55bb8ff1ce70cc040ff069b6e5401081fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 22 Sep 2021 18:53:45 +0800 Subject: [PATCH 144/160] =?UTF-8?q?=E4=B8=BA@Async=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=BA=BF=E7=A8=8B=E6=B1=A0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=8B=92=E7=BB=9D=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 4 ++-- 2.x/README_zh.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index 324ba82b..a6627efd 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -90,12 +90,12 @@ - [Spring Boot 2.x基础教程:使用Elastic Job的分片配置提高执行效率](https://blog.didispace.com/spring-boot-learning-2-7-3) - [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) -**异步任务* +**异步任务** - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) - [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) - [Spring Boot 2.x基础教程:如何隔离@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-7) -- [Spring Boot 2.x基础教程:为@Async异步任务线程池配置拒绝策略](https://blog.didispace.com/spring-boot-learning-2-7-8) +- [Spring Boot 2.x基础教程:配置线程池的拒绝策略](https://blog.didispace.com/spring-boot-learning-2-7-8) ### 常见问题 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index c1f7c929..fd94ee25 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -92,12 +92,12 @@ - [Spring Boot 2.x基础教程:使用Elastic Job的分片配置提高执行效率](https://blog.didispace.com/spring-boot-learning-2-7-3) - [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) -**异步任务* +**异步任务** - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) - [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) - [Spring Boot 2.x基础教程:如何隔离@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-7) -- [Spring Boot 2.x基础教程:为@Async异步任务的线程池设置拒绝策略](https://blog.didispace.com/spring-boot-learning-2-7-8) +- [Spring Boot 2.x基础教程:配置线程池的拒绝策略](https://blog.didispace.com/spring-boot-learning-2-7-8) ### 常见问题 From 0b83b965faebaa274aa4560f389119942b65810d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 22 Sep 2021 19:08:47 +0800 Subject: [PATCH 145/160] =?UTF-8?q?=E7=9B=AE=E5=BD=95=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 60 +++++++++------------------------------------------- README_zh.md | 60 +++++++++------------------------------------------- 2 files changed, 20 insertions(+), 100 deletions(-) diff --git a/README.md b/README.md index e962dabe..84dea730 100644 --- a/README.md +++ b/README.md @@ -1,75 +1,35 @@ # Spring Boot基础教程 -本项目内容为[《Spring Boot基础教程》](https://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 - **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) - **如何支持**: 1. 关注我的公众号”**程序猿DD**“ 2. 点个`Star`并`Follow`我 3. 把该仓库分享给更多的朋友 +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) + ## 教程目录 -该教程自2016年连载至今,因内容较多,经历过多个版本的迭代。为方便查看学习,这里重新做了整理,根据1.x版本和2.x版本做了区分汇总。 +该教程自2016年连载至今,因内容较多,经历过多个版本的迭代。 + +为方便查看学习,这里重新做了整理,根据1.x版本和2.x版本做了区分汇总。 可以通过下面的链接,进入具体版本的教程目录: -- [Spring Boot 2.x 版本教程](./2.x) -- [Spring Boot 1.x 版本教程](./1.x) +- [Spring Boot 2.x](./2.x) +- [Spring Boot 1.x](./1.x) > **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
## 推荐内容 - [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 -- [我的Spring Boot教程](https://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 -- [我的Spring Cloud教程](https://blog.didispace.com/spring-cloud-learning/):全网最早最全的免费Spring Cloud基础教程 +- [Spring Boot教程](https://blog.didispace.com/spring-boot-learning-2x/):全网Star最多的免费Spring Boot基础教程 +- [Spring Cloud教程](https://blog.didispace.com/spring-cloud-learning/):全网最早最全的免费Spring Cloud基础教程 - [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 -## 特别赞助商 - - - - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - - -
- -> 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` - -## 我的公众号 +**关注公众号,获得更多技术资讯** diff --git a/README_zh.md b/README_zh.md index e962dabe..84dea730 100644 --- a/README_zh.md +++ b/README_zh.md @@ -1,75 +1,35 @@ # Spring Boot基础教程 -本项目内容为[《Spring Boot基础教程》](https://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)的程序样例。 - **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) - **如何支持**: 1. 关注我的公众号”**程序猿DD**“ 2. 点个`Star`并`Follow`我 3. 把该仓库分享给更多的朋友 +**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) + ## 教程目录 -该教程自2016年连载至今,因内容较多,经历过多个版本的迭代。为方便查看学习,这里重新做了整理,根据1.x版本和2.x版本做了区分汇总。 +该教程自2016年连载至今,因内容较多,经历过多个版本的迭代。 + +为方便查看学习,这里重新做了整理,根据1.x版本和2.x版本做了区分汇总。 可以通过下面的链接,进入具体版本的教程目录: -- [Spring Boot 2.x 版本教程](./2.x) -- [Spring Boot 1.x 版本教程](./1.x) +- [Spring Boot 2.x](./2.x) +- [Spring Boot 1.x](./1.x) > **关注公众号:“程序猿DD”**,领取我整理的免费学习资料。
## 推荐内容 - [我的博客](http://blog.didispace.com):分享平时学习和实践过的技术内容 -- [我的Spring Boot教程](https://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/):全网Star最多的免费Spring Boot基础教程 -- [我的Spring Cloud教程](https://blog.didispace.com/spring-cloud-learning/):全网最早最全的免费Spring Cloud基础教程 +- [Spring Boot教程](https://blog.didispace.com/spring-boot-learning-2x/):全网Star最多的免费Spring Boot基础教程 +- [Spring Cloud教程](https://blog.didispace.com/spring-cloud-learning/):全网最早最全的免费Spring Cloud基础教程 - [知识星球](https://t.xiaomiquan.com/zfEiY3v):聊聊技术人的斜杠生活 -## 特别赞助商 - - - - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - - -
- -> 如果您也想赞助支持并出现在上表中的话,可以通过邮件联系我:`didi@didispace.com` - -## 我的公众号 +**关注公众号,获得更多技术资讯** From 28a71aa31d4288672aa7ad95c619b49951c4c543 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Thu, 23 Sep 2021 12:08:01 +0800 Subject: [PATCH 146/160] =?UTF-8?q?=E7=A7=BB=E9=99=A42.1.x=E7=9B=AE?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.1.x/README.md | 4 - 2.1.x/README_zh.md | 4 - 2.1.x/chapter1-1/.gitignore | 29 - 2.1.x/chapter1-1/pom.xml | 43 - .../chapter11/Chapter11Application.java | 13 - .../didispace/chapter11/HelloController.java | 14 - .../src/main/resources/application.properties | 1 - .../chapter11/Chapter11ApplicationTests.java | 36 - 2.1.x/chapter2-1/.gitignore | 29 - 2.1.x/chapter2-1/pom.xml | 50 - .../chapter21/Chapter21Application.java | 13 - .../java/com/didispace/chapter21/User.java | 12 - .../didispace/chapter21/UserController.java | 79 - .../src/main/resources/application.properties | 1 - .../chapter21/Chapter21ApplicationTests.java | 79 - 2.1.x/chapter2-2/.gitignore | 29 - 2.1.x/chapter2-2/pom.xml | 56 - .../chapter22/Chapter22Application.java | 15 - .../java/com/didispace/chapter22/User.java | 18 - .../didispace/chapter22/UserController.java | 56 - .../src/main/resources/application.properties | 13 - 2.1.x/chapter2-3/.gitignore | 29 - 2.1.x/chapter2-3/pom.xml | 56 - .../chapter23/Chapter23Application.java | 15 - .../java/com/didispace/chapter23/User.java | 32 - .../didispace/chapter23/UserController.java | 57 - .../src/main/resources/application.properties | 13 - 2.1.x/chapter2-4/.gitignore | 29 - 2.1.x/chapter2-4/pom.xml | 56 - .../chapter24/Chapter24Application.java | 61 - .../java/com/didispace/chapter24/User.java | 32 - .../didispace/chapter24/UserController.java | 57 - .../src/main/resources/application.properties | 16 - 2.1.x/chapter2-5/.gitignore | 29 - 2.1.x/chapter2-5/pom.xml | 102 -- .../generated-by-plugin/definitions.adoc | 22 - .../generated-by-plugin/overview.adoc | 38 - .../asciidoc/generated-by-plugin/paths.adoc | 265 ---- .../generated-by-plugin/security.adoc | 13 - .../docs/asciidoc/generated/definitions.adoc | 22 - .../src/docs/asciidoc/generated/overview.adoc | 38 - .../src/docs/asciidoc/generated/paths.adoc | 265 ---- .../src/docs/asciidoc/generated/security.adoc | 13 - .../src/docs/asciidoc/html/definitions.html | 603 ------- .../src/docs/asciidoc/html/overview.html | 591 ------- .../src/docs/asciidoc/html/paths.html | 1379 ----------------- .../src/docs/asciidoc/html/security.html | 553 ------- .../docs/confluence/generated/definitions.txt | 14 - .../docs/confluence/generated/overview.txt | 33 - .../src/docs/confluence/generated/paths.txt | 212 --- .../docs/confluence/generated/security.txt | 10 - .../docs/markdown/generated/definitions.md | 17 - .../src/docs/markdown/generated/overview.md | 34 - .../src/docs/markdown/generated/paths.md | 232 --- .../src/docs/markdown/generated/security.md | 12 - .../chapter25/Chapter25Application.java | 15 - .../java/com/didispace/chapter25/User.java | 18 - .../didispace/chapter25/UserController.java | 56 - .../src/main/resources/application.properties | 13 - .../chapter25/DemoApplicationTests.java | 71 - 2.1.x/chapter2-6/.gitignore | 29 - 2.1.x/chapter2-6/pom.xml | 49 - .../chapter26/Chapter26Application.java | 13 - .../java/com/didispace/chapter26/User.java | 12 - .../didispace/chapter26/UserController.java | 46 - .../src/main/resources/application.properties | 3 - 2.1.x/chapter2-7/.gitignore | 24 - 2.1.x/chapter2-7/pom.xml | 67 - .../chapter27/Chapter27Application.java | 15 - .../java/com/didispace/chapter27/User.java | 29 - .../didispace/chapter27/UserController.java | 45 - .../src/main/resources/application.properties | 2 - 2.1.x/chapter3-1/.gitignore | 29 - 2.1.x/chapter3-1/pom.xml | 58 - .../chapter31/Chapter31Application.java | 13 - .../java/com/didispace/chapter31/User.java | 13 - .../com/didispace/chapter31/UserService.java | 40 - .../didispace/chapter31/UserServiceImpl.java | 52 - .../src/main/resources/application.properties | 4 - .../chapter31/Chapter31ApplicationTests.java | 63 - 2.1.x/chapter3-10/.gitignore | 29 - 2.1.x/chapter3-10/pom.xml | 64 - .../chapter310/Chapter310Application.java | 25 - .../java/com/didispace/chapter310/User.java | 27 - .../didispace/chapter310/UserRepository.java | 22 - .../src/main/resources/application.properties | 7 - .../Chapter310ApplicationTests.java | 56 - 2.1.x/chapter3-2/.gitignore | 29 - 2.1.x/chapter3-2/pom.xml | 58 - .../chapter32/Chapter32Application.java | 13 - .../java/com/didispace/chapter32/User.java | 13 - .../com/didispace/chapter32/UserService.java | 40 - .../didispace/chapter32/UserServiceImpl.java | 52 - .../src/main/resources/application.properties | 17 - .../chapter32/Chapter32ApplicationTests.java | 69 - 2.1.x/chapter3-3/.gitignore | 29 - 2.1.x/chapter3-3/pom.xml | 70 - .../chapter33/Chapter33Application.java | 25 - .../java/com/didispace/chapter33/User.java | 13 - .../didispace/chapter33/UserController.java | 47 - .../com/didispace/chapter33/UserService.java | 40 - .../didispace/chapter33/UserServiceImpl.java | 52 - .../src/main/resources/application.properties | 29 - .../chapter33/Chapter33ApplicationTests.java | 69 - 2.1.x/chapter3-4/.gitignore | 29 - 2.1.x/chapter3-4/pom.xml | 64 - .../chapter34/Chapter34Application.java | 25 - .../java/com/didispace/chapter34/User.java | 26 - .../didispace/chapter34/UserRepository.java | 22 - .../src/main/resources/application.properties | 6 - .../chapter34/Chapter34ApplicationTests.java | 57 - 2.1.x/chapter3-5/.gitignore | 29 - 2.1.x/chapter3-5/pom.xml | 55 - .../chapter35/Chapter35Application.java | 13 - .../java/com/didispace/chapter35/User.java | 20 - .../com/didispace/chapter35/UserMapper.java | 23 - .../src/main/resources/application.properties | 4 - .../chapter35/Chapter35ApplicationTests.java | 33 - 2.1.x/chapter3-6/.gitignore | 29 - 2.1.x/chapter3-6/pom.xml | 55 - .../chapter36/Chapter36Application.java | 15 - .../com/didispace/chapter36/entity/User.java | 20 - .../chapter36/mapper/UserMapper.java | 18 - .../src/main/resources/application.properties | 6 - .../src/main/resources/mapper/UserMapper.xml | 13 - .../chapter36/Chapter36ApplicationTests.java | 32 - 2.1.x/chapter3-7/.gitignore | 29 - 2.1.x/chapter3-7/pom.xml | 59 - .../chapter37/Chapter37Application.java | 13 - .../chapter37/DataSourceConfiguration.java | 39 - .../src/main/resources/application.properties | 11 - .../chapter37/Chapter37ApplicationTests.java | 46 - 2.1.x/chapter3-8/.gitignore | 29 - 2.1.x/chapter3-8/pom.xml | 65 - .../chapter38/Chapter38Application.java | 15 - .../chapter38/DataSourceConfiguration.java | 29 - .../didispace/chapter38/PrimaryConfig.java | 70 - .../didispace/chapter38/SecondaryConfig.java | 62 - .../java/com/didispace/chapter38/p/User.java | 27 - .../didispace/chapter38/p/UserRepository.java | 15 - .../com/didispace/chapter38/s/Message.java | 29 - .../chapter38/s/MessageRepository.java | 14 - .../src/main/resources/application.properties | 16 - .../chapter38/Chapter38ApplicationTests.java | 42 - 2.1.x/chapter3-9/.gitignore | 29 - 2.1.x/chapter3-9/pom.xml | 56 - .../chapter39/Chapter39Application.java | 13 - .../chapter39/DataSourceConfiguration.java | 27 - .../didispace/chapter39/PrimaryConfig.java | 38 - .../didispace/chapter39/SecondaryConfig.java | 38 - .../chapter39/p/entity/UserPrimary.java | 20 - .../chapter39/p/mapper/UserMapperPrimary.java | 26 - .../chapter39/s/entity/UserSecondary.java | 20 - .../s/mapper/UserMapperSecondary.java | 25 - .../src/main/resources/application.properties | 13 - .../resources/mapper.primary/UserMapper.xml | 15 - .../resources/mapper.secondary/UserMapper.xml | 16 - .../chapter39/Chapter39ApplicationTests.java | 60 - 2.1.x/chapter4-1/.gitignore | 29 - 2.1.x/chapter4-1/pom.xml | 54 - .../chapter41/Chapter41Application.java | 13 - .../didispace/chapter41/HelloController.java | 19 - .../src/main/resources/application.properties | 1 - .../src/main/resources/templates/index.html | 10 - 2.1.x/chapter4-2/.gitignore | 29 - 2.1.x/chapter4-2/pom.xml | 54 - .../chapter42/Chapter42Application.java | 13 - .../didispace/chapter42/HelloController.java | 16 - .../src/main/resources/application.properties | 1 - .../src/main/resources/templates/index.html | 30 - 2.1.x/chapter5-1/.gitignore | 29 - 2.1.x/chapter5-1/pom.xml | 69 - .../chapter51/Chapter51Application.java | 15 - .../java/com/didispace/chapter51/User.java | 26 - .../didispace/chapter51/UserRepository.java | 26 - .../src/main/resources/application.properties | 7 - .../chapter51/Chapter51ApplicationTests.java | 34 - 2.1.x/chapter5-2/.gitignore | 29 - 2.1.x/chapter5-2/pom.xml | 74 - .../chapter52/Chapter52Application.java | 15 - .../java/com/didispace/chapter52/User.java | 26 - .../didispace/chapter52/UserRepository.java | 21 - .../src/main/resources/application.properties | 7 - .../chapter5-2/src/main/resources/ehcache.xml | 9 - .../chapter52/Chapter52ApplicationTests.java | 36 - 2.1.x/chapter5-3/.gitignore | 29 - 2.1.x/chapter5-3/pom.xml | 74 - .../chapter53/Chapter53Application.java | 50 - .../java/com/didispace/chapter53/User.java | 27 - .../didispace/chapter53/UserRepository.java | 21 - .../src/main/resources/application.properties | 17 - .../src/main/resources/ehcache-1.xml | 29 - .../src/main/resources/ehcache-2.xml | 29 - .../chapter53/Chapter53ApplicationTests.java | 36 - 2.1.x/chapter5-4/.gitignore | 29 - 2.1.x/chapter5-4/pom.xml | 74 - .../chapter54/Chapter54Application.java | 15 - .../java/com/didispace/chapter54/User.java | 27 - .../didispace/chapter54/UserRepository.java | 26 - .../src/main/resources/application.properties | 16 - .../chapter54/Chapter54ApplicationTests.java | 36 - 2.1.x/pom.xml | 60 - 202 files changed, 10105 deletions(-) delete mode 100644 2.1.x/README.md delete mode 100644 2.1.x/README_zh.md delete mode 100644 2.1.x/chapter1-1/.gitignore delete mode 100644 2.1.x/chapter1-1/pom.xml delete mode 100644 2.1.x/chapter1-1/src/main/java/com/didispace/chapter11/Chapter11Application.java delete mode 100644 2.1.x/chapter1-1/src/main/java/com/didispace/chapter11/HelloController.java delete mode 100644 2.1.x/chapter1-1/src/main/resources/application.properties delete mode 100644 2.1.x/chapter1-1/src/test/java/com/didispace/chapter11/Chapter11ApplicationTests.java delete mode 100644 2.1.x/chapter2-1/.gitignore delete mode 100644 2.1.x/chapter2-1/pom.xml delete mode 100644 2.1.x/chapter2-1/src/main/java/com/didispace/chapter21/Chapter21Application.java delete mode 100644 2.1.x/chapter2-1/src/main/java/com/didispace/chapter21/User.java delete mode 100644 2.1.x/chapter2-1/src/main/java/com/didispace/chapter21/UserController.java delete mode 100644 2.1.x/chapter2-1/src/main/resources/application.properties delete mode 100644 2.1.x/chapter2-1/src/test/java/com/didispace/chapter21/Chapter21ApplicationTests.java delete mode 100644 2.1.x/chapter2-2/.gitignore delete mode 100644 2.1.x/chapter2-2/pom.xml delete mode 100644 2.1.x/chapter2-2/src/main/java/com/didispace/chapter22/Chapter22Application.java delete mode 100644 2.1.x/chapter2-2/src/main/java/com/didispace/chapter22/User.java delete mode 100644 2.1.x/chapter2-2/src/main/java/com/didispace/chapter22/UserController.java delete mode 100644 2.1.x/chapter2-2/src/main/resources/application.properties delete mode 100644 2.1.x/chapter2-3/.gitignore delete mode 100644 2.1.x/chapter2-3/pom.xml delete mode 100644 2.1.x/chapter2-3/src/main/java/com/didispace/chapter23/Chapter23Application.java delete mode 100644 2.1.x/chapter2-3/src/main/java/com/didispace/chapter23/User.java delete mode 100644 2.1.x/chapter2-3/src/main/java/com/didispace/chapter23/UserController.java delete mode 100644 2.1.x/chapter2-3/src/main/resources/application.properties delete mode 100644 2.1.x/chapter2-4/.gitignore delete mode 100644 2.1.x/chapter2-4/pom.xml delete mode 100644 2.1.x/chapter2-4/src/main/java/com/didispace/chapter24/Chapter24Application.java delete mode 100644 2.1.x/chapter2-4/src/main/java/com/didispace/chapter24/User.java delete mode 100644 2.1.x/chapter2-4/src/main/java/com/didispace/chapter24/UserController.java delete mode 100644 2.1.x/chapter2-4/src/main/resources/application.properties delete mode 100644 2.1.x/chapter2-5/.gitignore delete mode 100644 2.1.x/chapter2-5/pom.xml delete mode 100644 2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/definitions.adoc delete mode 100644 2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/overview.adoc delete mode 100644 2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/paths.adoc delete mode 100644 2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/security.adoc delete mode 100644 2.1.x/chapter2-5/src/docs/asciidoc/generated/definitions.adoc delete mode 100644 2.1.x/chapter2-5/src/docs/asciidoc/generated/overview.adoc delete mode 100644 2.1.x/chapter2-5/src/docs/asciidoc/generated/paths.adoc delete mode 100644 2.1.x/chapter2-5/src/docs/asciidoc/generated/security.adoc delete mode 100644 2.1.x/chapter2-5/src/docs/asciidoc/html/definitions.html delete mode 100644 2.1.x/chapter2-5/src/docs/asciidoc/html/overview.html delete mode 100644 2.1.x/chapter2-5/src/docs/asciidoc/html/paths.html delete mode 100644 2.1.x/chapter2-5/src/docs/asciidoc/html/security.html delete mode 100644 2.1.x/chapter2-5/src/docs/confluence/generated/definitions.txt delete mode 100644 2.1.x/chapter2-5/src/docs/confluence/generated/overview.txt delete mode 100644 2.1.x/chapter2-5/src/docs/confluence/generated/paths.txt delete mode 100644 2.1.x/chapter2-5/src/docs/confluence/generated/security.txt delete mode 100644 2.1.x/chapter2-5/src/docs/markdown/generated/definitions.md delete mode 100644 2.1.x/chapter2-5/src/docs/markdown/generated/overview.md delete mode 100644 2.1.x/chapter2-5/src/docs/markdown/generated/paths.md delete mode 100644 2.1.x/chapter2-5/src/docs/markdown/generated/security.md delete mode 100644 2.1.x/chapter2-5/src/main/java/com/didispace/chapter25/Chapter25Application.java delete mode 100644 2.1.x/chapter2-5/src/main/java/com/didispace/chapter25/User.java delete mode 100644 2.1.x/chapter2-5/src/main/java/com/didispace/chapter25/UserController.java delete mode 100644 2.1.x/chapter2-5/src/main/resources/application.properties delete mode 100644 2.1.x/chapter2-5/src/test/java/com/didispace/chapter25/DemoApplicationTests.java delete mode 100644 2.1.x/chapter2-6/.gitignore delete mode 100644 2.1.x/chapter2-6/pom.xml delete mode 100644 2.1.x/chapter2-6/src/main/java/com/didispace/chapter26/Chapter26Application.java delete mode 100644 2.1.x/chapter2-6/src/main/java/com/didispace/chapter26/User.java delete mode 100644 2.1.x/chapter2-6/src/main/java/com/didispace/chapter26/UserController.java delete mode 100644 2.1.x/chapter2-6/src/main/resources/application.properties delete mode 100644 2.1.x/chapter2-7/.gitignore delete mode 100644 2.1.x/chapter2-7/pom.xml delete mode 100644 2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/Chapter27Application.java delete mode 100644 2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/User.java delete mode 100644 2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/UserController.java delete mode 100644 2.1.x/chapter2-7/src/main/resources/application.properties delete mode 100644 2.1.x/chapter3-1/.gitignore delete mode 100644 2.1.x/chapter3-1/pom.xml delete mode 100644 2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/Chapter31Application.java delete mode 100644 2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/User.java delete mode 100644 2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/UserService.java delete mode 100644 2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/UserServiceImpl.java delete mode 100644 2.1.x/chapter3-1/src/main/resources/application.properties delete mode 100644 2.1.x/chapter3-1/src/test/java/com/didispace/chapter31/Chapter31ApplicationTests.java delete mode 100644 2.1.x/chapter3-10/.gitignore delete mode 100644 2.1.x/chapter3-10/pom.xml delete mode 100644 2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/Chapter310Application.java delete mode 100644 2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/User.java delete mode 100644 2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/UserRepository.java delete mode 100644 2.1.x/chapter3-10/src/main/resources/application.properties delete mode 100644 2.1.x/chapter3-10/src/test/java/com/didispace/chapter310/Chapter310ApplicationTests.java delete mode 100644 2.1.x/chapter3-2/.gitignore delete mode 100644 2.1.x/chapter3-2/pom.xml delete mode 100644 2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/Chapter32Application.java delete mode 100644 2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/User.java delete mode 100644 2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/UserService.java delete mode 100644 2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/UserServiceImpl.java delete mode 100644 2.1.x/chapter3-2/src/main/resources/application.properties delete mode 100644 2.1.x/chapter3-2/src/test/java/com/didispace/chapter32/Chapter32ApplicationTests.java delete mode 100644 2.1.x/chapter3-3/.gitignore delete mode 100644 2.1.x/chapter3-3/pom.xml delete mode 100644 2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/Chapter33Application.java delete mode 100644 2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/User.java delete mode 100644 2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/UserController.java delete mode 100644 2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/UserService.java delete mode 100644 2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/UserServiceImpl.java delete mode 100644 2.1.x/chapter3-3/src/main/resources/application.properties delete mode 100644 2.1.x/chapter3-3/src/test/java/com/didispace/chapter33/Chapter33ApplicationTests.java delete mode 100644 2.1.x/chapter3-4/.gitignore delete mode 100644 2.1.x/chapter3-4/pom.xml delete mode 100644 2.1.x/chapter3-4/src/main/java/com/didispace/chapter34/Chapter34Application.java delete mode 100644 2.1.x/chapter3-4/src/main/java/com/didispace/chapter34/User.java delete mode 100644 2.1.x/chapter3-4/src/main/java/com/didispace/chapter34/UserRepository.java delete mode 100644 2.1.x/chapter3-4/src/main/resources/application.properties delete mode 100644 2.1.x/chapter3-4/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java delete mode 100644 2.1.x/chapter3-5/.gitignore delete mode 100644 2.1.x/chapter3-5/pom.xml delete mode 100644 2.1.x/chapter3-5/src/main/java/com/didispace/chapter35/Chapter35Application.java delete mode 100644 2.1.x/chapter3-5/src/main/java/com/didispace/chapter35/User.java delete mode 100644 2.1.x/chapter3-5/src/main/java/com/didispace/chapter35/UserMapper.java delete mode 100644 2.1.x/chapter3-5/src/main/resources/application.properties delete mode 100644 2.1.x/chapter3-5/src/test/java/com/didispace/chapter35/Chapter35ApplicationTests.java delete mode 100644 2.1.x/chapter3-6/.gitignore delete mode 100644 2.1.x/chapter3-6/pom.xml delete mode 100644 2.1.x/chapter3-6/src/main/java/com/didispace/chapter36/Chapter36Application.java delete mode 100644 2.1.x/chapter3-6/src/main/java/com/didispace/chapter36/entity/User.java delete mode 100644 2.1.x/chapter3-6/src/main/java/com/didispace/chapter36/mapper/UserMapper.java delete mode 100644 2.1.x/chapter3-6/src/main/resources/application.properties delete mode 100644 2.1.x/chapter3-6/src/main/resources/mapper/UserMapper.xml delete mode 100644 2.1.x/chapter3-6/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java delete mode 100644 2.1.x/chapter3-7/.gitignore delete mode 100644 2.1.x/chapter3-7/pom.xml delete mode 100644 2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/Chapter37Application.java delete mode 100644 2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/DataSourceConfiguration.java delete mode 100644 2.1.x/chapter3-7/src/main/resources/application.properties delete mode 100644 2.1.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java delete mode 100644 2.1.x/chapter3-8/.gitignore delete mode 100644 2.1.x/chapter3-8/pom.xml delete mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java delete mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java delete mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java delete mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java delete mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java delete mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java delete mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/Message.java delete mode 100644 2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/MessageRepository.java delete mode 100644 2.1.x/chapter3-8/src/main/resources/application.properties delete mode 100644 2.1.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java delete mode 100644 2.1.x/chapter3-9/.gitignore delete mode 100644 2.1.x/chapter3-9/pom.xml delete mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java delete mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/DataSourceConfiguration.java delete mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java delete mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java delete mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/entity/UserPrimary.java delete mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/mapper/UserMapperPrimary.java delete mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/entity/UserSecondary.java delete mode 100644 2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/mapper/UserMapperSecondary.java delete mode 100644 2.1.x/chapter3-9/src/main/resources/application.properties delete mode 100644 2.1.x/chapter3-9/src/main/resources/mapper.primary/UserMapper.xml delete mode 100644 2.1.x/chapter3-9/src/main/resources/mapper.secondary/UserMapper.xml delete mode 100644 2.1.x/chapter3-9/src/test/java/com/didispace/chapter39/Chapter39ApplicationTests.java delete mode 100644 2.1.x/chapter4-1/.gitignore delete mode 100644 2.1.x/chapter4-1/pom.xml delete mode 100644 2.1.x/chapter4-1/src/main/java/com/didispace/chapter41/Chapter41Application.java delete mode 100644 2.1.x/chapter4-1/src/main/java/com/didispace/chapter41/HelloController.java delete mode 100644 2.1.x/chapter4-1/src/main/resources/application.properties delete mode 100644 2.1.x/chapter4-1/src/main/resources/templates/index.html delete mode 100644 2.1.x/chapter4-2/.gitignore delete mode 100644 2.1.x/chapter4-2/pom.xml delete mode 100644 2.1.x/chapter4-2/src/main/java/com/didispace/chapter42/Chapter42Application.java delete mode 100644 2.1.x/chapter4-2/src/main/java/com/didispace/chapter42/HelloController.java delete mode 100644 2.1.x/chapter4-2/src/main/resources/application.properties delete mode 100644 2.1.x/chapter4-2/src/main/resources/templates/index.html delete mode 100644 2.1.x/chapter5-1/.gitignore delete mode 100644 2.1.x/chapter5-1/pom.xml delete mode 100644 2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/Chapter51Application.java delete mode 100644 2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/User.java delete mode 100644 2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/UserRepository.java delete mode 100644 2.1.x/chapter5-1/src/main/resources/application.properties delete mode 100644 2.1.x/chapter5-1/src/test/java/com/didispace/chapter51/Chapter51ApplicationTests.java delete mode 100644 2.1.x/chapter5-2/.gitignore delete mode 100644 2.1.x/chapter5-2/pom.xml delete mode 100644 2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/Chapter52Application.java delete mode 100644 2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/User.java delete mode 100644 2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/UserRepository.java delete mode 100644 2.1.x/chapter5-2/src/main/resources/application.properties delete mode 100644 2.1.x/chapter5-2/src/main/resources/ehcache.xml delete mode 100644 2.1.x/chapter5-2/src/test/java/com/didispace/chapter52/Chapter52ApplicationTests.java delete mode 100644 2.1.x/chapter5-3/.gitignore delete mode 100644 2.1.x/chapter5-3/pom.xml delete mode 100644 2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/Chapter53Application.java delete mode 100644 2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/User.java delete mode 100644 2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/UserRepository.java delete mode 100644 2.1.x/chapter5-3/src/main/resources/application.properties delete mode 100644 2.1.x/chapter5-3/src/main/resources/ehcache-1.xml delete mode 100644 2.1.x/chapter5-3/src/main/resources/ehcache-2.xml delete mode 100644 2.1.x/chapter5-3/src/test/java/com/didispace/chapter53/Chapter53ApplicationTests.java delete mode 100644 2.1.x/chapter5-4/.gitignore delete mode 100644 2.1.x/chapter5-4/pom.xml delete mode 100644 2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/Chapter54Application.java delete mode 100644 2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/User.java delete mode 100644 2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/UserRepository.java delete mode 100644 2.1.x/chapter5-4/src/main/resources/application.properties delete mode 100644 2.1.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java delete mode 100644 2.1.x/pom.xml diff --git a/2.1.x/README.md b/2.1.x/README.md deleted file mode 100644 index 5f07e37b..00000000 --- a/2.1.x/README.md +++ /dev/null @@ -1,4 +0,0 @@ -该目录下内容已迁移道`2.x`目录,本文件夹不继续维护。 - -- 教程汇总(1.x版本):[《Spring Boot基础教程》](https://blog.didispace.com/spring-boot-learning-1x/) -- 教程汇总(2.x版本):[《Spring Boot基础教程》](https://blog.didispace.com/spring-boot-learning-2x/) diff --git a/2.1.x/README_zh.md b/2.1.x/README_zh.md deleted file mode 100644 index 5f07e37b..00000000 --- a/2.1.x/README_zh.md +++ /dev/null @@ -1,4 +0,0 @@ -该目录下内容已迁移道`2.x`目录,本文件夹不继续维护。 - -- 教程汇总(1.x版本):[《Spring Boot基础教程》](https://blog.didispace.com/spring-boot-learning-1x/) -- 教程汇总(2.x版本):[《Spring Boot基础教程》](https://blog.didispace.com/spring-boot-learning-2x/) diff --git a/2.1.x/chapter1-1/.gitignore b/2.1.x/chapter1-1/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter1-1/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter1-1/pom.xml b/2.1.x/chapter1-1/pom.xml deleted file mode 100644 index d849128d..00000000 --- a/2.1.x/chapter1-1/pom.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - com.didispace - chapter1-1 - 0.0.1-SNAPSHOT - chapter1-1 - Demo project for Spring Boot - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter1-1/src/main/java/com/didispace/chapter11/Chapter11Application.java b/2.1.x/chapter1-1/src/main/java/com/didispace/chapter11/Chapter11Application.java deleted file mode 100644 index 17cd4a7c..00000000 --- a/2.1.x/chapter1-1/src/main/java/com/didispace/chapter11/Chapter11Application.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.didispace.chapter11; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Chapter11Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter11Application.class, args); - } - -} diff --git a/2.1.x/chapter1-1/src/main/java/com/didispace/chapter11/HelloController.java b/2.1.x/chapter1-1/src/main/java/com/didispace/chapter11/HelloController.java deleted file mode 100644 index d19b5ef6..00000000 --- a/2.1.x/chapter1-1/src/main/java/com/didispace/chapter11/HelloController.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.didispace.chapter11; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class HelloController { - - @RequestMapping("/hello") - public String index() { - return "Hello World"; - } - -} \ No newline at end of file diff --git a/2.1.x/chapter1-1/src/main/resources/application.properties b/2.1.x/chapter1-1/src/main/resources/application.properties deleted file mode 100644 index 8b137891..00000000 --- a/2.1.x/chapter1-1/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/2.1.x/chapter1-1/src/test/java/com/didispace/chapter11/Chapter11ApplicationTests.java b/2.1.x/chapter1-1/src/test/java/com/didispace/chapter11/Chapter11ApplicationTests.java deleted file mode 100644 index 79cbf107..00000000 --- a/2.1.x/chapter1-1/src/test/java/com/didispace/chapter11/Chapter11ApplicationTests.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.didispace.chapter11; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; - -import static org.hamcrest.Matchers.equalTo; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - - -@RunWith(SpringRunner.class) -@SpringBootTest -public class Chapter11ApplicationTests { - - private MockMvc mvc; - - @Before - public void setUp() { - mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build(); - } - - @Test - public void getHello() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string(equalTo("Hello World"))); - } - -} diff --git a/2.1.x/chapter2-1/.gitignore b/2.1.x/chapter2-1/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter2-1/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter2-1/pom.xml b/2.1.x/chapter2-1/pom.xml deleted file mode 100644 index 8c292e60..00000000 --- a/2.1.x/chapter2-1/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter2-1 - 0.0.1-SNAPSHOT - chapter2-1 - Demo project for Spring Boot - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.projectlombok - lombok - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter2-1/src/main/java/com/didispace/chapter21/Chapter21Application.java b/2.1.x/chapter2-1/src/main/java/com/didispace/chapter21/Chapter21Application.java deleted file mode 100644 index 936e8024..00000000 --- a/2.1.x/chapter2-1/src/main/java/com/didispace/chapter21/Chapter21Application.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.didispace.chapter21; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Chapter21Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter21Application.class, args); - } - -} diff --git a/2.1.x/chapter2-1/src/main/java/com/didispace/chapter21/User.java b/2.1.x/chapter2-1/src/main/java/com/didispace/chapter21/User.java deleted file mode 100644 index 1f8749c1..00000000 --- a/2.1.x/chapter2-1/src/main/java/com/didispace/chapter21/User.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.didispace.chapter21; - -import lombok.Data; - -@Data -public class User { - - private Long id; - private String name; - private Integer age; - -} \ No newline at end of file diff --git a/2.1.x/chapter2-1/src/main/java/com/didispace/chapter21/UserController.java b/2.1.x/chapter2-1/src/main/java/com/didispace/chapter21/UserController.java deleted file mode 100644 index c855f1a9..00000000 --- a/2.1.x/chapter2-1/src/main/java/com/didispace/chapter21/UserController.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.didispace.chapter21; - -import org.springframework.web.bind.annotation.*; - -import java.util.*; - -@RestController -@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下 -public class UserController { - - // 创建线程安全的Map,模拟users信息的存储 - static Map users = Collections.synchronizedMap(new HashMap()); - - /** - * 处理"/users/"的GET请求,用来获取用户列表 - * - * @return - */ - @GetMapping("/") - public List getUserList() { - // 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递 - List r = new ArrayList(users.values()); - return r; - } - - /** - * 处理"/users/"的POST请求,用来创建User - * - * @param user - * @return - */ - @PostMapping("/") - public String postUser(@RequestBody User user) { - // @RequestBody注解用来绑定通过http请求中application/json类型上传的数据 - users.put(user.getId(), user); - return "success"; - } - - /** - * 处理"/users/{id}"的GET请求,用来获取url中id值的User信息 - * - * @param id - * @return - */ - @GetMapping("/{id}") - public User getUser(@PathVariable Long id) { - // url中的id可通过@PathVariable绑定到函数的参数中 - return users.get(id); - } - - /** - * 处理"/users/{id}"的PUT请求,用来更新User信息 - * - * @param id - * @param user - * @return - */ - @PutMapping("/{id}") - public String putUser(@PathVariable Long id, @RequestBody User user) { - User u = users.get(id); - u.setName(user.getName()); - u.setAge(user.getAge()); - users.put(id, u); - return "success"; - } - - /** - * 处理"/users/{id}"的DELETE请求,用来删除User - * - * @param id - * @return - */ - @DeleteMapping("/{id}") - public String deleteUser(@PathVariable Long id) { - users.remove(id); - return "success"; - } - -} \ No newline at end of file diff --git a/2.1.x/chapter2-1/src/main/resources/application.properties b/2.1.x/chapter2-1/src/main/resources/application.properties deleted file mode 100644 index 8b137891..00000000 --- a/2.1.x/chapter2-1/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/2.1.x/chapter2-1/src/test/java/com/didispace/chapter21/Chapter21ApplicationTests.java b/2.1.x/chapter2-1/src/test/java/com/didispace/chapter21/Chapter21ApplicationTests.java deleted file mode 100644 index 880d2823..00000000 --- a/2.1.x/chapter2-1/src/test/java/com/didispace/chapter21/Chapter21ApplicationTests.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.didispace.chapter21; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.RequestBuilder; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; - -import static org.hamcrest.Matchers.equalTo; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - - -@RunWith(SpringRunner.class) -@SpringBootTest -public class Chapter21ApplicationTests { - - private MockMvc mvc; - - @Before - public void setUp() { - mvc = MockMvcBuilders.standaloneSetup(new UserController()).build(); - } - - @Test - public void testUserController() throws Exception { - // 测试UserController - RequestBuilder request; - - // 1、get查一下user列表,应该为空 - request = get("/users/"); - mvc.perform(request) - .andExpect(status().isOk()) - .andExpect(content().string(equalTo("[]"))); - - // 2、post提交一个user - request = post("/users/") - .contentType(MediaType.APPLICATION_JSON) - .content("{\"id\":1,\"name\":\"测试大师\",\"age\":20}"); - mvc.perform(request) - .andExpect(content().string(equalTo("success"))); - - // 3、get获取user列表,应该有刚才插入的数据 - request = get("/users/"); - mvc.perform(request) - .andExpect(status().isOk()) - .andExpect(content().string(equalTo("[{\"id\":1,\"name\":\"测试大师\",\"age\":20}]"))); - - // 4、put修改id为1的user - request = put("/users/1") - .contentType(MediaType.APPLICATION_JSON) - .content("{\"name\":\"测试终极大师\",\"age\":30}"); - mvc.perform(request) - .andExpect(content().string(equalTo("success"))); - - // 5、get一个id为1的user - request = get("/users/1"); - mvc.perform(request) - .andExpect(content().string(equalTo("{\"id\":1,\"name\":\"测试终极大师\",\"age\":30}"))); - - // 6、del删除id为1的user - request = delete("/users/1"); - mvc.perform(request) - .andExpect(content().string(equalTo("success"))); - - // 7、get查一下user列表,应该为空 - request = get("/users/"); - mvc.perform(request) - .andExpect(status().isOk()) - .andExpect(content().string(equalTo("[]"))); - - } - -} diff --git a/2.1.x/chapter2-2/.gitignore b/2.1.x/chapter2-2/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter2-2/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter2-2/pom.xml b/2.1.x/chapter2-2/pom.xml deleted file mode 100644 index aa373bc4..00000000 --- a/2.1.x/chapter2-2/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter2-2 - 0.0.1-SNAPSHOT - chapter2-2 - Demo project for Spring Boot - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - com.spring4all - swagger-spring-boot-starter - 1.9.0.RELEASE - - - - org.projectlombok - lombok - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter2-2/src/main/java/com/didispace/chapter22/Chapter22Application.java b/2.1.x/chapter2-2/src/main/java/com/didispace/chapter22/Chapter22Application.java deleted file mode 100644 index cd6963b8..00000000 --- a/2.1.x/chapter2-2/src/main/java/com/didispace/chapter22/Chapter22Application.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.didispace.chapter22; - -import com.spring4all.swagger.EnableSwagger2Doc; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@EnableSwagger2Doc -@SpringBootApplication -public class Chapter22Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter22Application.class, args); - } - -} diff --git a/2.1.x/chapter2-2/src/main/java/com/didispace/chapter22/User.java b/2.1.x/chapter2-2/src/main/java/com/didispace/chapter22/User.java deleted file mode 100644 index 1a265300..00000000 --- a/2.1.x/chapter2-2/src/main/java/com/didispace/chapter22/User.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.didispace.chapter22; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description="用户实体") -public class User { - - @ApiModelProperty("用户编号") - private Long id; - @ApiModelProperty("用户姓名") - private String name; - @ApiModelProperty("用户年龄") - private Integer age; - -} \ No newline at end of file diff --git a/2.1.x/chapter2-2/src/main/java/com/didispace/chapter22/UserController.java b/2.1.x/chapter2-2/src/main/java/com/didispace/chapter22/UserController.java deleted file mode 100644 index cc517afb..00000000 --- a/2.1.x/chapter2-2/src/main/java/com/didispace/chapter22/UserController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.didispace.chapter22; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; - -import java.util.*; - -@Api(tags = "用户管理") -@RestController -@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下 -public class UserController { - - // 创建线程安全的Map,模拟users信息的存储 - static Map users = Collections.synchronizedMap(new HashMap<>()); - - @GetMapping("/") - @ApiOperation(value = "获取用户列表") - public List getUserList() { - List r = new ArrayList<>(users.values()); - return r; - } - - @PostMapping("/") - @ApiOperation(value = "创建用户", notes = "根据User对象创建用户") - public String postUser(@RequestBody User user) { - users.put(user.getId(), user); - return "success"; - } - - @GetMapping("/{id}") - @ApiOperation(value = "获取用户详细信息", notes = "根据url的id来获取用户详细信息") - public User getUser(@PathVariable Long id) { - return users.get(id); - } - - @PutMapping("/{id}") - @ApiImplicitParam(paramType = "path", dataType = "Long", name = "id", value = "用户编号", required = true, example = "1") - @ApiOperation(value = "更新用户详细信息", notes = "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息") - public String putUser(@PathVariable Long id, @RequestBody User user) { - User u = users.get(id); - u.setName(user.getName()); - u.setAge(user.getAge()); - users.put(id, u); - return "success"; - } - - @DeleteMapping("/{id}") - @ApiOperation(value = "删除用户", notes = "根据url的id来指定删除对象") - public String deleteUser(@PathVariable Long id) { - users.remove(id); - return "success"; - } - -} \ No newline at end of file diff --git a/2.1.x/chapter2-2/src/main/resources/application.properties b/2.1.x/chapter2-2/src/main/resources/application.properties deleted file mode 100644 index 55ec2942..00000000 --- a/2.1.x/chapter2-2/src/main/resources/application.properties +++ /dev/null @@ -1,13 +0,0 @@ - - -swagger.title=spring-boot-starter-swagger -swagger.description=Starter for swagger 2.x -swagger.version=1.9.0.RELEASE -swagger.license=Apache License, Version 2.0 -swagger.licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.html -swagger.termsOfServiceUrl=https://github.com/dyc87112/spring-boot-starter-swagger -swagger.contact.name=didi -swagger.contact.url=http://blog.didispace.com -swagger.contact.email=dyc87112@qq.com -swagger.base-package=com.didispace -swagger.base-path=/** \ No newline at end of file diff --git a/2.1.x/chapter2-3/.gitignore b/2.1.x/chapter2-3/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter2-3/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter2-3/pom.xml b/2.1.x/chapter2-3/pom.xml deleted file mode 100644 index 284c9d0d..00000000 --- a/2.1.x/chapter2-3/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter2-3 - 0.0.1-SNAPSHOT - chapter2-3 - Demo project for Spring Boot - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - com.spring4all - swagger-spring-boot-starter - 1.9.0.RELEASE - - - - org.projectlombok - lombok - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter2-3/src/main/java/com/didispace/chapter23/Chapter23Application.java b/2.1.x/chapter2-3/src/main/java/com/didispace/chapter23/Chapter23Application.java deleted file mode 100644 index 7ecdd42d..00000000 --- a/2.1.x/chapter2-3/src/main/java/com/didispace/chapter23/Chapter23Application.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.didispace.chapter23; - -import com.spring4all.swagger.EnableSwagger2Doc; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@EnableSwagger2Doc -@SpringBootApplication -public class Chapter23Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter23Application.class, args); - } - -} diff --git a/2.1.x/chapter2-3/src/main/java/com/didispace/chapter23/User.java b/2.1.x/chapter2-3/src/main/java/com/didispace/chapter23/User.java deleted file mode 100644 index 12f85c88..00000000 --- a/2.1.x/chapter2-3/src/main/java/com/didispace/chapter23/User.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.didispace.chapter23; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.*; - -@Data -@ApiModel(description = "用户实体") -public class User { - - @ApiModelProperty("用户编号") - private Long id; - - @NotNull - @Size(min = 2, max = 5) - @ApiModelProperty("用户姓名") - private String name; - - @NotNull - @Max(100) - @Min(10) - @ApiModelProperty("用户年龄") - private Integer age; - - @NotNull - @Email - @ApiModelProperty("用户邮箱") - private String email; - -} \ No newline at end of file diff --git a/2.1.x/chapter2-3/src/main/java/com/didispace/chapter23/UserController.java b/2.1.x/chapter2-3/src/main/java/com/didispace/chapter23/UserController.java deleted file mode 100644 index 963ac4c4..00000000 --- a/2.1.x/chapter2-3/src/main/java/com/didispace/chapter23/UserController.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.didispace.chapter23; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.*; - -@Api(tags = "用户管理") -@RestController -@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下 -public class UserController { - - // 创建线程安全的Map,模拟users信息的存储 - static Map users = Collections.synchronizedMap(new HashMap<>()); - - @GetMapping("/") - @ApiOperation(value = "获取用户列表") - public List getUserList() { - List r = new ArrayList<>(users.values()); - return r; - } - - @PostMapping("/") - @ApiOperation(value = "创建用户", notes = "根据User对象创建用户") - public String postUser(@Valid @RequestBody User user) { - users.put(user.getId(), user); - return "success"; - } - - @GetMapping("/{id}") - @ApiOperation(value = "获取用户详细信息", notes = "根据url的id来获取用户详细信息") - public User getUser(@PathVariable Long id) { - return users.get(id); - } - - @PutMapping("/{id}") - @ApiImplicitParam(paramType = "path", dataType = "Long", name = "id", value = "用户编号", required = true, example = "1") - @ApiOperation(value = "更新用户详细信息", notes = "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息") - public String putUser(@PathVariable Long id, @RequestBody User user) { - User u = users.get(id); - u.setName(user.getName()); - u.setAge(user.getAge()); - users.put(id, u); - return "success"; - } - - @DeleteMapping("/{id}") - @ApiOperation(value = "删除用户", notes = "根据url的id来指定删除对象") - public String deleteUser(@PathVariable Long id) { - users.remove(id); - return "success"; - } - -} \ No newline at end of file diff --git a/2.1.x/chapter2-3/src/main/resources/application.properties b/2.1.x/chapter2-3/src/main/resources/application.properties deleted file mode 100644 index 55ec2942..00000000 --- a/2.1.x/chapter2-3/src/main/resources/application.properties +++ /dev/null @@ -1,13 +0,0 @@ - - -swagger.title=spring-boot-starter-swagger -swagger.description=Starter for swagger 2.x -swagger.version=1.9.0.RELEASE -swagger.license=Apache License, Version 2.0 -swagger.licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.html -swagger.termsOfServiceUrl=https://github.com/dyc87112/spring-boot-starter-swagger -swagger.contact.name=didi -swagger.contact.url=http://blog.didispace.com -swagger.contact.email=dyc87112@qq.com -swagger.base-package=com.didispace -swagger.base-path=/** \ No newline at end of file diff --git a/2.1.x/chapter2-4/.gitignore b/2.1.x/chapter2-4/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter2-4/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter2-4/pom.xml b/2.1.x/chapter2-4/pom.xml deleted file mode 100644 index 8dcad73d..00000000 --- a/2.1.x/chapter2-4/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter2-4 - 0.0.1-SNAPSHOT - chapter2-4 - Demo project for Spring Boot - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - com.spring4all - swagger-spring-boot-starter - 1.9.0.RELEASE - - - - org.projectlombok - lombok - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter2-4/src/main/java/com/didispace/chapter24/Chapter24Application.java b/2.1.x/chapter2-4/src/main/java/com/didispace/chapter24/Chapter24Application.java deleted file mode 100644 index 736bc4f3..00000000 --- a/2.1.x/chapter2-4/src/main/java/com/didispace/chapter24/Chapter24Application.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.didispace.chapter24; - -import com.spring4all.swagger.EnableSwagger2Doc; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.Tag; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.ArrayList; -import java.util.List; - -@EnableSwagger2Doc -@SpringBootApplication -public class Chapter24Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter24Application.class, args); - } - - @Api(tags = {"1-教师管理","3-教学管理"}) - @RestController - @RequestMapping(value = "/teacher") - static class TeacherController { - - @ApiOperation(value = "xxx") - @GetMapping("/xxx") - public String xxx() { - return "xxx"; - } - - } - - @Api(tags = {"2-学生管理"}) - @RestController - @RequestMapping(value = "/student") - static class StudentController { - - @ApiOperation(value = "获取学生清单", tags = "3-教学管理") - @GetMapping("/list") - public String bbb() { - return "bbb"; - } - - @ApiOperation("获取教某个学生的老师清单") - @GetMapping("/his-teachers") - public String ccc() { - return "ccc"; - } - - @ApiOperation("创建一个学生") - @PostMapping("/aaa") - public String aaa() { - return "aaa"; - } - - } - -} diff --git a/2.1.x/chapter2-4/src/main/java/com/didispace/chapter24/User.java b/2.1.x/chapter2-4/src/main/java/com/didispace/chapter24/User.java deleted file mode 100644 index 1d13b648..00000000 --- a/2.1.x/chapter2-4/src/main/java/com/didispace/chapter24/User.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.didispace.chapter24; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.*; - -@Data -@ApiModel(description = "用户实体") -public class User { - - @ApiModelProperty(value = "用户编号", position = 1) - private Long id; - - @NotNull - @Size(min = 2, max = 5) - @ApiModelProperty(value = "用户姓名", position = 2) - private String name; - - @NotNull - @Max(100) - @Min(10) - @ApiModelProperty(value = "用户年龄", position = 3) - private Integer age; - - @NotNull - @Email - @ApiModelProperty(value = "用户邮箱", position = 4) - private String email; - -} \ No newline at end of file diff --git a/2.1.x/chapter2-4/src/main/java/com/didispace/chapter24/UserController.java b/2.1.x/chapter2-4/src/main/java/com/didispace/chapter24/UserController.java deleted file mode 100644 index 871a2d9b..00000000 --- a/2.1.x/chapter2-4/src/main/java/com/didispace/chapter24/UserController.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.didispace.chapter24; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.*; - -@Api(tags = "用户管理") -@RestController -@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下 -public class UserController { - - // 创建线程安全的Map,模拟users信息的存储 - static Map users = Collections.synchronizedMap(new HashMap<>()); - - @GetMapping("/") - @ApiOperation(value = "获取用户列表") - public List getUserList() { - List r = new ArrayList<>(users.values()); - return r; - } - - @PostMapping("/") - @ApiOperation(value = "创建用户", notes = "根据User对象创建用户") - public String postUser(@Valid @RequestBody User user) { - users.put(user.getId(), user); - return "success"; - } - - @GetMapping("/{id}") - @ApiOperation(value = "获取用户详细信息", notes = "根据url的id来获取用户详细信息") - public User getUser(@PathVariable Long id) { - return users.get(id); - } - - @PutMapping("/{id}") - @ApiImplicitParam(paramType = "path", dataType = "Long", name = "id", value = "用户编号", required = true, example = "1") - @ApiOperation(value = "更新用户详细信息", notes = "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息") - public String putUser(@PathVariable Long id, @RequestBody User user) { - User u = users.get(id); - u.setName(user.getName()); - u.setAge(user.getAge()); - users.put(id, u); - return "success"; - } - - @DeleteMapping("/{id}") - @ApiOperation(value = "删除用户", notes = "根据url的id来指定删除对象") - public String deleteUser(@PathVariable Long id) { - users.remove(id); - return "success"; - } - -} \ No newline at end of file diff --git a/2.1.x/chapter2-4/src/main/resources/application.properties b/2.1.x/chapter2-4/src/main/resources/application.properties deleted file mode 100644 index 335a5f4b..00000000 --- a/2.1.x/chapter2-4/src/main/resources/application.properties +++ /dev/null @@ -1,16 +0,0 @@ - - -swagger.title=spring-boot-starter-swagger -swagger.description=Starter for swagger 2.x -swagger.version=1.9.0.RELEASE -swagger.license=Apache License, Version 2.0 -swagger.licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.html -swagger.termsOfServiceUrl=https://github.com/dyc87112/spring-boot-starter-swagger -swagger.contact.name=didi -swagger.contact.url=http://blog.didispace.com -swagger.contact.email=dyc87112@qq.com -swagger.base-package=com.didispace -swagger.base-path=/** - -swagger.ui-config.tags-sorter=alpha -swagger.ui-config.operations-sorter=alpha \ No newline at end of file diff --git a/2.1.x/chapter2-5/.gitignore b/2.1.x/chapter2-5/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter2-5/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter2-5/pom.xml b/2.1.x/chapter2-5/pom.xml deleted file mode 100644 index 9ffaafe8..00000000 --- a/2.1.x/chapter2-5/pom.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter2-5 - 0.0.1-SNAPSHOT - chapter2-5 - Demo project for Spring Boot - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - com.spring4all - swagger-spring-boot-starter - 1.9.0.RELEASE - - - - org.projectlombok - lombok - - - - org.springframework.boot - spring-boot-starter-test - test - - - - io.github.swagger2markup - swagger2markup - 1.3.3 - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - io.github.swagger2markup - swagger2markup-maven-plugin - 1.3.3 - - http://localhost:8080/v2/api-docs - src/docs/asciidoc/generated-by-plugin - - ASCIIDOC - - - - - - org.asciidoctor - asciidoctor-maven-plugin - 1.5.6 - - src/docs/asciidoc/generated - src/docs/asciidoc/html - html - coderay - - left - - - - - - - - - - false - - jcenter-releases - jcenter - http://jcenter.bintray.com - - - - diff --git a/2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/definitions.adoc b/2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/definitions.adoc deleted file mode 100644 index 3a20e7fb..00000000 --- a/2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/definitions.adoc +++ /dev/null @@ -1,22 +0,0 @@ - -[[_definitions]] -== Definitions - -[[_user]] -=== User -用户实体 - - -[options="header", cols=".^3,.^11,.^4"] -|=== -|Name|Description|Schema -|**age** + -__optional__|用户年龄|integer (int32) -|**id** + -__optional__|用户编号|integer (int64) -|**name** + -__optional__|用户姓名|string -|=== - - - diff --git a/2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/overview.adoc b/2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/overview.adoc deleted file mode 100644 index 4b9eefbf..00000000 --- a/2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/overview.adoc +++ /dev/null @@ -1,38 +0,0 @@ -= spring-boot-starter-swagger - - -[[_overview]] -== Overview -Starter for swagger 2.x - - -=== Version information -[%hardbreaks] -__Version__ : 1.9.0.RELEASE - - -=== Contact information -[%hardbreaks] -__Contact__ : didi -__Contact Email__ : dyc87112@qq.com - - -=== License information -[%hardbreaks] -__License__ : Apache License, Version 2.0 -__License URL__ : https://www.apache.org/licenses/LICENSE-2.0.html -__Terms of service__ : https://github.com/dyc87112/spring-boot-starter-swagger - - -=== URI scheme -[%hardbreaks] -__Host__ : localhost:8080 -__BasePath__ : / - - -=== Tags - -* 用户管理 : User Controller - - - diff --git a/2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/paths.adoc b/2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/paths.adoc deleted file mode 100644 index 5e9cf92f..00000000 --- a/2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/paths.adoc +++ /dev/null @@ -1,265 +0,0 @@ - -[[_paths]] -== Paths - -[[_postuserusingpost]] -=== 创建用户 -.... -POST /users/ -.... - - -==== Description -根据User对象创建用户 - - -==== Parameters - -[options="header", cols=".^2,.^3,.^9,.^4"] -|=== -|Type|Name|Description|Schema -|**Body**|**user** + -__required__|user|<<_user,User>> -|=== - - -==== Responses - -[options="header", cols=".^2,.^14,.^4"] -|=== -|HTTP Code|Description|Schema -|**200**|OK|string -|**201**|Created|No Content -|**401**|Unauthorized|No Content -|**403**|Forbidden|No Content -|**404**|Not Found|No Content -|=== - - -==== Consumes - -* `application/json` - - -==== Produces - -* `*/*` - - -==== Tags - -* 用户管理 - - -==== Security - -[options="header", cols=".^3,.^4,.^13"] -|=== -|Type|Name|Scopes -|**apiKey**|**<<_authorization,Authorization>>**|global -|=== - - -[[_getuserlistusingget]] -=== 获取用户列表 -.... -GET /users/ -.... - - -==== Responses - -[options="header", cols=".^2,.^14,.^4"] -|=== -|HTTP Code|Description|Schema -|**200**|OK|< <<_user,User>> > array -|**401**|Unauthorized|No Content -|**403**|Forbidden|No Content -|**404**|Not Found|No Content -|=== - - -==== Produces - -* `*/*` - - -==== Tags - -* 用户管理 - - -==== Security - -[options="header", cols=".^3,.^4,.^13"] -|=== -|Type|Name|Scopes -|**apiKey**|**<<_authorization,Authorization>>**|global -|=== - - -[[_getuserusingget]] -=== 获取用户详细信息 -.... -GET /users/{id} -.... - - -==== Description -根据url的id来获取用户详细信息 - - -==== Parameters - -[options="header", cols=".^2,.^3,.^9,.^4"] -|=== -|Type|Name|Description|Schema -|**Path**|**id** + -__required__|id|integer (int64) -|=== - - -==== Responses - -[options="header", cols=".^2,.^14,.^4"] -|=== -|HTTP Code|Description|Schema -|**200**|OK|<<_user,User>> -|**401**|Unauthorized|No Content -|**403**|Forbidden|No Content -|**404**|Not Found|No Content -|=== - - -==== Produces - -* `*/*` - - -==== Tags - -* 用户管理 - - -==== Security - -[options="header", cols=".^3,.^4,.^13"] -|=== -|Type|Name|Scopes -|**apiKey**|**<<_authorization,Authorization>>**|global -|=== - - -[[_putuserusingput]] -=== 更新用户详细信息 -.... -PUT /users/{id} -.... - - -==== Description -根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息 - - -==== Parameters - -[options="header", cols=".^2,.^3,.^9,.^4"] -|=== -|Type|Name|Description|Schema -|**Path**|**id** + -__required__|用户编号|integer (int64) -|**Body**|**user** + -__required__|user|<<_user,User>> -|=== - - -==== Responses - -[options="header", cols=".^2,.^14,.^4"] -|=== -|HTTP Code|Description|Schema -|**200**|OK|string -|**201**|Created|No Content -|**401**|Unauthorized|No Content -|**403**|Forbidden|No Content -|**404**|Not Found|No Content -|=== - - -==== Consumes - -* `application/json` - - -==== Produces - -* `*/*` - - -==== Tags - -* 用户管理 - - -==== Security - -[options="header", cols=".^3,.^4,.^13"] -|=== -|Type|Name|Scopes -|**apiKey**|**<<_authorization,Authorization>>**|global -|=== - - -[[_deleteuserusingdelete]] -=== 删除用户 -.... -DELETE /users/{id} -.... - - -==== Description -根据url的id来指定删除对象 - - -==== Parameters - -[options="header", cols=".^2,.^3,.^9,.^4"] -|=== -|Type|Name|Description|Schema -|**Path**|**id** + -__required__|id|integer (int64) -|=== - - -==== Responses - -[options="header", cols=".^2,.^14,.^4"] -|=== -|HTTP Code|Description|Schema -|**200**|OK|string -|**204**|No Content|No Content -|**401**|Unauthorized|No Content -|**403**|Forbidden|No Content -|=== - - -==== Produces - -* `*/*` - - -==== Tags - -* 用户管理 - - -==== Security - -[options="header", cols=".^3,.^4,.^13"] -|=== -|Type|Name|Scopes -|**apiKey**|**<<_authorization,Authorization>>**|global -|=== - - - diff --git a/2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/security.adoc b/2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/security.adoc deleted file mode 100644 index 01db83a5..00000000 --- a/2.1.x/chapter2-5/src/docs/asciidoc/generated-by-plugin/security.adoc +++ /dev/null @@ -1,13 +0,0 @@ - -[[_securityscheme]] -== Security - -[[_authorization]] -=== Authorization -[%hardbreaks] -__Type__ : apiKey -__Name__ : TOKEN -__In__ : HEADER - - - diff --git a/2.1.x/chapter2-5/src/docs/asciidoc/generated/definitions.adoc b/2.1.x/chapter2-5/src/docs/asciidoc/generated/definitions.adoc deleted file mode 100644 index a739bda5..00000000 --- a/2.1.x/chapter2-5/src/docs/asciidoc/generated/definitions.adoc +++ /dev/null @@ -1,22 +0,0 @@ - -[[_definitions]] -== Definitions - -[[_user]] -=== User -用户实体 - - -[options="header", cols=".^3a,.^11a,.^4a"] -|=== -|Name|Description|Schema -|**age** + -__optional__|用户年龄|integer (int32) -|**id** + -__optional__|用户编号|integer (int64) -|**name** + -__optional__|用户姓名|string -|=== - - - diff --git a/2.1.x/chapter2-5/src/docs/asciidoc/generated/overview.adoc b/2.1.x/chapter2-5/src/docs/asciidoc/generated/overview.adoc deleted file mode 100644 index 4b9eefbf..00000000 --- a/2.1.x/chapter2-5/src/docs/asciidoc/generated/overview.adoc +++ /dev/null @@ -1,38 +0,0 @@ -= spring-boot-starter-swagger - - -[[_overview]] -== Overview -Starter for swagger 2.x - - -=== Version information -[%hardbreaks] -__Version__ : 1.9.0.RELEASE - - -=== Contact information -[%hardbreaks] -__Contact__ : didi -__Contact Email__ : dyc87112@qq.com - - -=== License information -[%hardbreaks] -__License__ : Apache License, Version 2.0 -__License URL__ : https://www.apache.org/licenses/LICENSE-2.0.html -__Terms of service__ : https://github.com/dyc87112/spring-boot-starter-swagger - - -=== URI scheme -[%hardbreaks] -__Host__ : localhost:8080 -__BasePath__ : / - - -=== Tags - -* 用户管理 : User Controller - - - diff --git a/2.1.x/chapter2-5/src/docs/asciidoc/generated/paths.adoc b/2.1.x/chapter2-5/src/docs/asciidoc/generated/paths.adoc deleted file mode 100644 index 6fa4471d..00000000 --- a/2.1.x/chapter2-5/src/docs/asciidoc/generated/paths.adoc +++ /dev/null @@ -1,265 +0,0 @@ - -[[_paths]] -== Paths - -[[_postuserusingpost]] -=== 创建用户 -.... -POST /users/ -.... - - -==== Description -根据User对象创建用户 - - -==== Parameters - -[options="header", cols=".^2a,.^3a,.^9a,.^4a"] -|=== -|Type|Name|Description|Schema -|**Body**|**user** + -__required__|user|<<_user,User>> -|=== - - -==== Responses - -[options="header", cols=".^2a,.^14a,.^4a"] -|=== -|HTTP Code|Description|Schema -|**200**|OK|string -|**201**|Created|No Content -|**401**|Unauthorized|No Content -|**403**|Forbidden|No Content -|**404**|Not Found|No Content -|=== - - -==== Consumes - -* `application/json` - - -==== Produces - -* `\*/*` - - -==== Tags - -* 用户管理 - - -==== Security - -[options="header", cols=".^3a,.^4a,.^13a"] -|=== -|Type|Name|Scopes -|**apiKey**|**<<_authorization,Authorization>>**|global -|=== - - -[[_getuserlistusingget]] -=== 获取用户列表 -.... -GET /users/ -.... - - -==== Responses - -[options="header", cols=".^2a,.^14a,.^4a"] -|=== -|HTTP Code|Description|Schema -|**200**|OK|< <<_user,User>> > array -|**401**|Unauthorized|No Content -|**403**|Forbidden|No Content -|**404**|Not Found|No Content -|=== - - -==== Produces - -* `\*/*` - - -==== Tags - -* 用户管理 - - -==== Security - -[options="header", cols=".^3a,.^4a,.^13a"] -|=== -|Type|Name|Scopes -|**apiKey**|**<<_authorization,Authorization>>**|global -|=== - - -[[_getuserusingget]] -=== 获取用户详细信息 -.... -GET /users/{id} -.... - - -==== Description -根据url的id来获取用户详细信息 - - -==== Parameters - -[options="header", cols=".^2a,.^3a,.^9a,.^4a"] -|=== -|Type|Name|Description|Schema -|**Path**|**id** + -__required__|id|integer (int64) -|=== - - -==== Responses - -[options="header", cols=".^2a,.^14a,.^4a"] -|=== -|HTTP Code|Description|Schema -|**200**|OK|<<_user,User>> -|**401**|Unauthorized|No Content -|**403**|Forbidden|No Content -|**404**|Not Found|No Content -|=== - - -==== Produces - -* `\*/*` - - -==== Tags - -* 用户管理 - - -==== Security - -[options="header", cols=".^3a,.^4a,.^13a"] -|=== -|Type|Name|Scopes -|**apiKey**|**<<_authorization,Authorization>>**|global -|=== - - -[[_putuserusingput]] -=== 更新用户详细信息 -.... -PUT /users/{id} -.... - - -==== Description -根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息 - - -==== Parameters - -[options="header", cols=".^2a,.^3a,.^9a,.^4a"] -|=== -|Type|Name|Description|Schema -|**Path**|**id** + -__required__|用户编号|integer (int64) -|**Body**|**user** + -__required__|user|<<_user,User>> -|=== - - -==== Responses - -[options="header", cols=".^2a,.^14a,.^4a"] -|=== -|HTTP Code|Description|Schema -|**200**|OK|string -|**201**|Created|No Content -|**401**|Unauthorized|No Content -|**403**|Forbidden|No Content -|**404**|Not Found|No Content -|=== - - -==== Consumes - -* `application/json` - - -==== Produces - -* `\*/*` - - -==== Tags - -* 用户管理 - - -==== Security - -[options="header", cols=".^3a,.^4a,.^13a"] -|=== -|Type|Name|Scopes -|**apiKey**|**<<_authorization,Authorization>>**|global -|=== - - -[[_deleteuserusingdelete]] -=== 删除用户 -.... -DELETE /users/{id} -.... - - -==== Description -根据url的id来指定删除对象 - - -==== Parameters - -[options="header", cols=".^2a,.^3a,.^9a,.^4a"] -|=== -|Type|Name|Description|Schema -|**Path**|**id** + -__required__|id|integer (int64) -|=== - - -==== Responses - -[options="header", cols=".^2a,.^14a,.^4a"] -|=== -|HTTP Code|Description|Schema -|**200**|OK|string -|**204**|No Content|No Content -|**401**|Unauthorized|No Content -|**403**|Forbidden|No Content -|=== - - -==== Produces - -* `\*/*` - - -==== Tags - -* 用户管理 - - -==== Security - -[options="header", cols=".^3a,.^4a,.^13a"] -|=== -|Type|Name|Scopes -|**apiKey**|**<<_authorization,Authorization>>**|global -|=== - - - diff --git a/2.1.x/chapter2-5/src/docs/asciidoc/generated/security.adoc b/2.1.x/chapter2-5/src/docs/asciidoc/generated/security.adoc deleted file mode 100644 index 01db83a5..00000000 --- a/2.1.x/chapter2-5/src/docs/asciidoc/generated/security.adoc +++ /dev/null @@ -1,13 +0,0 @@ - -[[_securityscheme]] -== Security - -[[_authorization]] -=== Authorization -[%hardbreaks] -__Type__ : apiKey -__Name__ : TOKEN -__In__ : HEADER - - - diff --git a/2.1.x/chapter2-5/src/docs/asciidoc/html/definitions.html b/2.1.x/chapter2-5/src/docs/asciidoc/html/definitions.html deleted file mode 100644 index 1a9a17f8..00000000 --- a/2.1.x/chapter2-5/src/docs/asciidoc/html/definitions.html +++ /dev/null @@ -1,603 +0,0 @@ - - - - - - - -Definitions - - - - - - -
-
-

Definitions

-
-
-

User

-
-

用户实体

-
- ----- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionSchema
-

age
-optional

-
-

用户年龄

-
-

integer (int32)

-
-

id
-optional

-
-

用户编号

-
-

integer (int64)

-
-

name
-optional

-
-

用户姓名

-
-

string

-
-
-
-
-
- - - \ No newline at end of file diff --git a/2.1.x/chapter2-5/src/docs/asciidoc/html/overview.html b/2.1.x/chapter2-5/src/docs/asciidoc/html/overview.html deleted file mode 100644 index 842077bb..00000000 --- a/2.1.x/chapter2-5/src/docs/asciidoc/html/overview.html +++ /dev/null @@ -1,591 +0,0 @@ - - - - - - - -spring-boot-starter-swagger - - - - - - -
-
-

Overview

-
-
-

Starter for swagger 2.x

-
-
-

Version information

-
-

Version : 1.9.0.RELEASE

-
-
-
-

Contact information

-
-

Contact : didi
-Contact Email : dyc87112@qq.com

-
-
-
-

License information

-
-

License : Apache License, Version 2.0
-License URL : https://www.apache.org/licenses/LICENSE-2.0.html
-Terms of service : https://github.com/dyc87112/spring-boot-starter-swagger

-
-
-
-

URI scheme

-
-

Host : localhost:8080
-BasePath : /

-
-
-
-

Tags

-
-
    -
  • -

    用户管理 : User Controller

    -
  • -
-
-
-
-
-
- - - \ No newline at end of file diff --git a/2.1.x/chapter2-5/src/docs/asciidoc/html/paths.html b/2.1.x/chapter2-5/src/docs/asciidoc/html/paths.html deleted file mode 100644 index 4b3d92d4..00000000 --- a/2.1.x/chapter2-5/src/docs/asciidoc/html/paths.html +++ /dev/null @@ -1,1379 +0,0 @@ - - - - - - - -Paths - - - - - - -
-
-

Paths

-
-
-

创建用户

-
-
-
POST /users/
-
-
-
-

Description

-
-

根据User对象创建用户

-
-
-
-

Parameters

- ------ - - - - - - - - - - - - - - - - -
TypeNameDescriptionSchema
-

Body

-
-

user
-required

-
-

user

-
-

User

-
-
-
-

Responses

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HTTP CodeDescriptionSchema
-

200

-
-

OK

-
-

string

-
-

201

-
-

Created

-
-

No Content

-
-

401

-
-

Unauthorized

-
-

No Content

-
-

403

-
-

Forbidden

-
-

No Content

-
-

404

-
-

Not Found

-
-

No Content

-
-
-
-

Consumes

-
-
    -
  • -

    application/json

    -
  • -
-
-
-
-

Produces

-
-
    -
  • -

    */*

    -
  • -
-
-
-
-

Tags

-
-
    -
  • -

    用户管理

    -
  • -
-
-
-
-

Security

- ----- - - - - - - - - - - - - - - -
TypeNameScopes
-

apiKey

-
-

global

-
-
-
-
-

获取用户列表

-
-
-
GET /users/
-
-
-
-

Responses

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HTTP CodeDescriptionSchema
-

200

-
-

OK

-
-

< User > array

-
-

401

-
-

Unauthorized

-
-

No Content

-
-

403

-
-

Forbidden

-
-

No Content

-
-

404

-
-

Not Found

-
-

No Content

-
-
-
-

Produces

-
-
    -
  • -

    */*

    -
  • -
-
-
-
-

Tags

-
-
    -
  • -

    用户管理

    -
  • -
-
-
-
-

Security

- ----- - - - - - - - - - - - - - - -
TypeNameScopes
-

apiKey

-
-

global

-
-
-
-
-

获取用户详细信息

-
-
-
GET /users/{id}
-
-
-
-

Description

-
-

根据url的id来获取用户详细信息

-
-
-
-

Parameters

- ------ - - - - - - - - - - - - - - - - -
TypeNameDescriptionSchema
-

Path

-
-

id
-required

-
-

id

-
-

integer (int64)

-
-
-
-

Responses

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HTTP CodeDescriptionSchema
-

200

-
-

OK

-
-

User

-
-

401

-
-

Unauthorized

-
-

No Content

-
-

403

-
-

Forbidden

-
-

No Content

-
-

404

-
-

Not Found

-
-

No Content

-
-
-
-

Produces

-
-
    -
  • -

    */*

    -
  • -
-
-
-
-

Tags

-
-
    -
  • -

    用户管理

    -
  • -
-
-
-
-

Security

- ----- - - - - - - - - - - - - - - -
TypeNameScopes
-

apiKey

-
-

global

-
-
-
-
-

更新用户详细信息

-
-
-
PUT /users/{id}
-
-
-
-

Description

-
-

根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息

-
-
-
-

Parameters

- ------ - - - - - - - - - - - - - - - - - - - - - - -
TypeNameDescriptionSchema
-

Path

-
-

id
-required

-
-

用户编号

-
-

integer (int64)

-
-

Body

-
-

user
-required

-
-

user

-
-

User

-
-
-
-

Responses

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HTTP CodeDescriptionSchema
-

200

-
-

OK

-
-

string

-
-

201

-
-

Created

-
-

No Content

-
-

401

-
-

Unauthorized

-
-

No Content

-
-

403

-
-

Forbidden

-
-

No Content

-
-

404

-
-

Not Found

-
-

No Content

-
-
-
-

Consumes

-
-
    -
  • -

    application/json

    -
  • -
-
-
-
-

Produces

-
-
    -
  • -

    */*

    -
  • -
-
-
-
-

Tags

-
-
    -
  • -

    用户管理

    -
  • -
-
-
-
-

Security

- ----- - - - - - - - - - - - - - - -
TypeNameScopes
-

apiKey

-
-

global

-
-
-
-
-

删除用户

-
-
-
DELETE /users/{id}
-
-
-
-

Description

-
-

根据url的id来指定删除对象

-
-
-
-

Parameters

- ------ - - - - - - - - - - - - - - - - -
TypeNameDescriptionSchema
-

Path

-
-

id
-required

-
-

id

-
-

integer (int64)

-
-
-
-

Responses

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HTTP CodeDescriptionSchema
-

200

-
-

OK

-
-

string

-
-

204

-
-

No Content

-
-

No Content

-
-

401

-
-

Unauthorized

-
-

No Content

-
-

403

-
-

Forbidden

-
-

No Content

-
-
-
-

Produces

-
-
    -
  • -

    */*

    -
  • -
-
-
-
-

Tags

-
-
    -
  • -

    用户管理

    -
  • -
-
-
-
-

Security

- ----- - - - - - - - - - - - - - - -
TypeNameScopes
-

apiKey

-
-

global

-
-
-
-
-
-
- - - \ No newline at end of file diff --git a/2.1.x/chapter2-5/src/docs/asciidoc/html/security.html b/2.1.x/chapter2-5/src/docs/asciidoc/html/security.html deleted file mode 100644 index 34676fab..00000000 --- a/2.1.x/chapter2-5/src/docs/asciidoc/html/security.html +++ /dev/null @@ -1,553 +0,0 @@ - - - - - - - -Security - - - - - - -
-
-

Security

-
-
-

Authorization

-
-

Type : apiKey
-Name : TOKEN
-In : HEADER

-
-
-
-
-
- - - \ No newline at end of file diff --git a/2.1.x/chapter2-5/src/docs/confluence/generated/definitions.txt b/2.1.x/chapter2-5/src/docs/confluence/generated/definitions.txt deleted file mode 100644 index 6792429a..00000000 --- a/2.1.x/chapter2-5/src/docs/confluence/generated/definitions.txt +++ /dev/null @@ -1,14 +0,0 @@ - -h2. Definitions {anchor:definitions} - -h3. User {anchor:user} -用户实体 - - -||Name||Description||Schema|| -|*age*\\ \\ _optional_||用户年龄||integer (int32)| -|*id*\\ \\ _optional_||用户编号||integer (int64)| -|*name*\\ \\ _optional_||用户姓名||string| - - - diff --git a/2.1.x/chapter2-5/src/docs/confluence/generated/overview.txt b/2.1.x/chapter2-5/src/docs/confluence/generated/overview.txt deleted file mode 100644 index af12d61b..00000000 --- a/2.1.x/chapter2-5/src/docs/confluence/generated/overview.txt +++ /dev/null @@ -1,33 +0,0 @@ -h1. spring-boot-starter-swagger - - -h2. Overview {anchor:overview} -Starter for swagger 2.x - - -h3. Version information -_Version_ : 1.9.0.RELEASE - - -h3. Contact information -_Contact_ : didi\\ -_Contact Email_ : dyc87112@qq.com - - -h3. License information -_License_ : Apache License, Version 2.0\\ -_License URL_ : https://www.apache.org/licenses/LICENSE-2.0.html\\ -_Terms of service_ : https://github.com/dyc87112/spring-boot-starter-swagger - - -h3. URI scheme -_Host_ : localhost:8080\\ -_BasePath_ : / - - -h3. Tags - -* 用户管理 : User Controller - - - diff --git a/2.1.x/chapter2-5/src/docs/confluence/generated/paths.txt b/2.1.x/chapter2-5/src/docs/confluence/generated/paths.txt deleted file mode 100644 index 5b169e5d..00000000 --- a/2.1.x/chapter2-5/src/docs/confluence/generated/paths.txt +++ /dev/null @@ -1,212 +0,0 @@ - -h2. Paths {anchor:paths} - -h3. 创建用户 {anchor:postuserusingpost} -{noformat} -POST /users/ -{noformat} - - -h4. Description -根据User对象创建用户 - - -h4. Parameters - -||Type||Name||Description||Schema|| -|*Body*|*user*\\ \\ _required_||user||[User|#user]| - - -h4. Responses - -||HTTP Code||Description||Schema|| -|*200*||OK||string| -|*201*||Created||No Content| -|*401*||Unauthorized||No Content| -|*403*||Forbidden||No Content| -|*404*||Not Found||No Content| - - -h4. Consumes - -* {noformat}application/json{noformat} - - -h4. Produces - -* {noformat}\*/*{noformat} - - -h4. Tags - -* 用户管理 - - -h4. Security - -||Type||Name||Scopes|| -|*apiKey*|*[Authorization|#authorization]*||global| - - -h3. 获取用户列表 {anchor:getuserlistusingget} -{noformat} -GET /users/ -{noformat} - - -h4. Responses - -||HTTP Code||Description||Schema|| -|*200*||OK||< [User|#user] > array| -|*401*||Unauthorized||No Content| -|*403*||Forbidden||No Content| -|*404*||Not Found||No Content| - - -h4. Produces - -* {noformat}\*/*{noformat} - - -h4. Tags - -* 用户管理 - - -h4. Security - -||Type||Name||Scopes|| -|*apiKey*|*[Authorization|#authorization]*||global| - - -h3. 获取用户详细信息 {anchor:getuserusingget} -{noformat} -GET /users/{id} -{noformat} - - -h4. Description -根据url的id来获取用户详细信息 - - -h4. Parameters - -||Type||Name||Description||Schema|| -|*Path*|*id*\\ \\ _required_||id||integer (int64)| - - -h4. Responses - -||HTTP Code||Description||Schema|| -|*200*||OK||[User|#user]| -|*401*||Unauthorized||No Content| -|*403*||Forbidden||No Content| -|*404*||Not Found||No Content| - - -h4. Produces - -* {noformat}\*/*{noformat} - - -h4. Tags - -* 用户管理 - - -h4. Security - -||Type||Name||Scopes|| -|*apiKey*|*[Authorization|#authorization]*||global| - - -h3. 更新用户详细信息 {anchor:putuserusingput} -{noformat} -PUT /users/{id} -{noformat} - - -h4. Description -根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息 - - -h4. Parameters - -||Type||Name||Description||Schema|| -|*Path*|*id*\\ \\ _required_||用户编号||integer (int64)| -|*Body*|*user*\\ \\ _required_||user||[User|#user]| - - -h4. Responses - -||HTTP Code||Description||Schema|| -|*200*||OK||string| -|*201*||Created||No Content| -|*401*||Unauthorized||No Content| -|*403*||Forbidden||No Content| -|*404*||Not Found||No Content| - - -h4. Consumes - -* {noformat}application/json{noformat} - - -h4. Produces - -* {noformat}\*/*{noformat} - - -h4. Tags - -* 用户管理 - - -h4. Security - -||Type||Name||Scopes|| -|*apiKey*|*[Authorization|#authorization]*||global| - - -h3. 删除用户 {anchor:deleteuserusingdelete} -{noformat} -DELETE /users/{id} -{noformat} - - -h4. Description -根据url的id来指定删除对象 - - -h4. Parameters - -||Type||Name||Description||Schema|| -|*Path*|*id*\\ \\ _required_||id||integer (int64)| - - -h4. Responses - -||HTTP Code||Description||Schema|| -|*200*||OK||string| -|*204*||No Content||No Content| -|*401*||Unauthorized||No Content| -|*403*||Forbidden||No Content| - - -h4. Produces - -* {noformat}\*/*{noformat} - - -h4. Tags - -* 用户管理 - - -h4. Security - -||Type||Name||Scopes|| -|*apiKey*|*[Authorization|#authorization]*||global| - - - diff --git a/2.1.x/chapter2-5/src/docs/confluence/generated/security.txt b/2.1.x/chapter2-5/src/docs/confluence/generated/security.txt deleted file mode 100644 index 7594f1b5..00000000 --- a/2.1.x/chapter2-5/src/docs/confluence/generated/security.txt +++ /dev/null @@ -1,10 +0,0 @@ - -h2. Security {anchor:securityscheme} - -h3. Authorization {anchor:authorization} -_Type_ : apiKey\\ -_Name_ : TOKEN\\ -_In_ : HEADER - - - diff --git a/2.1.x/chapter2-5/src/docs/markdown/generated/definitions.md b/2.1.x/chapter2-5/src/docs/markdown/generated/definitions.md deleted file mode 100644 index 4eaff931..00000000 --- a/2.1.x/chapter2-5/src/docs/markdown/generated/definitions.md +++ /dev/null @@ -1,17 +0,0 @@ - - -## Definitions - - -### User -用户实体 - - -|Name|Description|Schema| -|---|---|---| -|**age**
*optional*|用户年龄|integer (int32)| -|**id**
*optional*|用户编号|integer (int64)| -|**name**
*optional*|用户姓名|string| - - - diff --git a/2.1.x/chapter2-5/src/docs/markdown/generated/overview.md b/2.1.x/chapter2-5/src/docs/markdown/generated/overview.md deleted file mode 100644 index d360d5a8..00000000 --- a/2.1.x/chapter2-5/src/docs/markdown/generated/overview.md +++ /dev/null @@ -1,34 +0,0 @@ -# spring-boot-starter-swagger - - - -## Overview -Starter for swagger 2.x - - -### Version information -*Version* : 1.9.0.RELEASE - - -### Contact information -*Contact* : didi -*Contact Email* : dyc87112@qq.com - - -### License information -*License* : Apache License, Version 2.0 -*License URL* : https://www.apache.org/licenses/LICENSE-2.0.html -*Terms of service* : https://github.com/dyc87112/spring-boot-starter-swagger - - -### URI scheme -*Host* : localhost:8080 -*BasePath* : / - - -### Tags - -* 用户管理 : User Controller - - - diff --git a/2.1.x/chapter2-5/src/docs/markdown/generated/paths.md b/2.1.x/chapter2-5/src/docs/markdown/generated/paths.md deleted file mode 100644 index d056676a..00000000 --- a/2.1.x/chapter2-5/src/docs/markdown/generated/paths.md +++ /dev/null @@ -1,232 +0,0 @@ - - -## Paths - - -### 创建用户 -``` -POST /users/ -``` - - -#### Description -根据User对象创建用户 - - -#### Parameters - -|Type|Name|Description|Schema| -|---|---|---|---| -|**Body**|**user**
*required*|user|[User](#user)| - - -#### Responses - -|HTTP Code|Description|Schema| -|---|---|---| -|**200**|OK|string| -|**201**|Created|No Content| -|**401**|Unauthorized|No Content| -|**403**|Forbidden|No Content| -|**404**|Not Found|No Content| - - -#### Consumes - -* `application/json` - - -#### Produces - -* `\*/*` - - -#### Tags - -* 用户管理 - - -#### Security - -|Type|Name|Scopes| -|---|---|---| -|**apiKey**|**[Authorization](#authorization)**|global| - - - -### 获取用户列表 -``` -GET /users/ -``` - - -#### Responses - -|HTTP Code|Description|Schema| -|---|---|---| -|**200**|OK|< [User](#user) > array| -|**401**|Unauthorized|No Content| -|**403**|Forbidden|No Content| -|**404**|Not Found|No Content| - - -#### Produces - -* `\*/*` - - -#### Tags - -* 用户管理 - - -#### Security - -|Type|Name|Scopes| -|---|---|---| -|**apiKey**|**[Authorization](#authorization)**|global| - - - -### 获取用户详细信息 -``` -GET /users/{id} -``` - - -#### Description -根据url的id来获取用户详细信息 - - -#### Parameters - -|Type|Name|Description|Schema| -|---|---|---|---| -|**Path**|**id**
*required*|id|integer (int64)| - - -#### Responses - -|HTTP Code|Description|Schema| -|---|---|---| -|**200**|OK|[User](#user)| -|**401**|Unauthorized|No Content| -|**403**|Forbidden|No Content| -|**404**|Not Found|No Content| - - -#### Produces - -* `\*/*` - - -#### Tags - -* 用户管理 - - -#### Security - -|Type|Name|Scopes| -|---|---|---| -|**apiKey**|**[Authorization](#authorization)**|global| - - - -### 更新用户详细信息 -``` -PUT /users/{id} -``` - - -#### Description -根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息 - - -#### Parameters - -|Type|Name|Description|Schema| -|---|---|---|---| -|**Path**|**id**
*required*|用户编号|integer (int64)| -|**Body**|**user**
*required*|user|[User](#user)| - - -#### Responses - -|HTTP Code|Description|Schema| -|---|---|---| -|**200**|OK|string| -|**201**|Created|No Content| -|**401**|Unauthorized|No Content| -|**403**|Forbidden|No Content| -|**404**|Not Found|No Content| - - -#### Consumes - -* `application/json` - - -#### Produces - -* `\*/*` - - -#### Tags - -* 用户管理 - - -#### Security - -|Type|Name|Scopes| -|---|---|---| -|**apiKey**|**[Authorization](#authorization)**|global| - - - -### 删除用户 -``` -DELETE /users/{id} -``` - - -#### Description -根据url的id来指定删除对象 - - -#### Parameters - -|Type|Name|Description|Schema| -|---|---|---|---| -|**Path**|**id**
*required*|id|integer (int64)| - - -#### Responses - -|HTTP Code|Description|Schema| -|---|---|---| -|**200**|OK|string| -|**204**|No Content|No Content| -|**401**|Unauthorized|No Content| -|**403**|Forbidden|No Content| - - -#### Produces - -* `\*/*` - - -#### Tags - -* 用户管理 - - -#### Security - -|Type|Name|Scopes| -|---|---|---| -|**apiKey**|**[Authorization](#authorization)**|global| - - - diff --git a/2.1.x/chapter2-5/src/docs/markdown/generated/security.md b/2.1.x/chapter2-5/src/docs/markdown/generated/security.md deleted file mode 100644 index 09ee31c4..00000000 --- a/2.1.x/chapter2-5/src/docs/markdown/generated/security.md +++ /dev/null @@ -1,12 +0,0 @@ - - -## Security - - -### Authorization -*Type* : apiKey -*Name* : TOKEN -*In* : HEADER - - - diff --git a/2.1.x/chapter2-5/src/main/java/com/didispace/chapter25/Chapter25Application.java b/2.1.x/chapter2-5/src/main/java/com/didispace/chapter25/Chapter25Application.java deleted file mode 100644 index b8c92652..00000000 --- a/2.1.x/chapter2-5/src/main/java/com/didispace/chapter25/Chapter25Application.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.didispace.chapter25; - -import com.spring4all.swagger.EnableSwagger2Doc; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@EnableSwagger2Doc -@SpringBootApplication -public class Chapter25Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter25Application.class, args); - } - -} diff --git a/2.1.x/chapter2-5/src/main/java/com/didispace/chapter25/User.java b/2.1.x/chapter2-5/src/main/java/com/didispace/chapter25/User.java deleted file mode 100644 index d929259d..00000000 --- a/2.1.x/chapter2-5/src/main/java/com/didispace/chapter25/User.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.didispace.chapter25; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description="用户实体") -public class User { - - @ApiModelProperty("用户编号") - private Long id; - @ApiModelProperty("用户姓名") - private String name; - @ApiModelProperty("用户年龄") - private Integer age; - -} \ No newline at end of file diff --git a/2.1.x/chapter2-5/src/main/java/com/didispace/chapter25/UserController.java b/2.1.x/chapter2-5/src/main/java/com/didispace/chapter25/UserController.java deleted file mode 100644 index ac333420..00000000 --- a/2.1.x/chapter2-5/src/main/java/com/didispace/chapter25/UserController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.didispace.chapter25; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; - -import java.util.*; - -@Api(tags = "用户管理") -@RestController -@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下 -public class UserController { - - // 创建线程安全的Map,模拟users信息的存储 - static Map users = Collections.synchronizedMap(new HashMap<>()); - - @GetMapping("/") - @ApiOperation(value = "获取用户列表") - public List getUserList() { - List r = new ArrayList<>(users.values()); - return r; - } - - @PostMapping("/") - @ApiOperation(value = "创建用户", notes = "根据User对象创建用户") - public String postUser(@RequestBody User user) { - users.put(user.getId(), user); - return "success"; - } - - @GetMapping("/{id}") - @ApiOperation(value = "获取用户详细信息", notes = "根据url的id来获取用户详细信息") - public User getUser(@PathVariable Long id) { - return users.get(id); - } - - @PutMapping("/{id}") - @ApiImplicitParam(paramType = "path", dataType = "Long", name = "id", value = "用户编号", required = true, example = "1") - @ApiOperation(value = "更新用户详细信息", notes = "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息") - public String putUser(@PathVariable Long id, @RequestBody User user) { - User u = users.get(id); - u.setName(user.getName()); - u.setAge(user.getAge()); - users.put(id, u); - return "success"; - } - - @DeleteMapping("/{id}") - @ApiOperation(value = "删除用户", notes = "根据url的id来指定删除对象") - public String deleteUser(@PathVariable Long id) { - users.remove(id); - return "success"; - } - -} \ No newline at end of file diff --git a/2.1.x/chapter2-5/src/main/resources/application.properties b/2.1.x/chapter2-5/src/main/resources/application.properties deleted file mode 100644 index 55ec2942..00000000 --- a/2.1.x/chapter2-5/src/main/resources/application.properties +++ /dev/null @@ -1,13 +0,0 @@ - - -swagger.title=spring-boot-starter-swagger -swagger.description=Starter for swagger 2.x -swagger.version=1.9.0.RELEASE -swagger.license=Apache License, Version 2.0 -swagger.licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.html -swagger.termsOfServiceUrl=https://github.com/dyc87112/spring-boot-starter-swagger -swagger.contact.name=didi -swagger.contact.url=http://blog.didispace.com -swagger.contact.email=dyc87112@qq.com -swagger.base-package=com.didispace -swagger.base-path=/** \ No newline at end of file diff --git a/2.1.x/chapter2-5/src/test/java/com/didispace/chapter25/DemoApplicationTests.java b/2.1.x/chapter2-5/src/test/java/com/didispace/chapter25/DemoApplicationTests.java deleted file mode 100644 index d36e438e..00000000 --- a/2.1.x/chapter2-5/src/test/java/com/didispace/chapter25/DemoApplicationTests.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.didispace.chapter25; - -import io.github.swagger2markup.Swagger2MarkupConfig; -import io.github.swagger2markup.Swagger2MarkupConverter; -import io.github.swagger2markup.builder.Swagger2MarkupConfigBuilder; -import io.github.swagger2markup.markup.builder.MarkupLanguage; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.net.URL; -import java.nio.file.Path; -import java.nio.file.Paths; - -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) -public class DemoApplicationTests { - - @Test - public void generateAsciiDocs() throws Exception { - - URL remoteSwaggerFile = new URL("http://localhost:8080/v2/api-docs"); - Path outputDirectory = Paths.get("src/docs/asciidoc/generated"); - - // 输出Ascii格式 - Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder() - .withMarkupLanguage(MarkupLanguage.ASCIIDOC) - .build(); - - Swagger2MarkupConverter.from(remoteSwaggerFile) - .withConfig(config) - .build() - .toFolder(outputDirectory); - } - - @Test - public void generateMarkdownDocs() throws Exception { - - URL remoteSwaggerFile = new URL("http://localhost:8080/v2/api-docs"); - Path outputDirectory = Paths.get("src/docs/markdown/generated"); - - // 输出Ascii格式 - Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder() - .withMarkupLanguage(MarkupLanguage.MARKDOWN) - .build(); - - Swagger2MarkupConverter.from(remoteSwaggerFile) - .withConfig(config) - .build() - .toFolder(outputDirectory); - } - - @Test - public void generateConfluenceDocs() throws Exception { - - URL remoteSwaggerFile = new URL("http://localhost:8080/v2/api-docs"); - Path outputDirectory = Paths.get("src/docs/confluence/generated"); - - // 输出Ascii格式 - Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder() - .withMarkupLanguage(MarkupLanguage.CONFLUENCE_MARKUP) - .build(); - - Swagger2MarkupConverter.from(remoteSwaggerFile) - .withConfig(config) - .build() - .toFolder(outputDirectory); - } - -} \ No newline at end of file diff --git a/2.1.x/chapter2-6/.gitignore b/2.1.x/chapter2-6/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter2-6/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter2-6/pom.xml b/2.1.x/chapter2-6/pom.xml deleted file mode 100644 index 09ba9399..00000000 --- a/2.1.x/chapter2-6/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter2-6 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter2-6/src/main/java/com/didispace/chapter26/Chapter26Application.java b/2.1.x/chapter2-6/src/main/java/com/didispace/chapter26/Chapter26Application.java deleted file mode 100644 index ab89e203..00000000 --- a/2.1.x/chapter2-6/src/main/java/com/didispace/chapter26/Chapter26Application.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.didispace.chapter26; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Chapter26Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter26Application.class, args); - } - -} diff --git a/2.1.x/chapter2-6/src/main/java/com/didispace/chapter26/User.java b/2.1.x/chapter2-6/src/main/java/com/didispace/chapter26/User.java deleted file mode 100644 index 60e131cd..00000000 --- a/2.1.x/chapter2-6/src/main/java/com/didispace/chapter26/User.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.didispace.chapter26; - -import lombok.Data; - -@Data -public class User { - - private Long id; - private String name; - private Integer age; - -} \ No newline at end of file diff --git a/2.1.x/chapter2-6/src/main/java/com/didispace/chapter26/UserController.java b/2.1.x/chapter2-6/src/main/java/com/didispace/chapter26/UserController.java deleted file mode 100644 index a84cf8d4..00000000 --- a/2.1.x/chapter2-6/src/main/java/com/didispace/chapter26/UserController.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.didispace.chapter26; - -import org.springframework.web.bind.annotation.*; - -import java.util.*; - -@RestController -@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下 -public class UserController { - - // 创建线程安全的Map,模拟users信息的存储 - static Map users = Collections.synchronizedMap(new HashMap<>()); - - @GetMapping("/") - public List getUserList() { - List r = new ArrayList<>(users.values()); - return r; - } - - @PostMapping("/") - public String postUser(@RequestBody User user) { - users.put(user.getId(), user); - return "success"; - } - - @GetMapping("/{id}") - public User getUser(@PathVariable Long id) { - return users.get(id); - } - - @PutMapping("/{id}") - public String putUser(@PathVariable Long id, @RequestBody User user) { - User u = users.get(id); - u.setName(user.getName()); - u.setAge(user.getAge()); - users.put(id, u); - return "success"; - } - - @DeleteMapping("/{id}") - public String deleteUser(@PathVariable Long id) { - users.remove(id); - return "success"; - } - -} \ No newline at end of file diff --git a/2.1.x/chapter2-6/src/main/resources/application.properties b/2.1.x/chapter2-6/src/main/resources/application.properties deleted file mode 100644 index eae6a38f..00000000 --- a/2.1.x/chapter2-6/src/main/resources/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -# 打印RequestMapping中的所有接口信息 -logging.level.org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping=trace - diff --git a/2.1.x/chapter2-7/.gitignore b/2.1.x/chapter2-7/.gitignore deleted file mode 100644 index 2af7cefb..00000000 --- a/2.1.x/chapter2-7/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -target/ -!.mvn/wrapper/maven-wrapper.jar - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -nbproject/private/ -build/ -nbbuild/ -dist/ -nbdist/ -.nb-gradle/ \ No newline at end of file diff --git a/2.1.x/chapter2-7/pom.xml b/2.1.x/chapter2-7/pom.xml deleted file mode 100644 index 882a8176..00000000 --- a/2.1.x/chapter2-7/pom.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.2.3.RELEASE - - - - com.didispace - chapter2-7 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - io.springfox - springfox-boot-starter - 3.0.0 - - - - org.projectlombok - lombok - provided - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - - - false - - jcenter-releases - jcenter - http://jcenter.bintray.com - - - - diff --git a/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/Chapter27Application.java b/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/Chapter27Application.java deleted file mode 100644 index 7a6a667b..00000000 --- a/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/Chapter27Application.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.didispace.chapter27; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import springfox.documentation.oas.annotations.EnableOpenApi; - -@EnableOpenApi -@SpringBootApplication -public class Chapter27Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter27Application.class, args); - } - -} diff --git a/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/User.java b/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/User.java deleted file mode 100644 index 25c99ae8..00000000 --- a/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/User.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.didispace.demo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.*; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@ApiModel("用户基本信息") -public class User { - - @ApiModelProperty("姓名") - @Size(max = 20) - private String name; - @ApiModelProperty("年龄") - @Max(150) - @Min(1) - private Integer age; - @NotNull - private String address; - @Pattern(regexp = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$") - private String email; - -} \ No newline at end of file diff --git a/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/UserController.java b/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/UserController.java deleted file mode 100644 index fcfb546d..00000000 --- a/2.1.x/chapter2-7/src/main/java/com/didispace/chapter27/UserController.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.didispace.demo; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; - -import javax.validation.Valid; -import java.util.ArrayList; -import java.util.List; - -@Api(tags="用户管理") -@RestController -public class UserController { - - @ApiOperation("创建用户") - @PostMapping("/users") - public User create(@RequestBody @Valid User user) { - return user; - } - - @ApiOperation("用户详情") - @GetMapping("/users/{id}") - public User findById(@PathVariable Long id) { - return new User("bbb", 21, "上海", "aaa@bbb.com"); - } - - @ApiOperation("用户列表") - @GetMapping("/users") - public List list(@ApiParam("查看第几页") @RequestParam int pageIndex, - @ApiParam("每页多少条") @RequestParam int pageSize) { - List result = new ArrayList<>(); - result.add(new User("aaa", 50, "北京", "aaa@ccc.com")); - result.add(new User("bbb", 21, "广州", "aaa@ddd.com")); - return result; - } - - @ApiIgnore - @DeleteMapping("/users/{id}") - public String deleteById(@PathVariable Long id) { - return "delete user : " + id; - } - -} \ No newline at end of file diff --git a/2.1.x/chapter2-7/src/main/resources/application.properties b/2.1.x/chapter2-7/src/main/resources/application.properties deleted file mode 100644 index d910c856..00000000 --- a/2.1.x/chapter2-7/src/main/resources/application.properties +++ /dev/null @@ -1,2 +0,0 @@ -logging.level.org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping=trace - diff --git a/2.1.x/chapter3-1/.gitignore b/2.1.x/chapter3-1/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter3-1/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter3-1/pom.xml b/2.1.x/chapter3-1/pom.xml deleted file mode 100644 index 4621591e..00000000 --- a/2.1.x/chapter3-1/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter3-1 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-jdbc - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/Chapter31Application.java b/2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/Chapter31Application.java deleted file mode 100644 index c83da9dd..00000000 --- a/2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/Chapter31Application.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.didispace.chapter31; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Chapter31Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter31Application.class, args); - } - -} diff --git a/2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/User.java b/2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/User.java deleted file mode 100644 index 5c54cf36..00000000 --- a/2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/User.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.didispace.chapter31; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class User { - - private String name; - private Integer age; - -} \ No newline at end of file diff --git a/2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/UserService.java b/2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/UserService.java deleted file mode 100644 index 2ce0b727..00000000 --- a/2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/UserService.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.didispace.chapter31; - -import java.util.List; - -public interface UserService { - - /** - * 新增一个用户 - * - * @param name - * @param age - */ - int create(String name, Integer age); - - /** - * 根据name查询用户 - * - * @param name - * @return - */ - List getByName(String name); - - /** - * 根据name删除用户 - * - * @param name - */ - int deleteByName(String name); - - /** - * 获取用户总量 - */ - int getAllUsers(); - - /** - * 删除所有用户 - */ - int deleteAllUsers(); - -} \ No newline at end of file diff --git a/2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/UserServiceImpl.java b/2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/UserServiceImpl.java deleted file mode 100644 index 3cb55fb2..00000000 --- a/2.1.x/chapter3-1/src/main/java/com/didispace/chapter31/UserServiceImpl.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.didispace.chapter31; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Service; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -@Service -public class UserServiceImpl implements UserService { - - private JdbcTemplate jdbcTemplate; - - UserServiceImpl(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - @Override - public int create(String name, Integer age) { - return jdbcTemplate.update("insert into USER(NAME, AGE) values(?, ?)", name, age); - } - - @Override - public List getByName(String name) { - List users = jdbcTemplate.query("select NAME, AGE from USER where NAME = ?", (resultSet, i) -> { - User user = new User(); - user.setName(resultSet.getString("NAME")); - user.setAge(resultSet.getInt("AGE")); - return user; - }, name); - return users; - } - - @Override - public int deleteByName(String name) { - return jdbcTemplate.update("delete from USER where NAME = ?", name); - } - - @Override - public int getAllUsers() { - return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class); - } - - @Override - public int deleteAllUsers() { - return jdbcTemplate.update("delete from USER"); - } - -} \ No newline at end of file diff --git a/2.1.x/chapter3-1/src/main/resources/application.properties b/2.1.x/chapter3-1/src/main/resources/application.properties deleted file mode 100644 index 66ff8fe4..00000000 --- a/2.1.x/chapter3-1/src/main/resources/application.properties +++ /dev/null @@ -1,4 +0,0 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/test -spring.datasource.username=root -spring.datasource.password= -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver \ No newline at end of file diff --git a/2.1.x/chapter3-1/src/test/java/com/didispace/chapter31/Chapter31ApplicationTests.java b/2.1.x/chapter3-1/src/test/java/com/didispace/chapter31/Chapter31ApplicationTests.java deleted file mode 100644 index 2905f545..00000000 --- a/2.1.x/chapter3-1/src/test/java/com/didispace/chapter31/Chapter31ApplicationTests.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.didispace.chapter31; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.RequestBuilder; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -import static org.hamcrest.Matchers.equalTo; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - - -@RunWith(SpringRunner.class) -@SpringBootTest -public class Chapter31ApplicationTests { - - @Autowired - private UserService userSerivce; - - @Before - public void setUp() { - // 准备,清空user表 - userSerivce.deleteAllUsers(); - } - - @Test - public void test() throws Exception { - // 插入5个用户 - userSerivce.create("Tom", 10); - userSerivce.create("Mike", 11); - userSerivce.create("Didispace", 30); - userSerivce.create("Oscar", 21); - userSerivce.create("Linda", 17); - - // 查询名为Oscar的用户,判断年龄是否匹配 - List userList = userSerivce.getByName("Oscar"); - Assert.assertEquals(21, userList.get(0).getAge().intValue()); - - // 查数据库,应该有5个用户 - Assert.assertEquals(5, userSerivce.getAllUsers()); - - // 删除两个用户 - userSerivce.deleteByName("Tom"); - userSerivce.deleteByName("Mike"); - - // 查数据库,应该有5个用户 - Assert.assertEquals(3, userSerivce.getAllUsers()); - - } - -} diff --git a/2.1.x/chapter3-10/.gitignore b/2.1.x/chapter3-10/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter3-10/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter3-10/pom.xml b/2.1.x/chapter3-10/pom.xml deleted file mode 100644 index 9b2abc07..00000000 --- a/2.1.x/chapter3-10/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter3-10 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - org.springframework.boot - spring-boot-starter-actuator - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/Chapter310Application.java b/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/Chapter310Application.java deleted file mode 100644 index 72a7dd3e..00000000 --- a/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/Chapter310Application.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.didispace.chapter310; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication -public class Chapter310Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter310Application.class, args); - } - - @RestController - static class TextController { - - @GetMapping("/hello") - public String hello() { - return "hello world"; - } - - } - -} diff --git a/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/User.java b/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/User.java deleted file mode 100644 index a2347ea8..00000000 --- a/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/User.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.didispace.chapter310; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.persistence.*; -import javax.validation.constraints.Max; - -@Entity -@Data -@NoArgsConstructor -public class User { - - @Id - @GeneratedValue - private Long id; - - private String name; - @Max(50) - private Integer age; - - public User(String name, Integer age) { - this.name = name; - this.age = age; - } - -} \ No newline at end of file diff --git a/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/UserRepository.java b/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/UserRepository.java deleted file mode 100644 index 366e1d21..00000000 --- a/2.1.x/chapter3-10/src/main/java/com/didispace/chapter310/UserRepository.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.didispace.chapter310; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -/** - * Created by 程序猿DD/翟永超 on 2020/7/9. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -public interface UserRepository extends JpaRepository { - - User findByName(String name); - - User findByNameAndAge(String name, Integer age); - - @Query("from User u where u.name=:name") - User findUser(@Param("name") String name); - -} diff --git a/2.1.x/chapter3-10/src/main/resources/application.properties b/2.1.x/chapter3-10/src/main/resources/application.properties deleted file mode 100644 index 7238387a..00000000 --- a/2.1.x/chapter3-10/src/main/resources/application.properties +++ /dev/null @@ -1,7 +0,0 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/test -spring.datasource.username=root -spring.datasource.password=12345678 -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver - -spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect -spring.jpa.hibernate.ddl-auto=create diff --git a/2.1.x/chapter3-10/src/test/java/com/didispace/chapter310/Chapter310ApplicationTests.java b/2.1.x/chapter3-10/src/test/java/com/didispace/chapter310/Chapter310ApplicationTests.java deleted file mode 100644 index 02fee65b..00000000 --- a/2.1.x/chapter3-10/src/test/java/com/didispace/chapter310/Chapter310ApplicationTests.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.didispace.chapter310; - -import lombok.extern.slf4j.Slf4j; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; - - -@Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest -public class Chapter310ApplicationTests { - - @Autowired - private UserRepository userRepository; - - @Test - @Transactional - public void test() throws Exception { - // 创建10条记录 - userRepository.save(new User("AAA", 10)); - userRepository.save(new User("BBB", 20)); - userRepository.save(new User("CCC", 30)); - userRepository.save(new User("DDD", 40)); - userRepository.save(new User("EEE", 50)); - userRepository.save(new User("FFF", 60)); - userRepository.save(new User("GGG", 70)); - userRepository.save(new User("HHH", 80)); - userRepository.save(new User("III", 90)); - userRepository.save(new User("JJJ", 100)); - - // 测试findAll, 查询所有记录 - Assert.assertEquals(10, userRepository.findAll().size()); - - // 测试findByName, 查询姓名为FFF的User - Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue()); - - // 测试findUser, 查询姓名为FFF的User - Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue()); - - // 测试findByNameAndAge, 查询姓名为FFF并且年龄为60的User - Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName()); - - // 测试删除姓名为AAA的User - userRepository.delete(userRepository.findByName("AAA")); - - // 测试findAll, 查询所有记录, 验证上面的删除是否成功 - Assert.assertEquals(9, userRepository.findAll().size()); - - } - -} diff --git a/2.1.x/chapter3-2/.gitignore b/2.1.x/chapter3-2/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter3-2/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter3-2/pom.xml b/2.1.x/chapter3-2/pom.xml deleted file mode 100644 index 2de383a2..00000000 --- a/2.1.x/chapter3-2/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter3-2 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-jdbc - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/Chapter32Application.java b/2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/Chapter32Application.java deleted file mode 100644 index d782cff1..00000000 --- a/2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/Chapter32Application.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.didispace.chapter32; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Chapter32Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter32Application.class, args); - } - -} diff --git a/2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/User.java b/2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/User.java deleted file mode 100644 index 7553c2e2..00000000 --- a/2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/User.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.didispace.chapter32; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class User { - - private String name; - private Integer age; - -} \ No newline at end of file diff --git a/2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/UserService.java b/2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/UserService.java deleted file mode 100644 index c4e3cd02..00000000 --- a/2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/UserService.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.didispace.chapter32; - -import java.util.List; - -public interface UserService { - - /** - * 新增一个用户 - * - * @param name - * @param age - */ - int create(String name, Integer age); - - /** - * 根据name查询用户 - * - * @param name - * @return - */ - List getByName(String name); - - /** - * 根据name删除用户 - * - * @param name - */ - int deleteByName(String name); - - /** - * 获取用户总量 - */ - int getAllUsers(); - - /** - * 删除所有用户 - */ - int deleteAllUsers(); - -} \ No newline at end of file diff --git a/2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/UserServiceImpl.java b/2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/UserServiceImpl.java deleted file mode 100644 index 9fb1bd08..00000000 --- a/2.1.x/chapter3-2/src/main/java/com/didispace/chapter32/UserServiceImpl.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.didispace.chapter32; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Service; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -@Service -public class UserServiceImpl implements UserService { - - private JdbcTemplate jdbcTemplate; - - UserServiceImpl(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - @Override - public int create(String name, Integer age) { - return jdbcTemplate.update("insert into USER(NAME, AGE) values(?, ?)", name, age); - } - - @Override - public List getByName(String name) { - List users = jdbcTemplate.query("select NAME, AGE from USER where NAME = ?", (resultSet, i) -> { - User user = new User(); - user.setName(resultSet.getString("NAME")); - user.setAge(resultSet.getInt("AGE")); - return user; - }, name); - return users; - } - - @Override - public int deleteByName(String name) { - return jdbcTemplate.update("delete from USER where NAME = ?", name); - } - - @Override - public int getAllUsers() { - return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class); - } - - @Override - public int deleteAllUsers() { - return jdbcTemplate.update("delete from USER"); - } - -} \ No newline at end of file diff --git a/2.1.x/chapter3-2/src/main/resources/application.properties b/2.1.x/chapter3-2/src/main/resources/application.properties deleted file mode 100644 index b0d32069..00000000 --- a/2.1.x/chapter3-2/src/main/resources/application.properties +++ /dev/null @@ -1,17 +0,0 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/test -spring.datasource.username=root -spring.datasource.password= -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver - -# 最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size -spring.datasource.hikari.minimum-idle=10 -# 最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值 -spring.datasource.hikari.maximum-pool-size=20 -# 空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。 -spring.datasource.hikari.idle-timeout=500000 -# 连接最大存活时间.不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短 -spring.datasource.hikari.max-lifetime=540000 -# 连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒 -spring.datasource.hikari.connection-timeout=60000 -# 用于测试连接是否可用的查询语句 -spring.datasource.hikari.connection-test-query=SELECT 1 diff --git a/2.1.x/chapter3-2/src/test/java/com/didispace/chapter32/Chapter32ApplicationTests.java b/2.1.x/chapter3-2/src/test/java/com/didispace/chapter32/Chapter32ApplicationTests.java deleted file mode 100644 index e23dd01c..00000000 --- a/2.1.x/chapter3-2/src/test/java/com/didispace/chapter32/Chapter32ApplicationTests.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.didispace.chapter32; - -import lombok.extern.slf4j.Slf4j; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.RequestBuilder; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.transaction.annotation.Transactional; - -import javax.sql.DataSource; -import java.util.List; - -import static org.hamcrest.Matchers.equalTo; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest -public class Chapter32ApplicationTests { - - @Autowired - private UserService userSerivce; - - @Autowired - private DataSource dataSource; - - @Before - public void setUp() { - // 准备,清空user表 - userSerivce.deleteAllUsers(); - - } - - @Test - public void test() throws Exception { - // 插入5个用户 - userSerivce.create("Tom", 10); - userSerivce.create("Mike", 11); - userSerivce.create("Didispace", 30); - userSerivce.create("Oscar", 21); - userSerivce.create("Linda", 17); - - // 查询名为Oscar的用户,判断年龄是否匹配 - List userList = userSerivce.getByName("Oscar"); - Assert.assertEquals(21, userList.get(0).getAge().intValue()); - - // 查数据库,应该有5个用户 - Assert.assertEquals(5, userSerivce.getAllUsers()); - - // 删除两个用户 - userSerivce.deleteByName("Tom"); - userSerivce.deleteByName("Mike"); - - // 查数据库,应该有5个用户 - Assert.assertEquals(3, userSerivce.getAllUsers()); - - } - -} diff --git a/2.1.x/chapter3-3/.gitignore b/2.1.x/chapter3-3/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter3-3/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter3-3/pom.xml b/2.1.x/chapter3-3/pom.xml deleted file mode 100644 index c83eddc6..00000000 --- a/2.1.x/chapter3-3/pom.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter3-3 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-jdbc - - - - com.alibaba - druid-spring-boot-starter - 1.1.21 - - - - org.springframework.boot - spring-boot-starter-actuator - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/Chapter33Application.java b/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/Chapter33Application.java deleted file mode 100644 index 4653f680..00000000 --- a/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/Chapter33Application.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.didispace.chapter33; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication -public class Chapter33Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter33Application.class, args); - } - - @RestController - static class TextController { - - @GetMapping("/hello") - public String hello() { - return "hello world"; - } - - } - -} diff --git a/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/User.java b/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/User.java deleted file mode 100644 index ac0b9460..00000000 --- a/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/User.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.didispace.chapter33; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class User { - - private String name; - private Integer age; - -} \ No newline at end of file diff --git a/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/UserController.java b/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/UserController.java deleted file mode 100644 index f88d0dc0..00000000 --- a/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/UserController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.didispace.chapter33; - -import lombok.AllArgsConstructor; -import lombok.Data; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * Created by 程序猿DD/翟永超 on 2020/2/8. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -@Data -@AllArgsConstructor -@RestController -public class UserController { - - private UserService userService; - - @PostMapping("/user") - public int create(@RequestBody User user) { - return userService.create(user.getName(), user.getAge()); - } - - @GetMapping("/user/{name}") - public List getByName(@PathVariable String name) { - return userService.getByName(name); - } - - @DeleteMapping("/user/{name}") - public int deleteByName(@PathVariable String name) { - return userService.deleteByName(name); - } - - @GetMapping("/user/count") - public int getAllUsers() { - return userService.getAllUsers(); - } - - @DeleteMapping("/user/all") - public int deleteAllUsers() { - return userService.deleteAllUsers(); - } - -} diff --git a/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/UserService.java b/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/UserService.java deleted file mode 100644 index 7eddffb5..00000000 --- a/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/UserService.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.didispace.chapter33; - -import java.util.List; - -public interface UserService { - - /** - * 新增一个用户 - * - * @param name - * @param age - */ - int create(String name, Integer age); - - /** - * 根据name查询用户 - * - * @param name - * @return - */ - List getByName(String name); - - /** - * 根据name删除用户 - * - * @param name - */ - int deleteByName(String name); - - /** - * 获取用户总量 - */ - int getAllUsers(); - - /** - * 删除所有用户 - */ - int deleteAllUsers(); - -} \ No newline at end of file diff --git a/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/UserServiceImpl.java b/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/UserServiceImpl.java deleted file mode 100644 index 43f0f79a..00000000 --- a/2.1.x/chapter3-3/src/main/java/com/didispace/chapter33/UserServiceImpl.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.didispace.chapter33; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Service; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -@Service -public class UserServiceImpl implements UserService { - - private JdbcTemplate jdbcTemplate; - - UserServiceImpl(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - @Override - public int create(String name, Integer age) { - return jdbcTemplate.update("insert into USER(NAME, AGE) values(?, ?)", name, age); - } - - @Override - public List getByName(String name) { - List users = jdbcTemplate.query("select NAME, AGE from USER where NAME = ?", (resultSet, i) -> { - User user = new User(); - user.setName(resultSet.getString("NAME")); - user.setAge(resultSet.getInt("AGE")); - return user; - }, name); - return users; - } - - @Override - public int deleteByName(String name) { - return jdbcTemplate.update("delete from USER where NAME = ?", name); - } - - @Override - public int getAllUsers() { - return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class); - } - - @Override - public int deleteAllUsers() { - return jdbcTemplate.update("delete from USER"); - } - -} \ No newline at end of file diff --git a/2.1.x/chapter3-3/src/main/resources/application.properties b/2.1.x/chapter3-3/src/main/resources/application.properties deleted file mode 100644 index 26f3a97b..00000000 --- a/2.1.x/chapter3-3/src/main/resources/application.properties +++ /dev/null @@ -1,29 +0,0 @@ - -# 基础配置 -spring.datasource.druid.url=jdbc:mysql://localhost:3306/test -spring.datasource.druid.username=root -spring.datasource.druid.password= -spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver - -# 连接池配置 -spring.datasource.druid.initialSize=10 -spring.datasource.druid.maxActive=20 -spring.datasource.druid.maxWait=60000 -spring.datasource.druid.minIdle=1 -spring.datasource.druid.timeBetweenEvictionRunsMillis=60000 -spring.datasource.druid.minEvictableIdleTimeMillis=300000 -spring.datasource.druid.testWhileIdle=true -spring.datasource.druid.testOnBorrow=true -spring.datasource.druid.testOnReturn=false -spring.datasource.druid.poolPreparedStatements=true -spring.datasource.druid.maxOpenPreparedStatements=20 -spring.datasource.druid.validationQuery=SELECT 1 -spring.datasource.druid.validation-query-timeout=500 -spring.datasource.druid.filters=stat,wall - -# 监控配置 -spring.datasource.druid.stat-view-servlet.enabled=true -spring.datasource.druid.stat-view-servlet.url-pattern=/druid/* -spring.datasource.druid.stat-view-servlet.reset-enable=true -spring.datasource.druid.stat-view-servlet.login-username=admin -spring.datasource.druid.stat-view-servlet.login-password=admin diff --git a/2.1.x/chapter3-3/src/test/java/com/didispace/chapter33/Chapter33ApplicationTests.java b/2.1.x/chapter3-3/src/test/java/com/didispace/chapter33/Chapter33ApplicationTests.java deleted file mode 100644 index f86be74a..00000000 --- a/2.1.x/chapter3-3/src/test/java/com/didispace/chapter33/Chapter33ApplicationTests.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.didispace.chapter33; - -import lombok.extern.slf4j.Slf4j; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.RequestBuilder; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.transaction.annotation.Transactional; - -import javax.sql.DataSource; -import java.util.List; - -import static org.hamcrest.Matchers.equalTo; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest -public class Chapter33ApplicationTests { - - @Autowired - private UserService userSerivce; - - @Autowired - private DataSource dataSource; - - @Before - public void setUp() { - // 准备,清空user表 - userSerivce.deleteAllUsers(); - - } - - @Test - public void test() throws Exception { - // 插入5个用户 - userSerivce.create("Tom", 10); - userSerivce.create("Mike", 11); - userSerivce.create("Didispace", 30); - userSerivce.create("Oscar", 21); - userSerivce.create("Linda", 17); - - // 查询名为Oscar的用户,判断年龄是否匹配 - List userList = userSerivce.getByName("Oscar"); - Assert.assertEquals(21, userList.get(0).getAge().intValue()); - - // 查数据库,应该有5个用户 - Assert.assertEquals(5, userSerivce.getAllUsers()); - - // 删除两个用户 - userSerivce.deleteByName("Tom"); - userSerivce.deleteByName("Mike"); - - // 查数据库,应该有5个用户 - Assert.assertEquals(3, userSerivce.getAllUsers()); - - } - -} diff --git a/2.1.x/chapter3-4/.gitignore b/2.1.x/chapter3-4/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter3-4/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter3-4/pom.xml b/2.1.x/chapter3-4/pom.xml deleted file mode 100644 index 602beb6d..00000000 --- a/2.1.x/chapter3-4/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter3-4 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - org.springframework.boot - spring-boot-starter-actuator - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter3-4/src/main/java/com/didispace/chapter34/Chapter34Application.java b/2.1.x/chapter3-4/src/main/java/com/didispace/chapter34/Chapter34Application.java deleted file mode 100644 index 4b9e8193..00000000 --- a/2.1.x/chapter3-4/src/main/java/com/didispace/chapter34/Chapter34Application.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.didispace.chapter34; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication -public class Chapter34Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter34Application.class, args); - } - - @RestController - static class TextController { - - @GetMapping("/hello") - public String hello() { - return "hello world"; - } - - } - -} diff --git a/2.1.x/chapter3-4/src/main/java/com/didispace/chapter34/User.java b/2.1.x/chapter3-4/src/main/java/com/didispace/chapter34/User.java deleted file mode 100644 index 701ed4d4..00000000 --- a/2.1.x/chapter3-4/src/main/java/com/didispace/chapter34/User.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.didispace.chapter34; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; - -@Entity -@Data -@NoArgsConstructor -public class User { - - @Id - @GeneratedValue - private Long id; - - private String name; - private Integer age; - - public User(String name, Integer age) { - this.name = name; - this.age = age; - } -} \ No newline at end of file diff --git a/2.1.x/chapter3-4/src/main/java/com/didispace/chapter34/UserRepository.java b/2.1.x/chapter3-4/src/main/java/com/didispace/chapter34/UserRepository.java deleted file mode 100644 index 17533dd3..00000000 --- a/2.1.x/chapter3-4/src/main/java/com/didispace/chapter34/UserRepository.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.didispace.chapter34; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -/** - * Created by 程序猿DD/翟永超 on 2020/2/15. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -public interface UserRepository extends JpaRepository { - - User findByName(String name); - - User findByNameAndAge(String name, Integer age); - - @Query("from User u where u.name=:name") - User findUser(@Param("name") String name); - -} diff --git a/2.1.x/chapter3-4/src/main/resources/application.properties b/2.1.x/chapter3-4/src/main/resources/application.properties deleted file mode 100644 index 44c64de2..00000000 --- a/2.1.x/chapter3-4/src/main/resources/application.properties +++ /dev/null @@ -1,6 +0,0 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/test -spring.datasource.username=root -spring.datasource.password= -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver - -spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/2.1.x/chapter3-4/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java b/2.1.x/chapter3-4/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java deleted file mode 100644 index e104e22c..00000000 --- a/2.1.x/chapter3-4/src/test/java/com/didispace/chapter34/Chapter34ApplicationTests.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.didispace.chapter34; - -import lombok.extern.slf4j.Slf4j; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import javax.sql.DataSource; -import java.util.List; - -@Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest -public class Chapter34ApplicationTests { - - @Autowired - private UserRepository userRepository; - - @Test - public void test() throws Exception { - // 创建10条记录 - userRepository.save(new User("AAA", 10)); - userRepository.save(new User("BBB", 20)); - userRepository.save(new User("CCC", 30)); - userRepository.save(new User("DDD", 40)); - userRepository.save(new User("EEE", 50)); - userRepository.save(new User("FFF", 60)); - userRepository.save(new User("GGG", 70)); - userRepository.save(new User("HHH", 80)); - userRepository.save(new User("III", 90)); - userRepository.save(new User("JJJ", 100)); - - // 测试findAll, 查询所有记录 - Assert.assertEquals(10, userRepository.findAll().size()); - - // 测试findByName, 查询姓名为FFF的User - Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue()); - - // 测试findUser, 查询姓名为FFF的User - Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue()); - - // 测试findByNameAndAge, 查询姓名为FFF并且年龄为60的User - Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName()); - - // 测试删除姓名为AAA的User - userRepository.delete(userRepository.findByName("AAA")); - - // 测试findAll, 查询所有记录, 验证上面的删除是否成功 - Assert.assertEquals(9, userRepository.findAll().size()); - - } - -} diff --git a/2.1.x/chapter3-5/.gitignore b/2.1.x/chapter3-5/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter3-5/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter3-5/pom.xml b/2.1.x/chapter3-5/pom.xml deleted file mode 100644 index 2cb4f499..00000000 --- a/2.1.x/chapter3-5/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter3-5 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - 2.1.1 - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter3-5/src/main/java/com/didispace/chapter35/Chapter35Application.java b/2.1.x/chapter3-5/src/main/java/com/didispace/chapter35/Chapter35Application.java deleted file mode 100644 index 48e71f85..00000000 --- a/2.1.x/chapter3-5/src/main/java/com/didispace/chapter35/Chapter35Application.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.didispace.chapter35; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Chapter35Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter35Application.class, args); - } - -} diff --git a/2.1.x/chapter3-5/src/main/java/com/didispace/chapter35/User.java b/2.1.x/chapter3-5/src/main/java/com/didispace/chapter35/User.java deleted file mode 100644 index d815f4c1..00000000 --- a/2.1.x/chapter3-5/src/main/java/com/didispace/chapter35/User.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.didispace.chapter35; - -import lombok.Data; -import lombok.NoArgsConstructor; - - -@Data -@NoArgsConstructor -public class User { - - private Long id; - - private String name; - private Integer age; - - public User(String name, Integer age) { - this.name = name; - this.age = age; - } -} \ No newline at end of file diff --git a/2.1.x/chapter3-5/src/main/java/com/didispace/chapter35/UserMapper.java b/2.1.x/chapter3-5/src/main/java/com/didispace/chapter35/UserMapper.java deleted file mode 100644 index 17f6aa18..00000000 --- a/2.1.x/chapter3-5/src/main/java/com/didispace/chapter35/UserMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.didispace.chapter35; - -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -/** - * Created by 程序猿DD/翟永超 on 2020/2/15. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -@Mapper -public interface UserMapper { - - @Select("SELECT * FROM USER WHERE NAME = #{name}") - User findByName(@Param("name") String name); - - @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})") - int insert(@Param("name") String name, @Param("age") Integer age); - -} diff --git a/2.1.x/chapter3-5/src/main/resources/application.properties b/2.1.x/chapter3-5/src/main/resources/application.properties deleted file mode 100644 index 779d89b9..00000000 --- a/2.1.x/chapter3-5/src/main/resources/application.properties +++ /dev/null @@ -1,4 +0,0 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/test -spring.datasource.username=root -spring.datasource.password=12345678 -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver diff --git a/2.1.x/chapter3-5/src/test/java/com/didispace/chapter35/Chapter35ApplicationTests.java b/2.1.x/chapter3-5/src/test/java/com/didispace/chapter35/Chapter35ApplicationTests.java deleted file mode 100644 index b6de7a08..00000000 --- a/2.1.x/chapter3-5/src/test/java/com/didispace/chapter35/Chapter35ApplicationTests.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.didispace.chapter35; - -import lombok.extern.slf4j.Slf4j; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; - -import javax.sql.DataSource; -import java.util.List; - -@RunWith(SpringRunner.class) -@SpringBootTest -@Transactional -public class Chapter35ApplicationTests { - - @Autowired - private UserMapper userMapper; - - @Test - @Rollback - public void test() throws Exception { - userMapper.insert("AAA", 20); - User u = userMapper.findByName("AAA"); - Assert.assertEquals(20, u.getAge().intValue()); - } - -} diff --git a/2.1.x/chapter3-6/.gitignore b/2.1.x/chapter3-6/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter3-6/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter3-6/pom.xml b/2.1.x/chapter3-6/pom.xml deleted file mode 100644 index 2f515975..00000000 --- a/2.1.x/chapter3-6/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter3-6 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - 2.1.1 - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter3-6/src/main/java/com/didispace/chapter36/Chapter36Application.java b/2.1.x/chapter3-6/src/main/java/com/didispace/chapter36/Chapter36Application.java deleted file mode 100644 index 2ce02b15..00000000 --- a/2.1.x/chapter3-6/src/main/java/com/didispace/chapter36/Chapter36Application.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.didispace.chapter36; - -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@MapperScan("com.didispace.chapter36.mapper") -@SpringBootApplication -public class Chapter36Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter36Application.class, args); - } - -} diff --git a/2.1.x/chapter3-6/src/main/java/com/didispace/chapter36/entity/User.java b/2.1.x/chapter3-6/src/main/java/com/didispace/chapter36/entity/User.java deleted file mode 100644 index 6196ed6d..00000000 --- a/2.1.x/chapter3-6/src/main/java/com/didispace/chapter36/entity/User.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.didispace.chapter36.entity; - -import lombok.Data; -import lombok.NoArgsConstructor; - - -@Data -@NoArgsConstructor -public class User { - - private Long id; - - private String name; - private Integer age; - - public User(String name, Integer age) { - this.name = name; - this.age = age; - } -} \ No newline at end of file diff --git a/2.1.x/chapter3-6/src/main/java/com/didispace/chapter36/mapper/UserMapper.java b/2.1.x/chapter3-6/src/main/java/com/didispace/chapter36/mapper/UserMapper.java deleted file mode 100644 index cd361f46..00000000 --- a/2.1.x/chapter3-6/src/main/java/com/didispace/chapter36/mapper/UserMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.didispace.chapter36.mapper; - -import com.didispace.chapter36.entity.User; -import org.apache.ibatis.annotations.Param; - -/** - * Created by 程序猿DD/翟永超 on 2020/2/28. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -public interface UserMapper { - - User findByName(@Param("name") String name); - - int insert(@Param("name") String name, @Param("age") Integer age); - -} diff --git a/2.1.x/chapter3-6/src/main/resources/application.properties b/2.1.x/chapter3-6/src/main/resources/application.properties deleted file mode 100644 index ec5cde49..00000000 --- a/2.1.x/chapter3-6/src/main/resources/application.properties +++ /dev/null @@ -1,6 +0,0 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/test -spring.datasource.username=root -spring.datasource.password=12345678 -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver - -mybatis.mapper-locations=classpath:mapper/*.xml diff --git a/2.1.x/chapter3-6/src/main/resources/mapper/UserMapper.xml b/2.1.x/chapter3-6/src/main/resources/mapper/UserMapper.xml deleted file mode 100644 index 520d290e..00000000 --- a/2.1.x/chapter3-6/src/main/resources/mapper/UserMapper.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age}) - - \ No newline at end of file diff --git a/2.1.x/chapter3-6/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java b/2.1.x/chapter3-6/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java deleted file mode 100644 index aab8acb1..00000000 --- a/2.1.x/chapter3-6/src/test/java/com/didispace/chapter36/Chapter36ApplicationTests.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.didispace.chapter36; - -import com.didispace.chapter36.entity.User; -import com.didispace.chapter36.mapper.UserMapper; -import lombok.extern.slf4j.Slf4j; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; - -@Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest -@Transactional -public class Chapter36ApplicationTests { - - @Autowired - private UserMapper userMapper; - - @Test - @Rollback - public void test() throws Exception { - userMapper.insert("AAA", 20); - User u = userMapper.findByName("AAA"); - Assert.assertEquals(20, u.getAge().intValue()); - } - -} diff --git a/2.1.x/chapter3-7/.gitignore b/2.1.x/chapter3-7/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter3-7/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter3-7/pom.xml b/2.1.x/chapter3-7/pom.xml deleted file mode 100644 index f8314a33..00000000 --- a/2.1.x/chapter3-7/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter3-7 - 0.0.1-SNAPSHOT - 使用JDBCTemplate的多数据源配置 - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-jdbc - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/Chapter37Application.java b/2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/Chapter37Application.java deleted file mode 100644 index 92be7068..00000000 --- a/2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/Chapter37Application.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.didispace.chapter37; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Chapter37Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter37Application.class, args); - } - -} diff --git a/2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/DataSourceConfiguration.java b/2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/DataSourceConfiguration.java deleted file mode 100644 index f821153b..00000000 --- a/2.1.x/chapter3-7/src/main/java/com/didispace/chapter37/DataSourceConfiguration.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.didispace.chapter37; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.jdbc.core.JdbcTemplate; - -import javax.sql.DataSource; - -@Configuration -public class DataSourceConfiguration { - - @Primary - @Bean - @ConfigurationProperties(prefix = "spring.datasource.primary") - public DataSource primaryDataSource() { - return DataSourceBuilder.create().build(); - } - - @Bean - @ConfigurationProperties(prefix = "spring.datasource.secondary") - public DataSource secondaryDataSource() { - return DataSourceBuilder.create().build(); - } - - @Bean - public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource primaryDataSource) { - return new JdbcTemplate(primaryDataSource); - } - - @Bean - public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) { - return new JdbcTemplate(secondaryDataSource); - } - -} diff --git a/2.1.x/chapter3-7/src/main/resources/application.properties b/2.1.x/chapter3-7/src/main/resources/application.properties deleted file mode 100644 index 25937c84..00000000 --- a/2.1.x/chapter3-7/src/main/resources/application.properties +++ /dev/null @@ -1,11 +0,0 @@ -# pring boot 1.x的配置:spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1 -spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1 -spring.datasource.primary.username=root -spring.datasource.primary.password=123456 -spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver - -# spring boot 1.x的配置:spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2 -spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2 -spring.datasource.secondary.username=root -spring.datasource.secondary.password=123456 -spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver \ No newline at end of file diff --git a/2.1.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java b/2.1.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java deleted file mode 100644 index 5aa8a72f..00000000 --- a/2.1.x/chapter3-7/src/test/java/com/didispace/chapter37/Chapter37ApplicationTests.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.didispace.chapter37; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.junit4.SpringRunner; - - -@RunWith(SpringRunner.class) -@SpringBootTest -public class Chapter37ApplicationTests { - - @Autowired - protected JdbcTemplate primaryJdbcTemplate; - - @Autowired - protected JdbcTemplate secondaryJdbcTemplate; - - @Before - public void setUp() { - primaryJdbcTemplate.update("DELETE FROM USER "); - secondaryJdbcTemplate.update("DELETE FROM USER "); - } - - @Test - public void test() throws Exception { - // 往第一个数据源中插入 2 条数据 - primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "aaa", 20); - primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "bbb", 30); - - // 往第二个数据源中插入 1 条数据,若插入的是第一个数据源,则会主键冲突报错 - secondaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "ccc", 20); - - // 查一下第一个数据源中是否有 2 条数据,验证插入是否成功 - Assert.assertEquals("2", primaryJdbcTemplate.queryForObject("select count(1) from user", String.class)); - - // 查一下第一个数据源中是否有 1 条数据,验证插入是否成功 - Assert.assertEquals("1", secondaryJdbcTemplate.queryForObject("select count(1) from user", String.class)); - } - -} diff --git a/2.1.x/chapter3-8/.gitignore b/2.1.x/chapter3-8/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter3-8/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter3-8/pom.xml b/2.1.x/chapter3-8/pom.xml deleted file mode 100644 index cd677906..00000000 --- a/2.1.x/chapter3-8/pom.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter3-8 - 0.0.1-SNAPSHOT - 使用spring-data-jpa的多数据源配置 - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - org.springframework.boot - spring-boot-starter-actuator - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java deleted file mode 100644 index d2e5f499..00000000 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/Chapter38Application.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.didispace.chapter38; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication -public class Chapter38Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter38Application.class, args); - } - -} diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java deleted file mode 100644 index 6470beb6..00000000 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/DataSourceConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.didispace.chapter38; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.jdbc.core.JdbcTemplate; - -import javax.sql.DataSource; - -@Configuration -public class DataSourceConfiguration { - - @Primary - @Bean - @ConfigurationProperties(prefix = "spring.datasource.primary") - public DataSource primaryDataSource() { - return DataSourceBuilder.create().build(); - } - - @Bean - @ConfigurationProperties(prefix = "spring.datasource.secondary") - public DataSource secondaryDataSource() { - return DataSourceBuilder.create().build(); - } - -} diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java deleted file mode 100644 index 3bcfadc0..00000000 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/PrimaryConfig.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.didispace.chapter38; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; -import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; -import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import javax.persistence.EntityManager; -import javax.sql.DataSource; -import java.util.Map; - -@Configuration -@EnableTransactionManagement -@EnableJpaRepositories( - entityManagerFactoryRef="entityManagerFactoryPrimary", - transactionManagerRef="transactionManagerPrimary", - basePackages= { "com.didispace.chapter38.p" }) //设置Repository所在位置 -public class PrimaryConfig { - - @Autowired - @Qualifier("primaryDataSource") - private DataSource primaryDataSource; - - @Autowired - private JpaProperties jpaProperties; - @Autowired - private HibernateProperties hibernateProperties; - - private Map getVendorProperties() { - return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()); - } - - @Primary - @Bean(name = "entityManagerPrimary") - public EntityManager entityManager(EntityManagerFactoryBuilder builder) { - return entityManagerFactoryPrimary(builder).getObject().createEntityManager(); - } - - @Primary - @Bean(name = "entityManagerFactoryPrimary") - public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) { -// HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); -// jpaVendorAdapter.setGenerateDdl(true); - return builder - .dataSource(primaryDataSource) - .packages("com.didispace.chapter38.p") //设置实体类所在位置 - .persistenceUnit("primaryPersistenceUnit") - .properties(getVendorProperties()) - .build(); - } - - @Primary - @Bean(name = "transactionManagerPrimary") - public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { - return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); - } - - -} \ No newline at end of file diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java deleted file mode 100644 index 7b8df6a3..00000000 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/SecondaryConfig.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.didispace.chapter38; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; -import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; -import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import javax.persistence.EntityManager; -import javax.sql.DataSource; -import java.util.Map; - -@Configuration -@EnableTransactionManagement -@EnableJpaRepositories( - entityManagerFactoryRef="entityManagerFactorySecondary", - transactionManagerRef="transactionManagerSecondary", - basePackages= { "com.didispace.chapter38.s" }) //设置Repository所在位置 -public class SecondaryConfig { - - @Autowired - @Qualifier("secondaryDataSource") - private DataSource secondaryDataSource; - - @Autowired - private JpaProperties jpaProperties; - @Autowired - private HibernateProperties hibernateProperties; - - private Map getVendorProperties() { - return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()); - } - - @Bean(name = "entityManagerSecondary") - public EntityManager entityManager(EntityManagerFactoryBuilder builder) { - return entityManagerFactorySecondary(builder).getObject().createEntityManager(); - } - - @Bean(name = "entityManagerFactorySecondary") - public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) { - return builder - .dataSource(secondaryDataSource) - .packages("com.didispace.chapter38.s") //设置实体类所在位置 - .persistenceUnit("secondaryPersistenceUnit") - .properties(getVendorProperties()) - .build(); - } - - @Bean(name = "transactionManagerSecondary") - PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) { - return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject()); - } - -} \ No newline at end of file diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java deleted file mode 100644 index 83aaf3c9..00000000 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/User.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.didispace.chapter38.p; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; - -@Entity -@Data -@NoArgsConstructor -public class User { - - @Id - @GeneratedValue - private Long id; - - private String name; - private Integer age; - - public User(String name, Integer age) { - this.name = name; - this.age = age; - } -} \ No newline at end of file diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java deleted file mode 100644 index e91080e1..00000000 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/p/UserRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.didispace.chapter38.p; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -/** - * Created by 程序猿DD/翟永超 on 2020/6/22. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -public interface UserRepository extends JpaRepository { - -} diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/Message.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/Message.java deleted file mode 100644 index 956178b8..00000000 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/Message.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.didispace.chapter38.s; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; - -@Entity -@Data -@NoArgsConstructor -public class Message { - - @Id - @GeneratedValue - private Long id; - - private String title; - private String message; - - public Message(String title, String message) { - this.title = title; - this.message = message; - } - -} \ No newline at end of file diff --git a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/MessageRepository.java b/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/MessageRepository.java deleted file mode 100644 index 13360488..00000000 --- a/2.1.x/chapter3-8/src/main/java/com/didispace/chapter38/s/MessageRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.didispace.chapter38.s; - -import org.springframework.data.jpa.repository.JpaRepository; - -/** - * Created by 程序猿DD/翟永超 on 2020/6/22. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -public interface MessageRepository extends JpaRepository { - - -} diff --git a/2.1.x/chapter3-8/src/main/resources/application.properties b/2.1.x/chapter3-8/src/main/resources/application.properties deleted file mode 100644 index 0d82f6cd..00000000 --- a/2.1.x/chapter3-8/src/main/resources/application.properties +++ /dev/null @@ -1,16 +0,0 @@ -# pring boot 1.x的配置:spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1 -spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1 -spring.datasource.primary.username=root -spring.datasource.primary.password=12345678 -spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver - -# spring boot 1.x的配置:spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2 -spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2 -spring.datasource.secondary.username=root -spring.datasource.secondary.password=12345678 -spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver - -# 日志打印执行的SQL -spring.jpa.show-sql=true -# Hibernate的DDL策略 -spring.jpa.hibernate.ddl-auto=create-drop diff --git a/2.1.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java b/2.1.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java deleted file mode 100644 index 9c9ef3e7..00000000 --- a/2.1.x/chapter3-8/src/test/java/com/didispace/chapter38/Chapter38ApplicationTests.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.didispace.chapter38; - -import com.didispace.chapter38.p.User; -import com.didispace.chapter38.p.UserRepository; -import com.didispace.chapter38.s.Message; -import com.didispace.chapter38.s.MessageRepository; -import lombok.extern.slf4j.Slf4j; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest -public class Chapter38ApplicationTests { - - @Autowired - private UserRepository userRepository; - @Autowired - private MessageRepository messageRepository; - - @Test - public void test() throws Exception { - userRepository.save(new User("aaa", 10)); - userRepository.save(new User("bbb", 20)); - userRepository.save(new User("ccc", 30)); - userRepository.save(new User("ddd", 40)); - userRepository.save(new User("eee", 50)); - - Assert.assertEquals(5, userRepository.findAll().size()); - - messageRepository.save(new Message("o1", "aaaaaaaaaa")); - messageRepository.save(new Message("o2", "bbbbbbbbbb")); - messageRepository.save(new Message("o3", "cccccccccc")); - - Assert.assertEquals(3, messageRepository.findAll().size()); - } - -} diff --git a/2.1.x/chapter3-9/.gitignore b/2.1.x/chapter3-9/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter3-9/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter3-9/pom.xml b/2.1.x/chapter3-9/pom.xml deleted file mode 100644 index f8572620..00000000 --- a/2.1.x/chapter3-9/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter3-9 - 0.0.1-SNAPSHOT - 使用MyBatis的多数据源配置 - - - 1.8 - - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - 2.1.1 - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java deleted file mode 100644 index eb46b057..00000000 --- a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/Chapter39Application.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.didispace.chapter39; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Chapter39Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter39Application.class, args); - } - -} diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/DataSourceConfiguration.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/DataSourceConfiguration.java deleted file mode 100644 index 6eaae095..00000000 --- a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/DataSourceConfiguration.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.didispace.chapter39; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; - -import javax.sql.DataSource; - -@Configuration -public class DataSourceConfiguration { - - @Primary - @Bean - @ConfigurationProperties(prefix = "spring.datasource.primary") - public DataSource primaryDataSource() { - return DataSourceBuilder.create().build(); - } - - @Bean - @ConfigurationProperties(prefix = "spring.datasource.secondary") - public DataSource secondaryDataSource() { - return DataSourceBuilder.create().build(); - } - -} diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java deleted file mode 100644 index f6d1bbe5..00000000 --- a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/PrimaryConfig.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.didispace.chapter39; - -import org.apache.ibatis.session.SqlSessionFactory; -import org.mybatis.spring.SqlSessionFactoryBean; -import org.mybatis.spring.SqlSessionTemplate; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.sql.DataSource; - -@Configuration -@MapperScan( - basePackages = "com.didispace.chapter39.p", - sqlSessionFactoryRef = "sqlSessionFactoryPrimary", - sqlSessionTemplateRef = "sqlSessionTemplatePrimary") -public class PrimaryConfig { - - private DataSource primaryDataSource; - - public PrimaryConfig(@Qualifier("primaryDataSource") DataSource primaryDataSource) { - this.primaryDataSource = primaryDataSource; - } - - @Bean - public SqlSessionFactory sqlSessionFactoryPrimary() throws Exception { - SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); - bean.setDataSource(primaryDataSource); - return bean.getObject(); - } - - @Bean - public SqlSessionTemplate sqlSessionTemplatePrimary() throws Exception { - return new SqlSessionTemplate(sqlSessionFactoryPrimary()); - } - -} \ No newline at end of file diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java deleted file mode 100644 index bdb17fba..00000000 --- a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/SecondaryConfig.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.didispace.chapter39; - -import org.apache.ibatis.session.SqlSessionFactory; -import org.mybatis.spring.SqlSessionFactoryBean; -import org.mybatis.spring.SqlSessionTemplate; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.sql.DataSource; - -@Configuration -@MapperScan( - basePackages = "com.didispace.chapter39.s", - sqlSessionFactoryRef = "sqlSessionFactorySecondary", - sqlSessionTemplateRef = "sqlSessionTemplateSecondary") -public class SecondaryConfig { - - private DataSource secondaryDataSource; - - public SecondaryConfig(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) { - this.secondaryDataSource = secondaryDataSource; - } - - @Bean - public SqlSessionFactory sqlSessionFactorySecondary() throws Exception { - SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); - bean.setDataSource(secondaryDataSource); - return bean.getObject(); - } - - @Bean - public SqlSessionTemplate sqlSessionTemplateSecondary() throws Exception { - return new SqlSessionTemplate(sqlSessionFactorySecondary()); - } - -} \ No newline at end of file diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/entity/UserPrimary.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/entity/UserPrimary.java deleted file mode 100644 index f4c2a299..00000000 --- a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/entity/UserPrimary.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.didispace.chapter39.p.entity; - -import lombok.Data; -import lombok.NoArgsConstructor; - - -@Data -@NoArgsConstructor -public class UserPrimary { - - private Long id; - - private String name; - private Integer age; - - public UserPrimary(String name, Integer age) { - this.name = name; - this.age = age; - } -} \ No newline at end of file diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/mapper/UserMapperPrimary.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/mapper/UserMapperPrimary.java deleted file mode 100644 index 869ab546..00000000 --- a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/p/mapper/UserMapperPrimary.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.didispace.chapter39.p.mapper; - -import com.didispace.chapter39.p.entity.UserPrimary; -import org.apache.ibatis.annotations.Delete; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -/** - * Created by 程序猿DD/翟永超 on 2020/2/28. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -public interface UserMapperPrimary { - - @Select("SELECT * FROM USER WHERE NAME = #{name}") - UserPrimary findByName(@Param("name") String name); - - @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})") - int insert(@Param("name") String name, @Param("age") Integer age); - - @Delete("DELETE FROM USER") - int deleteAll(); - -} diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/entity/UserSecondary.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/entity/UserSecondary.java deleted file mode 100644 index fdd64dff..00000000 --- a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/entity/UserSecondary.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.didispace.chapter39.s.entity; - -import lombok.Data; -import lombok.NoArgsConstructor; - - -@Data -@NoArgsConstructor -public class UserSecondary { - - private Long id; - - private String name; - private Integer age; - - public UserSecondary(String name, Integer age) { - this.name = name; - this.age = age; - } -} \ No newline at end of file diff --git a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/mapper/UserMapperSecondary.java b/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/mapper/UserMapperSecondary.java deleted file mode 100644 index bb4b004c..00000000 --- a/2.1.x/chapter3-9/src/main/java/com/didispace/chapter39/s/mapper/UserMapperSecondary.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.didispace.chapter39.s.mapper; - -import com.didispace.chapter39.s.entity.UserSecondary; -import org.apache.ibatis.annotations.Delete; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -/** - * Created by 程序猿DD/翟永超 on 2020/2/28. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -public interface UserMapperSecondary { - - @Select("SELECT * FROM USER WHERE NAME = #{name}") - UserSecondary findByName(@Param("name") String name); - - @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})") - int insert(@Param("name") String name, @Param("age") Integer age); - - @Delete("DELETE FROM USER") - int deleteAll(); -} diff --git a/2.1.x/chapter3-9/src/main/resources/application.properties b/2.1.x/chapter3-9/src/main/resources/application.properties deleted file mode 100644 index 87777023..00000000 --- a/2.1.x/chapter3-9/src/main/resources/application.properties +++ /dev/null @@ -1,13 +0,0 @@ -# pring boot 1.x的配置:spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1 -spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1 -spring.datasource.primary.username=root -spring.datasource.primary.password=12345678 -spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver - -# spring boot 1.x的配置:spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2 -spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2 -spring.datasource.secondary.username=root -spring.datasource.secondary.password=12345678 -spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver - -#mybatis.mapper-locations=classpath:mapper/*.xml diff --git a/2.1.x/chapter3-9/src/main/resources/mapper.primary/UserMapper.xml b/2.1.x/chapter3-9/src/main/resources/mapper.primary/UserMapper.xml deleted file mode 100644 index 6eae360b..00000000 --- a/2.1.x/chapter3-9/src/main/resources/mapper.primary/UserMapper.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age}) - - - \ No newline at end of file diff --git a/2.1.x/chapter3-9/src/main/resources/mapper.secondary/UserMapper.xml b/2.1.x/chapter3-9/src/main/resources/mapper.secondary/UserMapper.xml deleted file mode 100644 index 361cd16e..00000000 --- a/2.1.x/chapter3-9/src/main/resources/mapper.secondary/UserMapper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age}) - - - \ No newline at end of file diff --git a/2.1.x/chapter3-9/src/test/java/com/didispace/chapter39/Chapter39ApplicationTests.java b/2.1.x/chapter3-9/src/test/java/com/didispace/chapter39/Chapter39ApplicationTests.java deleted file mode 100644 index a1bd3a81..00000000 --- a/2.1.x/chapter3-9/src/test/java/com/didispace/chapter39/Chapter39ApplicationTests.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.didispace.chapter39; - -import com.didispace.chapter39.p.entity.UserPrimary; -import com.didispace.chapter39.p.mapper.UserMapperPrimary; -import com.didispace.chapter39.s.entity.UserSecondary; -import com.didispace.chapter39.s.mapper.UserMapperSecondary; -import lombok.extern.slf4j.Slf4j; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; - -@Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest -@Transactional -public class Chapter39ApplicationTests { - - @Autowired - private UserMapperPrimary userMapperPrimary; - @Autowired - private UserMapperSecondary userMapperSecondary; - - @Before - public void setUp() { - // 清空测试表,保证每次结果一样 - userMapperPrimary.deleteAll(); - userMapperSecondary.deleteAll(); - } - - @Test - public void test() throws Exception { - // 往Primary数据源插入一条数据 - userMapperPrimary.insert("AAA", 20); - - // 从Primary数据源查询刚才插入的数据,配置正确就可以查询到 - UserPrimary userPrimary = userMapperPrimary.findByName("AAA"); - Assert.assertEquals(20, userPrimary.getAge().intValue()); - - // 从Secondary数据源查询刚才插入的数据,配置正确应该是查询不到的 - UserSecondary userSecondary = userMapperSecondary.findByName("AAA"); - Assert.assertNull(userSecondary); - - // 往Secondary数据源插入一条数据 - userMapperSecondary.insert("BBB", 20); - - // 从Primary数据源查询刚才插入的数据,配置正确应该是查询不到的 - userPrimary = userMapperPrimary.findByName("BBB"); - Assert.assertNull(userPrimary); - - // 从Secondary数据源查询刚才插入的数据,配置正确就可以查询到 - userSecondary = userMapperSecondary.findByName("BBB"); - Assert.assertEquals(20, userSecondary.getAge().intValue()); - } - -} diff --git a/2.1.x/chapter4-1/.gitignore b/2.1.x/chapter4-1/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter4-1/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter4-1/pom.xml b/2.1.x/chapter4-1/pom.xml deleted file mode 100644 index e8191b85..00000000 --- a/2.1.x/chapter4-1/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter4-1 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter4-1/src/main/java/com/didispace/chapter41/Chapter41Application.java b/2.1.x/chapter4-1/src/main/java/com/didispace/chapter41/Chapter41Application.java deleted file mode 100644 index 8ec9c806..00000000 --- a/2.1.x/chapter4-1/src/main/java/com/didispace/chapter41/Chapter41Application.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.didispace.chapter41; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Chapter41Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter41Application.class, args); - } - -} diff --git a/2.1.x/chapter4-1/src/main/java/com/didispace/chapter41/HelloController.java b/2.1.x/chapter4-1/src/main/java/com/didispace/chapter41/HelloController.java deleted file mode 100644 index 314074d1..00000000 --- a/2.1.x/chapter4-1/src/main/java/com/didispace/chapter41/HelloController.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.didispace.chapter41; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.GetMapping; - -@Controller -public class HelloController { - - @GetMapping("/") - public String index(ModelMap map) { - // 加入一个属性,用来在模板中读取 - map.addAttribute("host", "http://blog.didispace.com"); - - // return模板文件的名称,对应src/main/resources/templates/index.html - return "index"; - } - -} \ No newline at end of file diff --git a/2.1.x/chapter4-1/src/main/resources/application.properties b/2.1.x/chapter4-1/src/main/resources/application.properties deleted file mode 100644 index 8b137891..00000000 --- a/2.1.x/chapter4-1/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/2.1.x/chapter4-1/src/main/resources/templates/index.html b/2.1.x/chapter4-1/src/main/resources/templates/index.html deleted file mode 100644 index 32cbfe84..00000000 --- a/2.1.x/chapter4-1/src/main/resources/templates/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - -

Hello World

- - \ No newline at end of file diff --git a/2.1.x/chapter4-2/.gitignore b/2.1.x/chapter4-2/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter4-2/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter4-2/pom.xml b/2.1.x/chapter4-2/pom.xml deleted file mode 100644 index d6022db9..00000000 --- a/2.1.x/chapter4-2/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter4-2 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter4-2/src/main/java/com/didispace/chapter42/Chapter42Application.java b/2.1.x/chapter4-2/src/main/java/com/didispace/chapter42/Chapter42Application.java deleted file mode 100644 index 00b646c5..00000000 --- a/2.1.x/chapter4-2/src/main/java/com/didispace/chapter42/Chapter42Application.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.didispace.chapter42; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Chapter42Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter42Application.class, args); - } - -} diff --git a/2.1.x/chapter4-2/src/main/java/com/didispace/chapter42/HelloController.java b/2.1.x/chapter4-2/src/main/java/com/didispace/chapter42/HelloController.java deleted file mode 100644 index 0e01264b..00000000 --- a/2.1.x/chapter4-2/src/main/java/com/didispace/chapter42/HelloController.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.didispace.chapter42; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.GetMapping; - -@Controller -public class HelloController { - - @GetMapping("/") - public String index(ModelMap map) { - // return模板文件的名称,对应src/main/resources/templates/index.html - return "index"; - } - -} \ No newline at end of file diff --git a/2.1.x/chapter4-2/src/main/resources/application.properties b/2.1.x/chapter4-2/src/main/resources/application.properties deleted file mode 100644 index 8b137891..00000000 --- a/2.1.x/chapter4-2/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/2.1.x/chapter4-2/src/main/resources/templates/index.html b/2.1.x/chapter4-2/src/main/resources/templates/index.html deleted file mode 100644 index 7c8a648b..00000000 --- a/2.1.x/chapter4-2/src/main/resources/templates/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Spring Boot中使用ECharts - - - -
- - - - \ No newline at end of file diff --git a/2.1.x/chapter5-1/.gitignore b/2.1.x/chapter5-1/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter5-1/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter5-1/pom.xml b/2.1.x/chapter5-1/pom.xml deleted file mode 100644 index 2af64776..00000000 --- a/2.1.x/chapter5-1/pom.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter5-1 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - org.springframework.boot - spring-boot-starter-cache - - - - org.springframework.boot - spring-boot-starter-actuator - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/Chapter51Application.java b/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/Chapter51Application.java deleted file mode 100644 index b855c592..00000000 --- a/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/Chapter51Application.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.didispace.chapter51; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - -@EnableCaching -@SpringBootApplication -public class Chapter51Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter51Application.class, args); - } - -} diff --git a/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/User.java b/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/User.java deleted file mode 100644 index 55ae4a76..00000000 --- a/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/User.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.didispace.chapter51; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; - -@Entity -@Data -@NoArgsConstructor -public class User { - - @Id - @GeneratedValue - private Long id; - - private String name; - private Integer age; - - public User(String name, Integer age) { - this.name = name; - this.age = age; - } -} \ No newline at end of file diff --git a/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/UserRepository.java b/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/UserRepository.java deleted file mode 100644 index 2785e7ae..00000000 --- a/2.1.x/chapter5-1/src/main/java/com/didispace/chapter51/UserRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.didispace.chapter51; - -import org.springframework.cache.annotation.CacheConfig; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -/** - * Created by 程序猿DD/翟永超 on 2020/7/13. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -@CacheConfig(cacheNames = "users") -public interface UserRepository extends JpaRepository { - - @Cacheable - User findByName(String name); - - User findByNameAndAge(String name, Integer age); - - @Query("from User u where u.name=:name") - User findUser(@Param("name") String name); - -} diff --git a/2.1.x/chapter5-1/src/main/resources/application.properties b/2.1.x/chapter5-1/src/main/resources/application.properties deleted file mode 100644 index ba1e5990..00000000 --- a/2.1.x/chapter5-1/src/main/resources/application.properties +++ /dev/null @@ -1,7 +0,0 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/test -spring.datasource.username=root -spring.datasource.password=12345678 -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver - -spring.jpa.show-sql=true -spring.jpa.hibernate.ddl-auto=create-drop \ No newline at end of file diff --git a/2.1.x/chapter5-1/src/test/java/com/didispace/chapter51/Chapter51ApplicationTests.java b/2.1.x/chapter5-1/src/test/java/com/didispace/chapter51/Chapter51ApplicationTests.java deleted file mode 100644 index 3d4dabbd..00000000 --- a/2.1.x/chapter5-1/src/test/java/com/didispace/chapter51/Chapter51ApplicationTests.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.didispace.chapter51; - -import lombok.extern.slf4j.Slf4j; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cache.CacheManager; -import org.springframework.test.context.junit4.SpringRunner; - -@Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest -public class Chapter51ApplicationTests { - - @Autowired - private UserRepository userRepository; - - @Autowired - private CacheManager cacheManager; - - @Test - public void test() throws Exception { - // 创建1条记录 - userRepository.save(new User("AAA", 10)); - - User u1 = userRepository.findByName("AAA"); - System.out.println("第一次查询:" + u1.getAge()); - - User u2 = userRepository.findByName("AAA"); - System.out.println("第二次查询:" + u2.getAge()); - } - -} diff --git a/2.1.x/chapter5-2/.gitignore b/2.1.x/chapter5-2/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter5-2/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter5-2/pom.xml b/2.1.x/chapter5-2/pom.xml deleted file mode 100644 index bb82477e..00000000 --- a/2.1.x/chapter5-2/pom.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter5-2 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - org.springframework.boot - spring-boot-starter-cache - - - - net.sf.ehcache - ehcache - - - - org.springframework.boot - spring-boot-starter-actuator - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/Chapter52Application.java b/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/Chapter52Application.java deleted file mode 100644 index e4842885..00000000 --- a/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/Chapter52Application.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.didispace.chapter52; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - -@EnableCaching -@SpringBootApplication -public class Chapter52Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter52Application.class, args); - } - -} diff --git a/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/User.java b/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/User.java deleted file mode 100644 index 9fb641f0..00000000 --- a/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/User.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.didispace.chapter52; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; - -@Entity -@Data -@NoArgsConstructor -public class User { - - @Id - @GeneratedValue - private Long id; - - private String name; - private Integer age; - - public User(String name, Integer age) { - this.name = name; - this.age = age; - } -} \ No newline at end of file diff --git a/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/UserRepository.java b/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/UserRepository.java deleted file mode 100644 index 4dad3d06..00000000 --- a/2.1.x/chapter5-2/src/main/java/com/didispace/chapter52/UserRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.didispace.chapter52; - -import org.springframework.cache.annotation.CacheConfig; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -/** - * Created by 程序猿DD/翟永超 on 2020/7/14. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -@CacheConfig(cacheNames = "users") -public interface UserRepository extends JpaRepository { - - @Cacheable - User findByName(String name); - -} diff --git a/2.1.x/chapter5-2/src/main/resources/application.properties b/2.1.x/chapter5-2/src/main/resources/application.properties deleted file mode 100644 index ba1e5990..00000000 --- a/2.1.x/chapter5-2/src/main/resources/application.properties +++ /dev/null @@ -1,7 +0,0 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/test -spring.datasource.username=root -spring.datasource.password=12345678 -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver - -spring.jpa.show-sql=true -spring.jpa.hibernate.ddl-auto=create-drop \ No newline at end of file diff --git a/2.1.x/chapter5-2/src/main/resources/ehcache.xml b/2.1.x/chapter5-2/src/main/resources/ehcache.xml deleted file mode 100644 index c178cc9f..00000000 --- a/2.1.x/chapter5-2/src/main/resources/ehcache.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/2.1.x/chapter5-2/src/test/java/com/didispace/chapter52/Chapter52ApplicationTests.java b/2.1.x/chapter5-2/src/test/java/com/didispace/chapter52/Chapter52ApplicationTests.java deleted file mode 100644 index 76c505c9..00000000 --- a/2.1.x/chapter5-2/src/test/java/com/didispace/chapter52/Chapter52ApplicationTests.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.didispace.chapter52; - -import lombok.extern.slf4j.Slf4j; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cache.CacheManager; -import org.springframework.test.context.junit4.SpringRunner; - -@Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest -public class Chapter52ApplicationTests { - - @Autowired - private UserRepository userRepository; - - @Autowired - private CacheManager cacheManager; - - @Test - public void test() throws Exception { - System.out.println("CacheManager type : " + cacheManager.getClass()); - - // 创建1条记录 - userRepository.save(new User("AAA", 10)); - - User u1 = userRepository.findByName("AAA"); - System.out.println("第一次查询:" + u1.getAge()); - - User u2 = userRepository.findByName("AAA"); - System.out.println("第二次查询:" + u2.getAge()); - } - -} diff --git a/2.1.x/chapter5-3/.gitignore b/2.1.x/chapter5-3/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter5-3/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter5-3/pom.xml b/2.1.x/chapter5-3/pom.xml deleted file mode 100644 index c0bb21fd..00000000 --- a/2.1.x/chapter5-3/pom.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter5-3 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - org.springframework.boot - spring-boot-starter-cache - - - - net.sf.ehcache - ehcache - - - - org.springframework.boot - spring-boot-starter-actuator - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/Chapter53Application.java b/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/Chapter53Application.java deleted file mode 100644 index 3abe9f33..00000000 --- a/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/Chapter53Application.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.didispace.chapter53; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.rmi.registry.LocateRegistry; - -@EnableCaching -@SpringBootApplication -public class Chapter53Application { - - public static void main(String[] args) throws Exception { -// LocateRegistry.createRegistry(Integer.valueOf(System.getProperty("rmi.port"))); - SpringApplication.run(Chapter53Application.class, args); - } - - @RestController - static class HelloController { - - @Autowired - private UserRepository userRepository; - - @GetMapping("/create") - public void create() { - userRepository.save(new User("AAA", 10)); - } - - @GetMapping("/update") - public User update() { - User u1 = userRepository.findByName("AAA"); - u1.setAge(20); - u1 = userRepository.save(u1); - return u1; - } - - @GetMapping("/find") - public User find() { - User u1 = userRepository.findByName("AAA"); - System.out.println("查询AAA用户:" + u1.getAge()); - return u1; - } - - } - -} diff --git a/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/User.java b/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/User.java deleted file mode 100644 index 2986b7d4..00000000 --- a/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/User.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.didispace.chapter53; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import java.io.Serializable; - -@Entity -@Data -@NoArgsConstructor -public class User implements Serializable { - - @Id - @GeneratedValue - private Long id; - - private String name; - private Integer age; - - public User(String name, Integer age) { - this.name = name; - this.age = age; - } -} diff --git a/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/UserRepository.java b/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/UserRepository.java deleted file mode 100644 index 4d52745e..00000000 --- a/2.1.x/chapter5-3/src/main/java/com/didispace/chapter53/UserRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.didispace.chapter53; - -import org.springframework.cache.annotation.CacheConfig; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -/** - * Created by 程序猿DD/翟永超 on 2020/7/16. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -@CacheConfig(cacheNames = "users") -public interface UserRepository extends JpaRepository { - - @Cacheable - User findByName(String name); - -} diff --git a/2.1.x/chapter5-3/src/main/resources/application.properties b/2.1.x/chapter5-3/src/main/resources/application.properties deleted file mode 100644 index 43e74c79..00000000 --- a/2.1.x/chapter5-3/src/main/resources/application.properties +++ /dev/null @@ -1,17 +0,0 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/test -spring.datasource.username=root -spring.datasource.password=12345678 -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver - -spring.jpa.show-sql=true -spring.jpa.hibernate.ddl-auto=create - -#logging.level.net.sf.ehcache=debug - -# 不同实例的配置 -#spring.cache.ehcache.config=classpath:ehcache-1.xml -#spring.cache.ehcache.config=classpath:ehcache-2.xml - -# 用不同命令启动不同实例 -#-Dserver.port=8001 -Dspring.cache.ehcache.config=classpath:ehcache-1.xml -#-Dserver.port=8002 -Dspring.cache.ehcache.config=classpath:ehcache-2.xml diff --git a/2.1.x/chapter5-3/src/main/resources/ehcache-1.xml b/2.1.x/chapter5-3/src/main/resources/ehcache-1.xml deleted file mode 100644 index fbc88162..00000000 --- a/2.1.x/chapter5-3/src/main/resources/ehcache-1.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/2.1.x/chapter5-3/src/main/resources/ehcache-2.xml b/2.1.x/chapter5-3/src/main/resources/ehcache-2.xml deleted file mode 100644 index 878b6be2..00000000 --- a/2.1.x/chapter5-3/src/main/resources/ehcache-2.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/2.1.x/chapter5-3/src/test/java/com/didispace/chapter53/Chapter53ApplicationTests.java b/2.1.x/chapter5-3/src/test/java/com/didispace/chapter53/Chapter53ApplicationTests.java deleted file mode 100644 index 0e9c2939..00000000 --- a/2.1.x/chapter5-3/src/test/java/com/didispace/chapter53/Chapter53ApplicationTests.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.didispace.chapter53; - -import lombok.extern.slf4j.Slf4j; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cache.CacheManager; -import org.springframework.test.context.junit4.SpringRunner; - -@Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest -public class Chapter53ApplicationTests { - - @Autowired - private UserRepository userRepository; - - @Autowired - private CacheManager cacheManager; - - @Test - public void test() throws Exception { - System.out.println("CacheManager type : " + cacheManager.getClass()); - - // 创建1条记录 - userRepository.save(new User("AAA", 10)); - - User u1 = userRepository.findByName("AAA"); - System.out.println("第一次查询:" + u1.getAge()); - - User u2 = userRepository.findByName("AAA"); - System.out.println("第二次查询:" + u2.getAge()); - } - -} diff --git a/2.1.x/chapter5-4/.gitignore b/2.1.x/chapter5-4/.gitignore deleted file mode 100644 index 153c9335..00000000 --- a/2.1.x/chapter5-4/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -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/2.1.x/chapter5-4/pom.xml b/2.1.x/chapter5-4/pom.xml deleted file mode 100644 index c33d2854..00000000 --- a/2.1.x/chapter5-4/pom.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - com.didispace - chapter5-4 - 0.0.1-SNAPSHOT - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.apache.commons - commons-pool2 - - - - org.springframework.boot - spring-boot-starter-actuator - - - - mysql - mysql-connector-java - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/Chapter54Application.java b/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/Chapter54Application.java deleted file mode 100644 index f2789f8b..00000000 --- a/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/Chapter54Application.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.didispace.chapter54; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; - -@EnableCaching -@SpringBootApplication -public class Chapter54Application { - - public static void main(String[] args) { - SpringApplication.run(Chapter54Application.class, args); - } - -} diff --git a/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/User.java b/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/User.java deleted file mode 100644 index 11e2dc13..00000000 --- a/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/User.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.didispace.chapter54; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import java.io.Serializable; - -@Entity -@Data -@NoArgsConstructor -public class User implements Serializable { - - @Id - @GeneratedValue - private Long id; - - private String name; - private Integer age; - - public User(String name, Integer age) { - this.name = name; - this.age = age; - } -} \ No newline at end of file diff --git a/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/UserRepository.java b/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/UserRepository.java deleted file mode 100644 index 4b14b113..00000000 --- a/2.1.x/chapter5-4/src/main/java/com/didispace/chapter54/UserRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.didispace.chapter54; - -import org.springframework.cache.annotation.CacheConfig; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -/** - * Created by 程序猿DD/翟永超 on 2020/7/26. - *

- * Blog: http://blog.didispace.com/ - * Github: https://github.com/dyc87112/ - */ -@CacheConfig(cacheNames = "users") -public interface UserRepository extends JpaRepository { - - @Cacheable - User findByName(String name); - - User findByNameAndAge(String name, Integer age); - - @Query("from User u where u.name=:name") - User findUser(@Param("name") String name); - -} diff --git a/2.1.x/chapter5-4/src/main/resources/application.properties b/2.1.x/chapter5-4/src/main/resources/application.properties deleted file mode 100644 index 7136291e..00000000 --- a/2.1.x/chapter5-4/src/main/resources/application.properties +++ /dev/null @@ -1,16 +0,0 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/test -spring.datasource.username=root -spring.datasource.password=12345678 -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver - -spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect -spring.jpa.show-sql=true -spring.jpa.hibernate.ddl-auto=create-drop - -spring.redis.host=localhost -spring.redis.port=6379 -spring.redis.lettuce.pool.max-idle=8 -spring.redis.lettuce.pool.max-active=8 -spring.redis.lettuce.pool.max-wait=-1ms -spring.redis.lettuce.pool.min-idle=0 -spring.redis.lettuce.shutdown-timeout=100ms diff --git a/2.1.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java b/2.1.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java deleted file mode 100644 index de5a7185..00000000 --- a/2.1.x/chapter5-4/src/test/java/com/didispace/chapter54/Chapter54ApplicationTests.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.didispace.chapter54; - -import lombok.extern.slf4j.Slf4j; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cache.CacheManager; -import org.springframework.test.context.junit4.SpringRunner; - -@Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest -public class Chapter54ApplicationTests { - - @Autowired - private UserRepository userRepository; - - @Autowired - private CacheManager cacheManager; - - @Test - public void test() throws Exception { - System.out.println("CacheManager type : " + cacheManager.getClass()); - - // 创建1条记录 - userRepository.save(new User("AAA", 10)); - - User u1 = userRepository.findByName("AAA"); - System.out.println("第一次查询:" + u1.getAge()); - - User u2 = userRepository.findByName("AAA"); - System.out.println("第二次查询:" + u2.getAge()); - } - -} diff --git a/2.1.x/pom.xml b/2.1.x/pom.xml deleted file mode 100644 index 26b0293f..00000000 --- a/2.1.x/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - 4.0.0 - - com.didispace - SpringBoot-Learning - 2.0-SNAPSHOT - 全网Star最多的Spring Boot基础教程 - - - - chapter1-1 - - - chapter2-1 - chapter2-2 - chapter2-3 - chapter2-4 - chapter2-5 - chapter2-6 - chapter2-7 - - - - chapter3-1 - chapter3-2 - chapter3-3 - chapter3-4 - chapter3-5 - chapter3-6 - chapter3-7 - chapter3-8 - chapter3-9 - chapter3-10 - - - - - - chapter4-1 - chapter4-2 - - - chapter5-1 - chapter5-2 - chapter5-3 - chapter5-4 - - - - - - - - - - - - From bc2766b18bce90804ce04e4b184ea855f5d0146c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Fri, 8 Oct 2021 16:43:42 +0800 Subject: [PATCH 147/160] =?UTF-8?q?Spring=20Boot=202.x=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=99=E7=A8=8B=EF=BC=9A=E4=BD=BF=E7=94=A8PostgreSQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 1 + 2.x/README_zh.md | 2 +- 2.x/chapter6-4/pom.xml | 65 +++++++++++++++++++ .../chapter64/Chapter64Application.java | 14 ++++ .../com/didispace/chapter64/UserInfo.java | 26 ++++++++ .../chapter64/UserInfoRepository.java | 22 +++++++ .../src/main/resources/application.properties | 7 ++ .../didispace/chapter64/ApplicationTests.java | 51 +++++++++++++++ 2.x/pom.xml | 5 +- 9 files changed, 190 insertions(+), 3 deletions(-) create mode 100644 2.x/chapter6-4/pom.xml create mode 100644 2.x/chapter6-4/src/main/java/com/didispace/chapter64/Chapter64Application.java create mode 100644 2.x/chapter6-4/src/main/java/com/didispace/chapter64/UserInfo.java create mode 100644 2.x/chapter6-4/src/main/java/com/didispace/chapter64/UserInfoRepository.java create mode 100644 2.x/chapter6-4/src/main/resources/application.properties create mode 100644 2.x/chapter6-4/src/test/java/com/didispace/chapter64/ApplicationTests.java diff --git a/2.x/README.md b/2.x/README.md index a6627efd..ab41abb3 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -72,6 +72,7 @@ - [Spring Boot 2.x基础教程:使用MongoDB](http://blog.didispace.com/spring-boot-learning-24-6-1/) - [Spring Boot 2.x基础教程:使用LDAP来管理用户与组织数据](http://blog.didispace.com/spring-boot-learning-24-6-2/) - [Spring Boot 2.x基础教程:使用时序数据库InfluxDB](http://blog.didispace.com/spring-boot-learning-2-6-3/) +- [Spring Boot 2.x基础教程:使用PostgreSQL](http://blog.didispace.com/spring-boot-learning-2-6-4/) ### Web开发 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index fd94ee25..0f3471d0 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -73,7 +73,7 @@ - [Spring Boot 2.x基础教程:使用MongoDB](http://blog.didispace.com/spring-boot-learning-24-6-1/) - [Spring Boot 2.x基础教程:使用LDAP来管理用户与组织数据](http://blog.didispace.com/spring-boot-learning-24-6-2/) - [Spring Boot 2.x基础教程:使用时序数据库InfluxDB](http://blog.didispace.com/spring-boot-learning-2-6-3/) - +- [Spring Boot 2.x基础教程:使用PostgreSQL](http://blog.didispace.com/spring-boot-learning-2-6-4/) ### Web开发 diff --git a/2.x/chapter6-4/pom.xml b/2.x/chapter6-4/pom.xml new file mode 100644 index 00000000..c1683b06 --- /dev/null +++ b/2.x/chapter6-4/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + com.didispace + chapter6-4 + 1.0.0 + jar + 使用PostgreSQL数据库 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + + UTF-8 + 1.8 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.postgresql + postgresql + runtime + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/2.x/chapter6-4/src/main/java/com/didispace/chapter64/Chapter64Application.java b/2.x/chapter6-4/src/main/java/com/didispace/chapter64/Chapter64Application.java new file mode 100644 index 00000000..83ebf477 --- /dev/null +++ b/2.x/chapter6-4/src/main/java/com/didispace/chapter64/Chapter64Application.java @@ -0,0 +1,14 @@ +package com.didispace.chapter64; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +public class Chapter64Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter64Application.class, args); + } + +} diff --git a/2.x/chapter6-4/src/main/java/com/didispace/chapter64/UserInfo.java b/2.x/chapter6-4/src/main/java/com/didispace/chapter64/UserInfo.java new file mode 100644 index 00000000..cc83d361 --- /dev/null +++ b/2.x/chapter6-4/src/main/java/com/didispace/chapter64/UserInfo.java @@ -0,0 +1,26 @@ +package com.didispace.chapter64; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +@Data +@NoArgsConstructor +public class UserInfo { + + @Id + @GeneratedValue + private Long id; + + private String name; + private Integer age; + + public UserInfo(String name, Integer age) { + this.name = name; + this.age = age; + } +} \ No newline at end of file diff --git a/2.x/chapter6-4/src/main/java/com/didispace/chapter64/UserInfoRepository.java b/2.x/chapter6-4/src/main/java/com/didispace/chapter64/UserInfoRepository.java new file mode 100644 index 00000000..85214e24 --- /dev/null +++ b/2.x/chapter6-4/src/main/java/com/didispace/chapter64/UserInfoRepository.java @@ -0,0 +1,22 @@ +package com.didispace.chapter64; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +/** + * Created by 程序猿DD/翟永超 on 2021/10/08. + *

+ * Blog: http://blog.didispace.com/ + * Github: https://github.com/dyc87112/ + */ +public interface UserInfoRepository extends JpaRepository { + + UserInfo findByName(String name); + + UserInfo findByNameAndAge(String name, Integer age); + + @Query("from UserInfo u where u.name=:name") + UserInfo findUser(@Param("name") String name); + +} diff --git a/2.x/chapter6-4/src/main/resources/application.properties b/2.x/chapter6-4/src/main/resources/application.properties new file mode 100644 index 00000000..3c000bf2 --- /dev/null +++ b/2.x/chapter6-4/src/main/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.url=jdbc:postgresql://localhost:5432/test +spring.datasource.username=postgres +spring.datasource.password=123456 +spring.datasource.driver-class-name=org.postgresql.Driver + +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +spring.jpa.properties.hibernate.hbm2ddl.auto=create \ No newline at end of file diff --git a/2.x/chapter6-4/src/test/java/com/didispace/chapter64/ApplicationTests.java b/2.x/chapter6-4/src/test/java/com/didispace/chapter64/ApplicationTests.java new file mode 100644 index 00000000..1ae64fb4 --- /dev/null +++ b/2.x/chapter6-4/src/test/java/com/didispace/chapter64/ApplicationTests.java @@ -0,0 +1,51 @@ +package com.didispace.chapter64; + + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@Slf4j +@SpringBootTest +public class ApplicationTests { + + @Autowired + private UserInfoRepository userRepository; + + @Test + public void test() throws Exception { + // 创建10条记录 + userRepository.save(new UserInfo("AAA", 10)); + userRepository.save(new UserInfo("BBB", 20)); + userRepository.save(new UserInfo("CCC", 30)); + userRepository.save(new UserInfo("DDD", 40)); + userRepository.save(new UserInfo("EEE", 50)); + userRepository.save(new UserInfo("FFF", 60)); + userRepository.save(new UserInfo("GGG", 70)); + userRepository.save(new UserInfo("HHH", 80)); + userRepository.save(new UserInfo("III", 90)); + userRepository.save(new UserInfo("JJJ", 100)); + + // 测试findAll, 查询所有记录 + Assertions.assertEquals(10, userRepository.findAll().size()); + + // 测试findByName, 查询姓名为FFF的User + Assertions.assertEquals(60, userRepository.findByName("FFF").getAge().longValue()); + + // 测试findUser, 查询姓名为FFF的User + Assertions.assertEquals(60, userRepository.findUser("FFF").getAge().longValue()); + + // 测试findByNameAndAge, 查询姓名为FFF并且年龄为60的User + Assertions.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName()); + + // 测试删除姓名为AAA的User + userRepository.delete(userRepository.findByName("AAA")); + + // 测试findAll, 查询所有记录, 验证上面的删除是否成功 + Assertions.assertEquals(9, userRepository.findAll().size()); + + } + +} diff --git a/2.x/pom.xml b/2.x/pom.xml index 293aad51..4c21f4b1 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -64,11 +64,12 @@ chapter5-5 - + chapter6-1 chapter6-2 chapter6-3 - + chapter6-4 + chapter7-1 From 68f2ab0dc83e5cf23146f8e387a482347c6503fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Tue, 12 Oct 2021 13:38:03 +0800 Subject: [PATCH 148/160] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 13 ++++++++++--- 2.x/README_zh.md | 12 ++++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index ab41abb3..94e15452 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -84,14 +84,17 @@ ### 任务管理 -**定时任务** +**定时任务:`@Scheduled`实现** - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) + +**定时任务:Elastic Job实现** + - [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) - [Spring Boot 2.x基础教程:使用Elastic Job的分片配置提高执行效率](https://blog.didispace.com/spring-boot-learning-2-7-3) - [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) -**异步任务** +**异步任务:`@Async`实现** - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) - [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) @@ -128,7 +131,11 @@ ## 我的公众号 - + + +## 推荐我的书 + +![Spring Boot微服务实战](https://git.oschina.net/uploads/images/2017/0416/233656_dd3bce94_437188.png) ## 特别赞助商 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 0f3471d0..aed820b3 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -7,6 +7,7 @@ **加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) **如何支持**: + 1. 关注我的公众号”**程序猿DD**“ 2. 点个`Star`并`Follow`我 3. 把该仓库分享给更多的朋友 @@ -85,14 +86,17 @@ ### 任务管理 -**定时任务** +**定时任务:`@Scheduled`实现** - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) + +**定时任务:Elastic Job实现** + - [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) - [Spring Boot 2.x基础教程:使用Elastic Job的分片配置提高执行效率](https://blog.didispace.com/spring-boot-learning-2-7-3) - [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) -**异步任务** +**异步任务:`@Async`实现** - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) - [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) @@ -136,11 +140,11 @@ ## 我的公众号 - + ## 推荐我的书 -![](https://git.oschina.net/uploads/images/2017/0416/233656_dd3bce94_437188.png "在这里输入图片标题") +![Spring Boot微服务实战](https://git.oschina.net/uploads/images/2017/0416/233656_dd3bce94_437188.png) ## 特别赞助商 From 34c2eb96f3b5000da2443cb253f95fd0c693552b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Fri, 29 Oct 2021 14:52:52 +0800 Subject: [PATCH 149/160] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 32 ++++++---- 2.x/README_zh.md | 32 ++++++---- 2.x/chapter4-5/pom.xml | 63 +++++++++++++++++++ .../com/didispace/chapter45/Application.java | 22 +++++++ .../didispace/chapter45/HelloController.java | 33 ++++++++++ .../chapter45/WebSecurityConfig.java | 36 +++++++++++ .../src/main/resources/application.properties | 0 .../src/main/resources/templates/hello.html | 13 ++++ .../src/main/resources/templates/index.html | 12 ++++ .../src/main/resources/templates/login.html | 21 +++++++ 2.x/pom.xml | 9 +-- 11 files changed, 243 insertions(+), 30 deletions(-) create mode 100644 2.x/chapter4-5/pom.xml create mode 100644 2.x/chapter4-5/src/main/java/com/didispace/chapter45/Application.java create mode 100644 2.x/chapter4-5/src/main/java/com/didispace/chapter45/HelloController.java create mode 100644 2.x/chapter4-5/src/main/java/com/didispace/chapter45/WebSecurityConfig.java create mode 100644 2.x/chapter4-5/src/main/resources/application.properties create mode 100644 2.x/chapter4-5/src/main/resources/templates/hello.html create mode 100644 2.x/chapter4-5/src/main/resources/templates/index.html create mode 100644 2.x/chapter4-5/src/main/resources/templates/login.html diff --git a/2.x/README.md b/2.x/README.md index 94e15452..eb25e406 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -14,20 +14,20 @@ ## 教程目录(2.x版本) -连载中...Star关注支持一下,随时获得更新信息! +本教程内容持续更新连载中!**Star关注**支持一下,随时获得更新信息! -### 基础知识 +### 快速入门 - [Spring Boot 2.x基础教程:版本关系](http://blog.didispace.com/spring-cloud-alibaba-version/) - [Spring Boot 2.x基础教程:快速入门](http://blog.didispace.com/spring-boot-learning-21-1-1/) - [Spring Boot 2.x基础教程:工程结构推荐](http://blog.didispace.com/spring-boot-learning-21-1-2/) -### 配置文件 +### 配置详解 - [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) -- [Spring Boot 2.x基础教程:配置元数据的应用 ](http://blog.didispace.com/spring-boot-learning-24-1-6/) - [Spring Boot 2.x基础教程:2.4版本前后的多环境配置变化](http://blog.didispace.com/spring-boot-learning-24-1-4/) - [Spring Boot 2.x基础教程:2.4版本前后的分组配置变化](http://blog.didispace.com/spring-boot-learning-24-1-5/) +- [Spring Boot 2.x基础教程:配置元数据的应用 ](http://blog.didispace.com/spring-boot-learning-24-1-6/) - [Spring Boot 2.x基础教程:加密配置中的敏感信息](http://blog.didispace.com/spring-boot-learning-2-1-5/) ### API开发 @@ -56,7 +56,7 @@ - [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) - [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) - [Spring Boot 2.x基础教程:使用Flyway管理数据库版本](http://blog.didispace.com/spring-boot-learning-24-3-11/) -- [Spring Boot 2.x基础教程:使用JTA实现分布式事务](http://blog.didispace.com/spring-boot-learning-24-3-12/) +- [Spring Boot 2.x基础教程:使用JTA实现多数据源的事务管理](http://blog.didispace.com/spring-boot-learning-24-3-12/) - [Spring Boot 2.x基础教程:2.5版本后数据脚本初始化的变动](http://blog.didispace.com/spring-boot-learning-25-3-13/) **加速利器:各种缓存的使用** @@ -79,34 +79,40 @@ - [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) - [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) - [Spring Boot 2.x基础教程:实现文件上传](http://blog.didispace.com/spring-boot-learning-21-4-3/) -- [Spring Boot 2.x基础教程:实现多文件上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) -- [Spring Boot 2.x基础教程:文件上传的单元测试怎么写](https://blog.didispace.com/spring-boot-learning-21-4-5/) +- [Spring Boot 2.x基础教程:多个文件的上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) +- [Spring Boot 2.x基础教程:文件上传的单元测试怎么写](http://blog.didispace.com/spring-boot-learning-21-4-5/) ### 任务管理 -**定时任务:`@Scheduled`实现** +**定时任务** - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) - -**定时任务:Elastic Job实现** - - [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) - [Spring Boot 2.x基础教程:使用Elastic Job的分片配置提高执行效率](https://blog.didispace.com/spring-boot-learning-2-7-3) - [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) -**异步任务:`@Async`实现** +**异步任务** - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) - [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) - [Spring Boot 2.x基础教程:如何隔离@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-7) - [Spring Boot 2.x基础教程:配置线程池的拒绝策略](https://blog.didispace.com/spring-boot-learning-2-7-8) -### 常见问题 +### 其他内容 + +- [Spring Boot自定义启动Banner](http://blog.didispace.com/spring-boot-banner/) +- [实现邮件发送:简单邮件、附件邮件、嵌入资源的邮件、模板邮件](http://blog.didispace.com/springbootmailsender/) +- [使用Spring StateMachine框架实现状态机](http://blog.didispace.com/spring-statemachine/) +- [Spring Boot应用的后台运行配置](http://blog.didispace.com/spring-boot-run-backend/) + + +## 问题与思考 - [为什么加了@Transactional注解,事务没有回滚?](http://blog.didispace.com/transactional-not-rollback/) - [为什么启动时候API路径都没了?](http://blog.didispace.com/spring-boot-learning-21-2-6/) - [使用Java 8中LocalDate等时间日期类的问题解决](http://blog.didispace.com/Spring-Boot-And-Feign-Use-localdate/) - [Request header is too large 如何解决?](https://blog.didispace.com/request-header-is-too-large/) +- [Spring Boot自动化配置的利弊及解决之道](http://blog.didispace.com/spring-boot-disable-autoconfig/) ## 版本资讯 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index aed820b3..256943c1 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -16,20 +16,20 @@ ## 教程目录(2.x版本) -连载中...Star关注支持一下,随时获得更新信息! +本教程内容持续更新连载中!**Star关注**支持一下,随时获得更新信息! -### 基础知识 +### 快速入门 - [Spring Boot 2.x基础教程:版本关系](http://blog.didispace.com/spring-cloud-alibaba-version/) - [Spring Boot 2.x基础教程:快速入门](http://blog.didispace.com/spring-boot-learning-21-1-1/) - [Spring Boot 2.x基础教程:工程结构推荐](http://blog.didispace.com/spring-boot-learning-21-1-2/) -### 配置文件 +### 配置详解 - [Spring Boot 2.x基础教程:配置文件详解](http://blog.didispace.com/spring-boot-learning-21-1-3/) -- [Spring Boot 2.x基础教程:配置元数据的应用 ](http://blog.didispace.com/spring-boot-learning-24-1-6/) - [Spring Boot 2.x基础教程:2.4版本前后的多环境配置变化](http://blog.didispace.com/spring-boot-learning-24-1-4/) - [Spring Boot 2.x基础教程:2.4版本前后的分组配置变化](http://blog.didispace.com/spring-boot-learning-24-1-5/) +- [Spring Boot 2.x基础教程:配置元数据的应用 ](http://blog.didispace.com/spring-boot-learning-24-1-6/) - [Spring Boot 2.x基础教程:加密配置中的敏感信息](http://blog.didispace.com/spring-boot-learning-2-1-5/) ### API开发 @@ -58,7 +58,7 @@ - [Spring Boot 2.x基础教程:MyBatis的多数据源配置](http://blog.didispace.com/spring-boot-learning-21-3-9/) - [Spring Boot 2.x基础教程:事务管理入门](http://blog.didispace.com/spring-boot-learning-21-3-10/) - [Spring Boot 2.x基础教程:使用Flyway管理数据库版本](http://blog.didispace.com/spring-boot-learning-24-3-11/) -- [Spring Boot 2.x基础教程:使用JTA实现分布式事务](http://blog.didispace.com/spring-boot-learning-24-3-12/) +- [Spring Boot 2.x基础教程:使用JTA实现多数据源的事务管理](http://blog.didispace.com/spring-boot-learning-24-3-12/) - [Spring Boot 2.x基础教程:2.5版本后数据脚本初始化的变动](http://blog.didispace.com/spring-boot-learning-25-3-13/) **加速利器:各种缓存的使用** @@ -81,34 +81,40 @@ - [Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面](http://blog.didispace.com/spring-boot-learning-21-4-1/) - [Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表](http://blog.didispace.com/spring-boot-learning-21-4-2/) - [Spring Boot 2.x基础教程:实现文件上传](http://blog.didispace.com/spring-boot-learning-21-4-3/) -- [Spring Boot 2.x基础教程:实现多文件上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) -- [Spring Boot 2.x基础教程:文件上传的单元测试怎么写](https://blog.didispace.com/spring-boot-learning-21-4-5/) +- [Spring Boot 2.x基础教程:多个文件的上传](http://blog.didispace.com/spring-boot-learning-21-4-4/) +- [Spring Boot 2.x基础教程:文件上传的单元测试怎么写](http://blog.didispace.com/spring-boot-learning-21-4-5/) ### 任务管理 -**定时任务:`@Scheduled`实现** +**定时任务** - [Spring Boot 2.x基础教程:使用@Scheduled实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-1) - -**定时任务:Elastic Job实现** - - [Spring Boot 2.x基础教程:使用Elastic Job实现定时任务](https://blog.didispace.com/spring-boot-learning-2-7-2) - [Spring Boot 2.x基础教程:使用Elastic Job的分片配置提高执行效率](https://blog.didispace.com/spring-boot-learning-2-7-3) - [Spring Boot 2.x基础教程:使用Elastic Job的namespace防止任务名冲突](https://blog.didispace.com/spring-boot-learning-2-7-4) -**异步任务:`@Async`实现** +**异步任务** - [Spring Boot 2.x基础教程:使用@Async实现异步任务](https://blog.didispace.com/spring-boot-learning-2-7-5) - [Spring Boot 2.x基础教程:配置@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-6) - [Spring Boot 2.x基础教程:如何隔离@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-7) - [Spring Boot 2.x基础教程:配置线程池的拒绝策略](https://blog.didispace.com/spring-boot-learning-2-7-8) -### 常见问题 +### 其他内容 + +- [Spring Boot自定义启动Banner](http://blog.didispace.com/spring-boot-banner/) +- [实现邮件发送:简单邮件、附件邮件、嵌入资源的邮件、模板邮件](http://blog.didispace.com/springbootmailsender/) +- [使用Spring StateMachine框架实现状态机](http://blog.didispace.com/spring-statemachine/) +- [Spring Boot应用的后台运行配置](http://blog.didispace.com/spring-boot-run-backend/) + + +## 问题与思考 - [为什么加了@Transactional注解,事务没有回滚?](http://blog.didispace.com/transactional-not-rollback/) - [为什么启动时候API路径都没了?](http://blog.didispace.com/spring-boot-learning-21-2-6/) - [使用Java 8中LocalDate等时间日期类的问题解决](http://blog.didispace.com/Spring-Boot-And-Feign-Use-localdate/) - [Request header is too large 如何解决?](https://blog.didispace.com/request-header-is-too-large/) +- [Spring Boot自动化配置的利弊及解决之道](http://blog.didispace.com/spring-boot-disable-autoconfig/) ## 版本资讯 diff --git a/2.x/chapter4-5/pom.xml b/2.x/chapter4-5/pom.xml new file mode 100644 index 00000000..7120c77a --- /dev/null +++ b/2.x/chapter4-5/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.1 + + + + com.didispace + chapter4-5 + 0.0.1-SNAPSHOT + Spring Security快速入门 + + + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-security + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + \ No newline at end of file diff --git a/2.x/chapter4-5/src/main/java/com/didispace/chapter45/Application.java b/2.x/chapter4-5/src/main/java/com/didispace/chapter45/Application.java new file mode 100644 index 00000000..00d2d076 --- /dev/null +++ b/2.x/chapter4-5/src/main/java/com/didispace/chapter45/Application.java @@ -0,0 +1,22 @@ +package com.didispace.chapter45; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * + * @author 程序猿DD + * @version 1.0.0 + * @blog http://blog.didispace.com + * + */ +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + + SpringApplication.run(Application.class, args); + + } + +} diff --git a/2.x/chapter4-5/src/main/java/com/didispace/chapter45/HelloController.java b/2.x/chapter4-5/src/main/java/com/didispace/chapter45/HelloController.java new file mode 100644 index 00000000..849a125d --- /dev/null +++ b/2.x/chapter4-5/src/main/java/com/didispace/chapter45/HelloController.java @@ -0,0 +1,33 @@ +package com.didispace.chapter45; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +/** + * + * @author 程序猿DD + * @version 1.0.0 + * @blog http://blog.didispace.com + * + */ +@Controller +public class HelloController { + + @RequestMapping("/") + public String index() { + return "index"; + } + + @RequestMapping("/hello") + public String hello() { + return "hello"; + } + + @RequestMapping(value = "/login", method = RequestMethod.GET) + public String login() { + return "login"; + } + +} \ No newline at end of file diff --git a/2.x/chapter4-5/src/main/java/com/didispace/chapter45/WebSecurityConfig.java b/2.x/chapter4-5/src/main/java/com/didispace/chapter45/WebSecurityConfig.java new file mode 100644 index 00000000..30fffef5 --- /dev/null +++ b/2.x/chapter4-5/src/main/java/com/didispace/chapter45/WebSecurityConfig.java @@ -0,0 +1,36 @@ +package com.didispace.chapter45; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableWebSecurity +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests() + .antMatchers("/", "/home").permitAll() + .anyRequest().authenticated() + .and() + .formLogin() + .loginPage("/login") + .permitAll() + .and() + .logout() + .permitAll(); + } + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + auth + .inMemoryAuthentication() + .withUser("user").password("password").roles("USER"); + } + +} \ No newline at end of file diff --git a/2.x/chapter4-5/src/main/resources/application.properties b/2.x/chapter4-5/src/main/resources/application.properties new file mode 100644 index 00000000..e69de29b diff --git a/2.x/chapter4-5/src/main/resources/templates/hello.html b/2.x/chapter4-5/src/main/resources/templates/hello.html new file mode 100644 index 00000000..51477131 --- /dev/null +++ b/2.x/chapter4-5/src/main/resources/templates/hello.html @@ -0,0 +1,13 @@ + + + + Hello World! + + +

Hello [[${#httpServletRequest.remoteUser}]]!

+
+ +
+ + \ No newline at end of file diff --git a/2.x/chapter4-5/src/main/resources/templates/index.html b/2.x/chapter4-5/src/main/resources/templates/index.html new file mode 100644 index 00000000..ffe28340 --- /dev/null +++ b/2.x/chapter4-5/src/main/resources/templates/index.html @@ -0,0 +1,12 @@ + + + + Spring Security入门 + + +

欢迎使用Spring Security!

+ +

点击 这里 打个招呼吧

+ + \ No newline at end of file diff --git a/2.x/chapter4-5/src/main/resources/templates/login.html b/2.x/chapter4-5/src/main/resources/templates/login.html new file mode 100644 index 00000000..f5cbe8e2 --- /dev/null +++ b/2.x/chapter4-5/src/main/resources/templates/login.html @@ -0,0 +1,21 @@ + + + + Spring Security Example + + +
+ 用户名或密码错 +
+
+ 您已注销成功 +
+
+
+
+
+
+ + \ No newline at end of file diff --git a/2.x/pom.xml b/2.x/pom.xml index 4c21f4b1..947e5fea 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -54,7 +54,7 @@ chapter4-2 chapter4-3 chapter4-4 - + chapter4-5 chapter5-1 @@ -62,7 +62,7 @@ chapter5-3 chapter5-4 chapter5-5 - + chapter6-1 @@ -82,8 +82,9 @@ chapter7-8 - - chapter8-1 + + + From 8f6234f4faffd2c44c358b58e67390e49ac1eaed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Tue, 9 Nov 2021 15:11:29 +0800 Subject: [PATCH 150/160] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 3 ++- 2.x/README_zh.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index eb25e406..3facb5e3 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -106,8 +106,9 @@ - [Spring Boot应用的后台运行配置](http://blog.didispace.com/spring-boot-run-backend/) -## 问题与思考 +## 进阶与深入 +- [什么时候不要使用@Autowire](http://blog.didispace.com/when-not-use-autowire-in-spring-boot/) - [为什么加了@Transactional注解,事务没有回滚?](http://blog.didispace.com/transactional-not-rollback/) - [为什么启动时候API路径都没了?](http://blog.didispace.com/spring-boot-learning-21-2-6/) - [使用Java 8中LocalDate等时间日期类的问题解决](http://blog.didispace.com/Spring-Boot-And-Feign-Use-localdate/) diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 256943c1..e7101b86 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -108,8 +108,9 @@ - [Spring Boot应用的后台运行配置](http://blog.didispace.com/spring-boot-run-backend/) -## 问题与思考 +## 进阶与深入 +- [什么时候不要使用@Autowire](http://blog.didispace.com/when-not-use-autowire-in-spring-boot/) - [为什么加了@Transactional注解,事务没有回滚?](http://blog.didispace.com/transactional-not-rollback/) - [为什么启动时候API路径都没了?](http://blog.didispace.com/spring-boot-learning-21-2-6/) - [使用Java 8中LocalDate等时间日期类的问题解决](http://blog.didispace.com/Spring-Boot-And-Feign-Use-localdate/) From e31efa092b63dccec54f68ba8c58e8f405228f92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Tue, 14 Dec 2021 12:48:23 +0800 Subject: [PATCH 151/160] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter1-4/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter1-4/pom.xml b/2.x/chapter1-4/pom.xml index 8c5539f1..5bbd4008 100644 --- a/2.x/chapter1-4/pom.xml +++ b/2.x/chapter1-4/pom.xml @@ -11,7 +11,7 @@ com.didispace chapter1-4 0.0.1-SNAPSHOT - chapter1-1 + chapter1-4 配置元数据的应用 From 5d825367496f6ad9c30510325b92e0e8f25fffb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Tue, 28 Dec 2021 18:28:43 +0800 Subject: [PATCH 152/160] =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=B8=8ELogback=E9=85=8D=E7=BD=AE=E8=AF=A6?= =?UTF-8?q?=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 18 ++++------ 2.x/README_zh.md | 6 ++++ 2.x/chapter8-1/pom.xml | 19 +++------- .../com/didispace/chapter81/Application.java | 22 ------------ .../chapter81/Chapter81Application.java | 26 ++++++++++++++ .../didispace/chapter81/HelloController.java | 33 ----------------- .../chapter81/WebSecurityConfig.java | 36 ------------------- .../src/main/resources/application.properties | 14 ++++++++ .../src/main/resources/templates/hello.html | 13 ------- .../src/main/resources/templates/index.html | 12 ------- .../src/main/resources/templates/login.html | 21 ----------- 2.x/pom.xml | 4 +-- 12 files changed, 60 insertions(+), 164 deletions(-) delete mode 100644 2.x/chapter8-1/src/main/java/com/didispace/chapter81/Application.java create mode 100644 2.x/chapter8-1/src/main/java/com/didispace/chapter81/Chapter81Application.java delete mode 100644 2.x/chapter8-1/src/main/java/com/didispace/chapter81/HelloController.java delete mode 100644 2.x/chapter8-1/src/main/java/com/didispace/chapter81/WebSecurityConfig.java delete mode 100644 2.x/chapter8-1/src/main/resources/templates/hello.html delete mode 100644 2.x/chapter8-1/src/main/resources/templates/index.html delete mode 100644 2.x/chapter8-1/src/main/resources/templates/login.html diff --git a/2.x/README.md b/2.x/README.md index 3facb5e3..59541053 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -98,6 +98,12 @@ - [Spring Boot 2.x基础教程:如何隔离@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-7) - [Spring Boot 2.x基础教程:配置线程池的拒绝策略](https://blog.didispace.com/spring-boot-learning-2-7-8) +### 日志管理 + +- [Spring Boot 2.x基础教程:默认日志管理与Logback配置详解](https://blog.didispace.com/spring-boot-learning-2-8-1) +- [Spring Boot 2.x基础教程:使用tinylog记录日志](https://blog.didispace.com/spring-boot-learning-2-8-3) +- [Spring Boot 2.x基础教程:使用log4j2记录日志](https://blog.didispace.com/spring-boot-learning-2-8-3) + ### 其他内容 - [Spring Boot自定义启动Banner](http://blog.didispace.com/spring-boot-banner/) @@ -105,7 +111,6 @@ - [使用Spring StateMachine框架实现状态机](http://blog.didispace.com/spring-statemachine/) - [Spring Boot应用的后台运行配置](http://blog.didispace.com/spring-boot-run-backend/) - ## 进阶与深入 - [什么时候不要使用@Autowire](http://blog.didispace.com/when-not-use-autowire-in-spring-boot/) @@ -125,16 +130,7 @@ - [Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析](http://blog.didispace.com/Spring-Boot-2-0-feature-1-relaxed-binding-2/) - [Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent](http://blog.didispace.com/Spring-Boot-2-0-feature-2-ApplicationStartedEvent/) -### 2.x版本信息 - -- [Spring Boot 2.2 正式发布,大幅性能提升 + Java 13 支持](http://blog.didispace.com/spring-boot-2-2-release/) -- [Spring Boot 2.3.0 发布](/spring-boot-2-3-0-release/) -- [Spring Boot 2.3.0 放弃 Maven 转投 Gradle](/spring-boot-gradle/) -- [Spring Boot 2.3.2 发布,解决 Too many open files 导致的应用宕机问题](http://blog.didispace.com/spring-boot-2-3-2-release/) -- [Spring Boot 2.4.0 正式发布!全新的配置处理机制,拥抱云原生!](http://blog.didispace.com/spring-boot-2-4-0-ga/) -- [Spring Boot 2.4.1 发布,修正大量2.4全新配置机制的Bug](http://blog.didispace.com/spring-boot-2-4-1-release/) -- [Spring Boot 2.5.0 发布:支持Java16、Gradle 7、Datasource初始化调整](https://blog.didispace.com/spring-boot-2-5-0-release/) -- [Spring Boot 2.5.1 发布](https://blog.didispace.com/spring-boot-2-5-1-release/) +更多关于2.x的版本信息可查看[点击查看](http://www.springcloud.com.cn/) ## 我的公众号 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index e7101b86..3fc0779b 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -100,6 +100,12 @@ - [Spring Boot 2.x基础教程:如何隔离@Async异步任务的线程池](https://blog.didispace.com/spring-boot-learning-2-7-7) - [Spring Boot 2.x基础教程:配置线程池的拒绝策略](https://blog.didispace.com/spring-boot-learning-2-7-8) +### 日志管理 + +- [Spring Boot 2.x基础教程:默认日志管理与Logback配置详解](https://blog.didispace.com/spring-boot-learning-2-8-1) +- [Spring Boot 2.x基础教程:使用tinylog记录日志](https://blog.didispace.com/spring-boot-learning-2-8-3) +- [Spring Boot 2.x基础教程:使用log4j2记录日志](https://blog.didispace.com/spring-boot-learning-2-8-3) + ### 其他内容 - [Spring Boot自定义启动Banner](http://blog.didispace.com/spring-boot-banner/) diff --git a/2.x/chapter8-1/pom.xml b/2.x/chapter8-1/pom.xml index 81817f27..d60616ec 100644 --- a/2.x/chapter8-1/pom.xml +++ b/2.x/chapter8-1/pom.xml @@ -13,7 +13,7 @@ com.didispace chapter8-1 0.0.1-SNAPSHOT - Spring Security快速入门 + 默认日志管理与Logback配置详解 UTF-8 @@ -23,7 +23,7 @@ org.springframework.boot - spring-boot-starter + spring-boot-starter-web @@ -33,19 +33,10 @@ - org.springframework.boot - spring-boot-starter-web + org.projectlombok + lombok + provided - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-security - - diff --git a/2.x/chapter8-1/src/main/java/com/didispace/chapter81/Application.java b/2.x/chapter8-1/src/main/java/com/didispace/chapter81/Application.java deleted file mode 100644 index f7a9e16e..00000000 --- a/2.x/chapter8-1/src/main/java/com/didispace/chapter81/Application.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.didispace; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * - * @author 程序猿DD - * @version 1.0.0 - * @blog http://blog.didispace.com - * - */ -@SpringBootApplication -public class Application { - - public static void main(String[] args) { - - SpringApplication.run(Application.class, args); - - } - -} diff --git a/2.x/chapter8-1/src/main/java/com/didispace/chapter81/Chapter81Application.java b/2.x/chapter8-1/src/main/java/com/didispace/chapter81/Chapter81Application.java new file mode 100644 index 00000000..a8fec0e0 --- /dev/null +++ b/2.x/chapter8-1/src/main/java/com/didispace/chapter81/Chapter81Application.java @@ -0,0 +1,26 @@ +package com.didispace.chapter81; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author 程序猿DD + * @version 1.0.0 + * @blog https://blog.didispace.com + */ +@Slf4j +@SpringBootApplication +public class Chapter81Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter81Application.class, args); + + log.error("Hello World"); + log.warn("Hello World"); + log.info("Hello World"); + log.debug("Hello World"); + log.trace("Hello World"); + } + +} diff --git a/2.x/chapter8-1/src/main/java/com/didispace/chapter81/HelloController.java b/2.x/chapter8-1/src/main/java/com/didispace/chapter81/HelloController.java deleted file mode 100644 index f5a6770b..00000000 --- a/2.x/chapter8-1/src/main/java/com/didispace/chapter81/HelloController.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.didispace.chapter81; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -/** - * - * @author 程序猿DD - * @version 1.0.0 - * @blog http://blog.didispace.com - * - */ -@Controller -public class HelloController { - - @RequestMapping("/") - public String index() { - return "index"; - } - - @RequestMapping("/hello") - public String hello() { - return "hello"; - } - - @RequestMapping(value = "/login", method = RequestMethod.GET) - public String login() { - return "login"; - } - -} \ No newline at end of file diff --git a/2.x/chapter8-1/src/main/java/com/didispace/chapter81/WebSecurityConfig.java b/2.x/chapter8-1/src/main/java/com/didispace/chapter81/WebSecurityConfig.java deleted file mode 100644 index 1f3da340..00000000 --- a/2.x/chapter8-1/src/main/java/com/didispace/chapter81/WebSecurityConfig.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.didispace.chapter81; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; - -@Configuration -@EnableWebSecurity -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeRequests() - .antMatchers("/", "/home").permitAll() - .anyRequest().authenticated() - .and() - .formLogin() - .loginPage("/login") - .permitAll() - .and() - .logout() - .permitAll(); - } - - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth - .inMemoryAuthentication() - .withUser("user").password("password").roles("USER"); - } - -} \ No newline at end of file diff --git a/2.x/chapter8-1/src/main/resources/application.properties b/2.x/chapter8-1/src/main/resources/application.properties index e69de29b..361847c5 100644 --- a/2.x/chapter8-1/src/main/resources/application.properties +++ b/2.x/chapter8-1/src/main/resources/application.properties @@ -0,0 +1,14 @@ +debug=true + +spring.output.ansi.enabled=detect + +logging.file.name=run.log +logging.file.path=./ + +logging.level.com.didispace=debug + +logging.logback.rollingpolicy.clean-history-on-start=false +logging.logback.rollingpolicy.file-name-pattern= +logging.logback.rollingpolicy.max-history=7 +logging.logback.rollingpolicy.max-file-size=10MB +logging.logback.rollingpolicy.total-size-cap=0B diff --git a/2.x/chapter8-1/src/main/resources/templates/hello.html b/2.x/chapter8-1/src/main/resources/templates/hello.html deleted file mode 100644 index 51477131..00000000 --- a/2.x/chapter8-1/src/main/resources/templates/hello.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - Hello World! - - -

Hello [[${#httpServletRequest.remoteUser}]]!

-
- -
- - \ No newline at end of file diff --git a/2.x/chapter8-1/src/main/resources/templates/index.html b/2.x/chapter8-1/src/main/resources/templates/index.html deleted file mode 100644 index ffe28340..00000000 --- a/2.x/chapter8-1/src/main/resources/templates/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - Spring Security入门 - - -

欢迎使用Spring Security!

- -

点击 这里 打个招呼吧

- - \ No newline at end of file diff --git a/2.x/chapter8-1/src/main/resources/templates/login.html b/2.x/chapter8-1/src/main/resources/templates/login.html deleted file mode 100644 index f5cbe8e2..00000000 --- a/2.x/chapter8-1/src/main/resources/templates/login.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - Spring Security Example - - -
- 用户名或密码错 -
-
- 您已注销成功 -
-
-
-
-
-
- - \ No newline at end of file diff --git a/2.x/pom.xml b/2.x/pom.xml index 947e5fea..664ba7a3 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -82,8 +82,8 @@ chapter7-8 - - + + chapter8-1 From 0dd9c71c7cffe65bd0541c02c2c0e284849921a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 29 Dec 2021 18:02:14 +0800 Subject: [PATCH 153/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8log4j2=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 3 +- 2.x/README_zh.md | 2 +- 2.x/chapter8-2/pom.xml | 59 +++++++++++++++++++ .../chapter82/Chapter82Application.java | 26 ++++++++ .../src/main/resources/application.properties | 14 +++++ 2.x/pom.xml | 3 +- 6 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 2.x/chapter8-2/pom.xml create mode 100644 2.x/chapter8-2/src/main/java/com/didispace/chapter82/Chapter82Application.java create mode 100644 2.x/chapter8-2/src/main/resources/application.properties diff --git a/2.x/README.md b/2.x/README.md index 59541053..4c21c833 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -101,8 +101,9 @@ ### 日志管理 - [Spring Boot 2.x基础教程:默认日志管理与Logback配置详解](https://blog.didispace.com/spring-boot-learning-2-8-1) +- [Spring Boot 2.x基础教程:使用log4j2记录日志](https://blog.didispace.com/spring-boot-learning-2-8-2) - [Spring Boot 2.x基础教程:使用tinylog记录日志](https://blog.didispace.com/spring-boot-learning-2-8-3) -- [Spring Boot 2.x基础教程:使用log4j2记录日志](https://blog.didispace.com/spring-boot-learning-2-8-3) + ### 其他内容 diff --git a/2.x/README_zh.md b/2.x/README_zh.md index 3fc0779b..bc61108c 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -103,8 +103,8 @@ ### 日志管理 - [Spring Boot 2.x基础教程:默认日志管理与Logback配置详解](https://blog.didispace.com/spring-boot-learning-2-8-1) +- [Spring Boot 2.x基础教程:使用log4j2记录日志](https://blog.didispace.com/spring-boot-learning-2-8-2) - [Spring Boot 2.x基础教程:使用tinylog记录日志](https://blog.didispace.com/spring-boot-learning-2-8-3) -- [Spring Boot 2.x基础教程:使用log4j2记录日志](https://blog.didispace.com/spring-boot-learning-2-8-3) ### 其他内容 diff --git a/2.x/chapter8-2/pom.xml b/2.x/chapter8-2/pom.xml new file mode 100644 index 00000000..fd6eedf7 --- /dev/null +++ b/2.x/chapter8-2/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.6.1 + + + + com.didispace + chapter8-2 + 0.0.1-SNAPSHOT + 使用log4j2记录日志 + + + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.projectlombok + lombok + provided + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + \ No newline at end of file diff --git a/2.x/chapter8-2/src/main/java/com/didispace/chapter82/Chapter82Application.java b/2.x/chapter8-2/src/main/java/com/didispace/chapter82/Chapter82Application.java new file mode 100644 index 00000000..be62c0c2 --- /dev/null +++ b/2.x/chapter8-2/src/main/java/com/didispace/chapter82/Chapter82Application.java @@ -0,0 +1,26 @@ +package com.didispace.chapter82; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author 程序猿DD + * @version 1.0.0 + * @blog https://blog.didispace.com + */ +@Slf4j +@SpringBootApplication +public class Chapter82Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter82Application.class, args); + + log.error("Hello World"); + log.warn("Hello World"); + log.info("Hello World"); + log.debug("Hello World"); + log.trace("Hello World"); + } + +} diff --git a/2.x/chapter8-2/src/main/resources/application.properties b/2.x/chapter8-2/src/main/resources/application.properties new file mode 100644 index 00000000..361847c5 --- /dev/null +++ b/2.x/chapter8-2/src/main/resources/application.properties @@ -0,0 +1,14 @@ +debug=true + +spring.output.ansi.enabled=detect + +logging.file.name=run.log +logging.file.path=./ + +logging.level.com.didispace=debug + +logging.logback.rollingpolicy.clean-history-on-start=false +logging.logback.rollingpolicy.file-name-pattern= +logging.logback.rollingpolicy.max-history=7 +logging.logback.rollingpolicy.max-file-size=10MB +logging.logback.rollingpolicy.total-size-cap=0B diff --git a/2.x/pom.xml b/2.x/pom.xml index 664ba7a3..618227a4 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -84,7 +84,8 @@ chapter8-1 - + chapter8-2 + From fc1f39b0f842780e5e366ce8226f1865209007b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Thu, 30 Dec 2021 10:59:19 +0800 Subject: [PATCH 154/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8log4j2=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter8-2/pom.xml | 14 ++++++++++---- .../src/main/resources/application.properties | 14 +------------- 2.x/chapter8-2/src/main/resources/log4j2.xml | 13 +++++++++++++ 3 files changed, 24 insertions(+), 17 deletions(-) create mode 100644 2.x/chapter8-2/src/main/resources/log4j2.xml diff --git a/2.x/chapter8-2/pom.xml b/2.x/chapter8-2/pom.xml index fd6eedf7..eeda9143 100644 --- a/2.x/chapter8-2/pom.xml +++ b/2.x/chapter8-2/pom.xml @@ -24,12 +24,18 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + - - - - + + org.springframework.boot + spring-boot-starter-log4j2 + org.springframework.boot diff --git a/2.x/chapter8-2/src/main/resources/application.properties b/2.x/chapter8-2/src/main/resources/application.properties index 361847c5..b642e6f9 100644 --- a/2.x/chapter8-2/src/main/resources/application.properties +++ b/2.x/chapter8-2/src/main/resources/application.properties @@ -1,14 +1,2 @@ -debug=true -spring.output.ansi.enabled=detect - -logging.file.name=run.log -logging.file.path=./ - -logging.level.com.didispace=debug - -logging.logback.rollingpolicy.clean-history-on-start=false -logging.logback.rollingpolicy.file-name-pattern= -logging.logback.rollingpolicy.max-history=7 -logging.logback.rollingpolicy.max-file-size=10MB -logging.logback.rollingpolicy.total-size-cap=0B +logging.config=classpath:log4j2.xml \ No newline at end of file diff --git a/2.x/chapter8-2/src/main/resources/log4j2.xml b/2.x/chapter8-2/src/main/resources/log4j2.xml new file mode 100644 index 00000000..18ca1279 --- /dev/null +++ b/2.x/chapter8-2/src/main/resources/log4j2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + From 6f1bc8f6979d9966c6566201ecd74bd6332f54b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 9 Feb 2022 15:52:11 +0800 Subject: [PATCH 155/160] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=85=83=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E5=BA=94=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/didispace/chapter14/HelloController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.x/chapter1-4/src/main/java/com/didispace/chapter14/HelloController.java b/2.x/chapter1-4/src/main/java/com/didispace/chapter14/HelloController.java index d19b5ef6..084af5b8 100644 --- a/2.x/chapter1-4/src/main/java/com/didispace/chapter14/HelloController.java +++ b/2.x/chapter1-4/src/main/java/com/didispace/chapter14/HelloController.java @@ -1,4 +1,4 @@ -package com.didispace.chapter11; +package com.didispace.chapter14; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; From 07fd7ad0c11cf443d52ccf47d37f1996d6323341 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 9 Feb 2022 15:57:08 +0800 Subject: [PATCH 156/160] =?UTF-8?q?=E7=9B=AE=E5=BD=95=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 3 ++- 2.x/README_zh.md | 3 ++- README.md | 5 +++-- README_zh.md | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/2.x/README.md b/2.x/README.md index 4c21c833..b8940acb 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -4,7 +4,8 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) +**加入社群**:如果你正在学习Spring Boot,不妨加入我们的[Spring技术交流群](https://blog.didispace.com/join-group-spring/index.html) ,一起成长 +**Spring社区**:如果您在学习过程中碰到问题,可以访问[SpringForAll社区](http://spring4all.com),描述你的问题,我们会尽快给你答复。当然,如果你想分享你的学习经验,也可以在这里发表你的文章 **如何支持**: diff --git a/2.x/README_zh.md b/2.x/README_zh.md index bc61108c..e0999d9f 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -4,7 +4,8 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) +**加入社群**:如果你正在学习Spring Boot,不妨加入我们的[Spring技术交流群](https://blog.didispace.com/join-group-spring/index.html) ,一起成长 +**Spring社区**:如果您在学习过程中碰到问题,可以访问[SpringForAll社区](http://spring4all.com),描述你的问题,我们会尽快给你答复。当然,如果你想分享你的学习经验,也可以在这里发表你的文章 **如何支持**: diff --git a/README.md b/README.md index 84dea730..2bb8edeb 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,14 @@ 2. 点个`Star`并`Follow`我 3. 把该仓库分享给更多的朋友 -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) +**加入社群**:如果你正在学习Spring Boot,不妨加入我们的[Spring技术交流群](https://blog.didispace.com/join-group-spring/index.html) ,一起成长 +**Spring社区**:如果您在学习过程中碰到问题,可以访问[SpringForAll社区](http://spring4all.com),描述你的问题,我们会尽快给你答复。当然,如果你想分享你的学习经验,也可以在这里发表你的文章 ## 教程目录 该教程自2016年连载至今,因内容较多,经历过多个版本的迭代。 -为方便查看学习,这里重新做了整理,根据1.x版本和2.x版本做了区分汇总。 +为方便查看学习,这里重新做了整理,根据1.x版本和2.x版本做了区分汇总,后续还会继续跟进3.x版本! 可以通过下面的链接,进入具体版本的教程目录: diff --git a/README_zh.md b/README_zh.md index 84dea730..1a7c9110 100644 --- a/README_zh.md +++ b/README_zh.md @@ -8,7 +8,8 @@ 2. 点个`Star`并`Follow`我 3. 把该仓库分享给更多的朋友 -**加入社群**:[如果你正在学习Spring Boot,不妨加入我们的Spring技术交流群,一起成长!](https://blog.didispace.com/join-group-spring/index.html) +**加入社群**:如果你正在学习Spring Boot,不妨加入我们的[Spring技术交流群](https://blog.didispace.com/join-group-spring/index.html) ,一起成长 +**Spring社区**:如果您在学习过程中碰到问题,可以访问[SpringForAll社区](http://spring4all.com),描述你的问题,我们会尽快给你答复。当然,如果你想分享你的学习经验,也可以在这里发表你的文章 ## 教程目录 From fdd6b61af6a0512cc446e05244231dcfc2b8e1d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 9 Feb 2022 15:59:11 +0800 Subject: [PATCH 157/160] =?UTF-8?q?2.x=E7=89=88=E6=9C=AC=E6=95=99=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/README.md | 1 + 2.x/README_zh.md | 1 + README.md | 1 + README_zh.md | 1 + 4 files changed, 4 insertions(+) diff --git a/2.x/README.md b/2.x/README.md index b8940acb..af580d69 100644 --- a/2.x/README.md +++ b/2.x/README.md @@ -5,6 +5,7 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! **加入社群**:如果你正在学习Spring Boot,不妨加入我们的[Spring技术交流群](https://blog.didispace.com/join-group-spring/index.html) ,一起成长 + **Spring社区**:如果您在学习过程中碰到问题,可以访问[SpringForAll社区](http://spring4all.com),描述你的问题,我们会尽快给你答复。当然,如果你想分享你的学习经验,也可以在这里发表你的文章 **如何支持**: diff --git a/2.x/README_zh.md b/2.x/README_zh.md index e0999d9f..70612143 100644 --- a/2.x/README_zh.md +++ b/2.x/README_zh.md @@ -5,6 +5,7 @@ **专题目标**:打造全网内容最全,比收费教程更好的Spring Boot免费教程! **加入社群**:如果你正在学习Spring Boot,不妨加入我们的[Spring技术交流群](https://blog.didispace.com/join-group-spring/index.html) ,一起成长 + **Spring社区**:如果您在学习过程中碰到问题,可以访问[SpringForAll社区](http://spring4all.com),描述你的问题,我们会尽快给你答复。当然,如果你想分享你的学习经验,也可以在这里发表你的文章 **如何支持**: diff --git a/README.md b/README.md index 2bb8edeb..916c7fa4 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ 3. 把该仓库分享给更多的朋友 **加入社群**:如果你正在学习Spring Boot,不妨加入我们的[Spring技术交流群](https://blog.didispace.com/join-group-spring/index.html) ,一起成长 + **Spring社区**:如果您在学习过程中碰到问题,可以访问[SpringForAll社区](http://spring4all.com),描述你的问题,我们会尽快给你答复。当然,如果你想分享你的学习经验,也可以在这里发表你的文章 ## 教程目录 diff --git a/README_zh.md b/README_zh.md index 1a7c9110..f75927c3 100644 --- a/README_zh.md +++ b/README_zh.md @@ -9,6 +9,7 @@ 3. 把该仓库分享给更多的朋友 **加入社群**:如果你正在学习Spring Boot,不妨加入我们的[Spring技术交流群](https://blog.didispace.com/join-group-spring/index.html) ,一起成长 + **Spring社区**:如果您在学习过程中碰到问题,可以访问[SpringForAll社区](http://spring4all.com),描述你的问题,我们会尽快给你答复。当然,如果你想分享你的学习经验,也可以在这里发表你的文章 ## 教程目录 From 8d265aa8e12488078752e05aa228a4f321bf52a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 9 Feb 2022 16:00:11 +0800 Subject: [PATCH 158/160] =?UTF-8?q?1.x=E7=89=88=E6=9C=AC=E6=95=99=E7=A8=8B?= =?UTF-8?q?=EF=BC=88=E5=B7=B2=E5=AE=8C=E7=BB=93=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.x/README.md | 1 + 1.x/README_zh.md | 1 + 2 files changed, 2 insertions(+) diff --git a/1.x/README.md b/1.x/README.md index a1fcc0fe..0fdaf52c 100644 --- a/1.x/README.md +++ b/1.x/README.md @@ -7,6 +7,7 @@ Spring Boot 2.x版本的教程可在`2.x`目录下查看。 + ## 教程目录(1.x版本) 本教程版本基于Spring Boot 1.3.x - 1.5.x,部分内容可能会有出入。如果您发现问题,首先看版本是否一致。如果还有问题,可以提Issue指出。 diff --git a/1.x/README_zh.md b/1.x/README_zh.md index a1fcc0fe..0fdaf52c 100644 --- a/1.x/README_zh.md +++ b/1.x/README_zh.md @@ -7,6 +7,7 @@ Spring Boot 2.x版本的教程可在`2.x`目录下查看。 + ## 教程目录(1.x版本) 本教程版本基于Spring Boot 1.3.x - 1.5.x,部分内容可能会有出入。如果您发现问题,首先看版本是否一致。如果还有问题,可以提Issue指出。 From fbf79267cf97695c6b91eac541ad3df040549e6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Fri, 11 Feb 2022 18:51:25 +0800 Subject: [PATCH 159/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8tinylog=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter8-3/pom.xml | 60 +++++++++++++++++++ .../chapter83/Chapter83Application.java | 26 ++++++++ .../src/main/resources/application.properties | 1 + 2.x/pom.xml | 5 +- 4 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 2.x/chapter8-3/pom.xml create mode 100644 2.x/chapter8-3/src/main/java/com/didispace/chapter83/Chapter83Application.java create mode 100644 2.x/chapter8-3/src/main/resources/application.properties diff --git a/2.x/chapter8-3/pom.xml b/2.x/chapter8-3/pom.xml new file mode 100644 index 00000000..7d640d1a --- /dev/null +++ b/2.x/chapter8-3/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.6.1 + + + + com.didispace + chapter8-3 + 0.0.1-SNAPSHOT + 使用tinylog记录日志 + + + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.projectlombok + lombok + provided + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + \ No newline at end of file diff --git a/2.x/chapter8-3/src/main/java/com/didispace/chapter83/Chapter83Application.java b/2.x/chapter8-3/src/main/java/com/didispace/chapter83/Chapter83Application.java new file mode 100644 index 00000000..8a68d462 --- /dev/null +++ b/2.x/chapter8-3/src/main/java/com/didispace/chapter83/Chapter83Application.java @@ -0,0 +1,26 @@ +package com.didispace.chapter83; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author 程序猿DD + * @version 1.0.0 + * @blog https://blog.didispace.com + */ +@Slf4j +@SpringBootApplication +public class Chapter83Application { + + public static void main(String[] args) { + SpringApplication.run(Chapter83Application.class, args); + + log.error("Hello World"); + log.warn("Hello World"); + log.info("Hello World"); + log.debug("Hello World"); + log.trace("Hello World"); + } + +} diff --git a/2.x/chapter8-3/src/main/resources/application.properties b/2.x/chapter8-3/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/2.x/chapter8-3/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/2.x/pom.xml b/2.x/pom.xml index 618227a4..f20e1714 100644 --- a/2.x/pom.xml +++ b/2.x/pom.xml @@ -85,7 +85,10 @@ chapter8-1 chapter8-2 - + chapter8-3 + + + From 4212d163da816c6fa5b28d59130318dac2379a73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Mon, 14 Feb 2022 10:40:01 +0800 Subject: [PATCH 160/160] =?UTF-8?q?=E4=BD=BF=E7=94=A8tinylog=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.x/chapter8-3/pom.xml | 27 ++++++++++++++++--- .../src/main/resources/tinylog.properties | 2 ++ 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 2.x/chapter8-3/src/main/resources/tinylog.properties diff --git a/2.x/chapter8-3/pom.xml b/2.x/chapter8-3/pom.xml index 7d640d1a..d6a578e8 100644 --- a/2.x/chapter8-3/pom.xml +++ b/2.x/chapter8-3/pom.xml @@ -18,6 +18,7 @@ UTF-8 1.8 + 2.4.1 @@ -33,9 +34,29 @@ - org.springframework.boot - spring-boot-starter-test - test + org.tinylog + tinylog-api + ${tinylog.version} + + + org.tinylog + tinylog-impl + ${tinylog.version} + + + org.tinylog + slf4j-tinylog + ${tinylog.version} + + + org.tinylog + jcl-tinylog + ${tinylog.version} + + + org.tinylog + log4j1.2-api + ${tinylog.version} diff --git a/2.x/chapter8-3/src/main/resources/tinylog.properties b/2.x/chapter8-3/src/main/resources/tinylog.properties new file mode 100644 index 00000000..9eb1b999 --- /dev/null +++ b/2.x/chapter8-3/src/main/resources/tinylog.properties @@ -0,0 +1,2 @@ +writer=console +writer.format={date: HH:mm:ss.SSS} {level}: {message} \ No newline at end of file