diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 84d92656..2e80ff4b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -10,7 +10,8 @@ jobs:
test-hotspot-jdk-ci:
name: Test CI - JDK ${{ matrix.java-version }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
- timeout-minutes: 60
+ # 集成测试要拉取较大的镜像(nacos/seata/mysql/postgres/consul),冷缓存时多留一些时间。
+ timeout-minutes: 120
strategy:
matrix:
os: [ 'ubuntu-latest' ]
@@ -42,14 +43,8 @@ jobs:
distribution: 'temurin'
java-version: ${{ matrix.java-version }}
cache: 'maven'
- - name: Build datasource test with Maven
- run: |
- ./mvnw -am -pl datasource-samples/druid-sample -T1C -B -e clean test
- - name: Build orm test with Maven
- run: |
- ./mvnw -am -pl orm-samples/mybatis-sample -T1C -B -e clean test
- - name: Build third-part test with Maven
+ - name: Build spring-boot-2 samples with Maven
+ # 主代码保持 Java 8 兼容;测试需要 testcontainers 2.x(加载要求 Java 17+),
+ # 因此 JDK 8 任务只做编译验证,测试在上面的 JDK 17/21 任务中执行。
run: |
- ./mvnw -am -pl third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample -T1C -e clean test
- ./mvnw -am -pl third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample -T1C -e clean test
- ./mvnw -am -pl third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample -T1C -e clean test
+ ./mvnw -am -pl spring-boot-2/shardingsphere-jdbc-4.x-spring-sample -T1C -B -e clean compile
diff --git a/README.md b/README.md
index d003cb47..219a0a06 100644
--- a/README.md
+++ b/README.md
@@ -1,42 +1,75 @@
# 演示例子
-大部分数据库连接为 `h2database` 或通过 `testcontainers-java` 启动的 `mysql-server`,仅供测试。讨论不同情况,
+大部分数据库连接为 `h2database` 或通过 `testcontainers-java` 启动的 `mysql-server`,仅供测试。
-1. `com.baomidou:springboot3-sample` 可在 [OpenJDK 17, OpenJDK 21] 的 JDK 范围及其下游发行版下执行单元测试
-2. 除开 `com.baomidou:springboot3-sample`, 其他子模块均可在 [OpenJDK 8, OpenJDK 21] 的 JDK 范围及其下游发行版下执行单元测试
+示例按 Spring Boot 版本分别存放在 `spring-boot-2`、`spring-boot-3`、`spring-boot-4` 文件夹下,
+每个文件夹都是独立的 Maven 聚合模块(版本对应的 `dynamic-datasource-spring-boot-starter` /
+`dynamic-datasource-spring-boot3-starter` / `dynamic-datasource-spring-boot4-starter` 见其下的 `pom.xml`):
+
+- `spring-boot-2` 下的子模块运行在 Spring Boot 2.7.x,可在 [OpenJDK 8, OpenJDK 21] 的 JDK 范围及其下游发行版下执行单元测试
+- `spring-boot-3`(`springboot3-sample`)与 `spring-boot-4` 下的子模块分别运行在 Spring Boot 3.5.x / 4.0.x,
+ 需要在 [OpenJDK 17, ...] 的 JDK 范围及其下游发行版下执行单元测试
所有单元测试在 Github Actions 完成验证。你可能希望参考 [位于 Github Actions 的 CI 文件](./.github/workflows/ci.yml)。
-- add-remove-datasource 动态添加删除数据源的使用示例
-- all-datasource-sample 所有不同连接池使用示例(大乱炖,实际不建议)
+## Spring Boot 4(`spring-boot-4/`)
+
+- add-remove-datasource-sample 动态添加删除数据源的使用示例
+- beetlsql-sample 集成 BeetlSQL 的使用示例
+- config-consul-sample 集成 Consul 配置中心的使用示例
+- config-nacos-sample 集成 Nacos 配置中心的使用示例(按官方文档使用 `com.alibaba.cloud:spring-alibaba-nacos-config`)
- druid-sample 集成mybatis和druid的使用示例
- jdbc-template-sample 集成原生jdbcTemplate的使用示例
-- load-datasource-from-jdbc 通过数据库配置来启动数据源示例
+- load-datasource-from-jdbc-sample 通过数据库配置来启动数据源示例
- mybatis-sample 集成原生mybatis的使用示例
-- mybatisplus2-sample 集成mybatisPlus2的使用示例
- mybatisplus3-sample 集成mybatisPlus3的使用示例
- name-pattern-sample 自定义切面的使用示例
-- nest-sample 嵌套切换数据源使用示例
- quartz-sample 多数据源集成quartz示例
-- shardingsphere-jdbc-4.x-spring-sample 集成 ShardingSphere JDBC Spring Boot Starter 4.1.1 使用示例, 不再维护,
- 参考 https://github.com/apache/shardingsphere/releases/tag/5.0.0-alpha
- shardingsphere-jdbc-5.x-core-sample 集成 ShardingSphere JDBC Driver 5.5.2 使用示例
-- shardingsphere-jdbc-5.x-spring-sample 集成 ShardingSphere JDBC Spring Boot Starter 5.2.1 使用示例, 不再维护,
+- shardingsphere-jdbc-5.x-spring-sample 集成 ShardingSphere JDBC Driver 5.5.2 使用示例,
参考 https://github.com/apache/shardingsphere/issues/22469
- spel-sample 动态从外部参数spel来切换数据源的使用示例
- tx-local-sample 本地事务示例项目★★★★★★必看★★★★★★
- tx-seata-sample 基于seata的分布式事务集成使用示例
+## Spring Boot 3(`spring-boot-3/`)
+
+- springboot3-sample Spring Boot 3 使用示例
+
+## Spring Boot 2(`spring-boot-2/`)
+
+以下示例暂时无法迁移到高版本,予以保留:
+
+- shardingsphere-jdbc-4.x-spring-sample 集成 ShardingSphere JDBC Spring Boot Starter 4.1.1 使用示例, 不再维护,
+ 参考 https://github.com/apache/shardingsphere/releases/tag/5.0.0-alpha
+
+## 单元测试说明
+
+- 纯 H2 的模块(`mybatisplus3-sample`、`beetlsql-sample`、`jdbc-template-sample`、`name-pattern-sample`、
+ `add-remove-datasource-sample`、`load-datasource-from-jdbc-sample`、`druid-sample`、`spel-sample`、
+ `shardingsphere-jdbc-5.x-spring-sample`)可直接 `mvn test`,无需外部服务。
+- 涉及外部中间件的模块使用 [Testcontainers](https://java.testcontainers.org/) 在测试中启动容器,
+ 本地与 CI 运行测试都需要可用的 Docker 环境:
+ - `quartz-sample`:`mysql:8.4.7-oraclelinux9`
+ - `tx-local-sample`:`postgres:16-alpine`(测试资源里用 `init-schemas.sql` 预建 schema)
+ - `tx-seata-sample`:`postgres:16-alpine` + `apache/seata-server:2.6.0`(与客户端版本对齐)
+ - `config-consul-sample`:`hashicorp/consul:1.15`(向 KV 写入 `dynamic-datasource/application/data`)
+ - `config-nacos-sample`:`nacos/nacos-server:v3.2.4`(新版 starter 内含 3.x 客户端,走 gRPC,
+ 发布走 v3 运维 API,测试按实际映射端口动态计算 `nacos.server.grpc.port.offset`)
+ - `shardingsphere-jdbc-5.x-core-sample`:`mysql:8.4.7-oraclelinux9`
+- `spring-boot-2` 下模块的主代码保持 Java 8 兼容,因此 JDK 8 的 CI 任务仅做 `clean compile`,
+ 完整测试在 JDK 17/21 任务中执行。
+
## Contributing
我们欢迎社区的贡献。围绕此 git 的讨论与协作应通过 https://github.com/baomidou/dynamic-datasource/issues 进行。
在提交 Pull Request 之前, 请在本地通过 [OpenJDK 17, OpenJDK 21] 的 JDK 范围下完成此命令的验证。
我们鼓励通过 `SDKMAN!` 或 `version-fox/vfox` 切换到 `21.0.2-graalce` 来验证。
-针对 IntelliJ IDEA 等 IDE,项目的语言级别应设置为 JDK 8,对于单独的 `com.baomidou:springboot3-sample` 子模块,语言级别应设置为 JDK 17。
+针对 IntelliJ IDEA 等 IDE,`spring-boot-2` 下模块的语言级别应设置为 JDK 8,`spring-boot-3` 与 `spring-boot-4` 下模块的语言级别应设置为 JDK 17。
下文讨论不同情况下可能的测试流程,
-### Ubuntu 24.04
+### Ubuntu 26.04.1
假设 `SDKMAN!` 和 `Docker Engine` 已安装,在 Bash 执行如下命令,
diff --git a/config-samples/config-consul-sample/pom.xml b/config-samples/config-consul-sample/pom.xml
deleted file mode 100644
index e5d37b5c..00000000
--- a/config-samples/config-consul-sample/pom.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
- config-samples
- com.baomidou
- 1.0.0
-
- 4.0.0
-
- config-consul-sample
-
-
- Greenwich.SR2
-
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.cloud
- spring-cloud-starter-consul-config
- 3.0.4
-
-
- org.springdoc
- springdoc-openapi-ui
-
-
- com.baomidou
- dynamic-datasource-spring-boot-starter
-
-
- com.h2database
- h2
-
-
- org.projectlombok
- lombok
- provided
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
-
-
\ No newline at end of file
diff --git a/config-samples/config-nacos-sample/pom.xml b/config-samples/config-nacos-sample/pom.xml
deleted file mode 100644
index 33801e1c..00000000
--- a/config-samples/config-nacos-sample/pom.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
- config-samples
- com.baomidou
- 1.0.0
-
- 4.0.0
-
- config-nacos-sample
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- com.alibaba.boot
- nacos-config-spring-boot-starter
- 0.2.12
-
-
- org.springdoc
- springdoc-openapi-ui
-
-
- com.baomidou
- dynamic-datasource-spring-boot-starter
-
-
- com.h2database
- h2
-
-
- org.projectlombok
- lombok
- provided
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
-
-
\ No newline at end of file
diff --git a/config-samples/config-nacos-sample/src/main/resources/application.yml b/config-samples/config-nacos-sample/src/main/resources/application.yml
deleted file mode 100644
index 1fce72eb..00000000
--- a/config-samples/config-nacos-sample/src/main/resources/application.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-nacos:
- config:
- server-addr: 110.40.253.205:8848
\ No newline at end of file
diff --git a/config-samples/pom.xml b/config-samples/pom.xml
deleted file mode 100644
index bba32a1f..00000000
--- a/config-samples/pom.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- dynamic-datasource-samples
- com.baomidou
- 1.0.0
-
- 4.0.0
-
- config-samples
- pom
-
-
- config-nacos-sample
- config-consul-sample
-
-
-
\ No newline at end of file
diff --git a/datasource-samples/pom.xml b/datasource-samples/pom.xml
deleted file mode 100644
index 9dc6ca2a..00000000
--- a/datasource-samples/pom.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
- dynamic-datasource-samples
- com.baomidou
- 1.0.0
-
- 4.0.0
-
- datasource-samples
- pom
-
-
- druid-sample
-
-
\ No newline at end of file
diff --git a/features-samples/pom.xml b/features-samples/pom.xml
deleted file mode 100644
index d0192b83..00000000
--- a/features-samples/pom.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- dynamic-datasource-samples
- com.baomidou
- 1.0.0
-
-
- 4.0.0
-
- features-samples
- pom
-
-
- add-remove-datasource-sample
- load-datasource-from-jdbc-sample
- spel-sample
-
-
\ No newline at end of file
diff --git a/no-ds-samples/pom.xml b/no-ds-samples/pom.xml
deleted file mode 100644
index cdfc9a41..00000000
--- a/no-ds-samples/pom.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
- dynamic-datasource-samples
- com.baomidou
- 1.0.0
-
-
- 4.0.0
-
- no-ds-samples
- pom
-
-
- name-pattern-sample
-
-
\ No newline at end of file
diff --git a/orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/service/impl/UserServiceImpl.java b/orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/service/impl/UserServiceImpl.java
deleted file mode 100644
index 1ab11f4c..00000000
--- a/orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/service/impl/UserServiceImpl.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright © ${project.inceptionYear} organization baomidou
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.baomidou.samples.mybatisplus3.service.impl;
-
-
-import com.baomidou.dynamic.datasource.annotation.DS;
-import com.baomidou.dynamic.datasource.annotation.Slave;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.baomidou.samples.mybatisplus3.entity.User;
-import com.baomidou.samples.mybatisplus3.mapper.UserMapper;
-import com.baomidou.samples.mybatisplus3.service.UserService;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-public class UserServiceImpl extends ServiceImpl implements UserService {
-
- @Override
- public List selectMasterUsers() {
- return baseMapper.selectList(null);
- }
-
- @Override
- @DS("slave")
- public List selectSlaveUsers() {
- return baseMapper.selectList(null);
- }
-
- @Override
- public List selectLambdaMasterUsers() {
- return this.lambdaQuery().list();
- }
-
- @Override
- @DS("slave")
- public List selectLambdaSlaveUsers() {
- return this.lambdaQuery().list();
- }
-
- @Override
- @Slave
- public List selectSlaveAnnotationUsers() {
- return this.lambdaQuery().list();
- }
-
- @Override
- public void addUser(User user) {
- baseMapper.insert(user);
- }
-
- @Override
- public void deleteUserById(Long id) {
- baseMapper.deleteById(id);
- }
-}
diff --git a/orm-samples/pom.xml b/orm-samples/pom.xml
deleted file mode 100644
index 4415980c..00000000
--- a/orm-samples/pom.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
- dynamic-datasource-samples
- com.baomidou
- 1.0.0
-
-
- 4.0.0
-
- orm-samples
- pom
-
-
- beetlsql-sample
- jdbc-template-sample
- mybatis-sample
- mybatisplus3-sample
-
-
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index b77ca832..763261c1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,94 +12,17 @@
UTF-8
UTF-8
- 1.8
-
- 4.3.1
- 2.3.1
- 1.2.27
- 3.9.1
- 2.2.224
- 2.7.18
- 1.18.30
-
- 1.21.3
+
+ 17
+ 1.18.38
- orm-samples
- tx-samples
- config-samples
- datasource-samples
- no-ds-samples
- third-part-samples
- features-samples
- springboot3-sample
+ spring-boot-2
+ spring-boot-3
+ spring-boot-4
-
-
-
- com.baomidou
- dynamic-datasource-spring-boot-starter
- ${ds.version}
-
-
- com.baomidou
- dynamic-datasource-spring-boot3-starter
- ${ds.version}
-
-
- org.springframework.boot
- spring-boot-dependencies
- ${spring-boot-dependencies.version}
- pom
- import
-
-
- org.testcontainers
- testcontainers-bom
- ${testcontainers-bom.version}
- pom
- import
-
-
- org.springdoc
- springdoc-openapi-ui
- 1.7.0
-
-
- org.mybatis.spring.boot
- mybatis-spring-boot-starter
- ${mybatis-spring-boot-starter.version}
-
-
- com.alibaba
- druid
- ${druid.version}
-
-
- com.alibaba
- druid-spring-boot-starter
- ${druid.version}
-
-
- com.alibaba
- druid-spring-boot-3-starter
- ${druid.version}
-
-
- p6spy
- p6spy
- ${p6spy.version}
-
-
- com.h2database
- h2
- ${h2.version}
-
-
-
-
@@ -109,6 +32,10 @@
${java.version}
${java.version}
+
+ true
org.projectlombok
@@ -123,7 +50,7 @@
license-maven-plugin
4.2
-
+ ${maven.multiModuleProjectDirectory}/license.txt
src/main/java/**
src/test/java/**
@@ -139,4 +66,4 @@
-
\ No newline at end of file
+
diff --git a/spring-boot-2/pom.xml b/spring-boot-2/pom.xml
new file mode 100644
index 00000000..e9969860
--- /dev/null
+++ b/spring-boot-2/pom.xml
@@ -0,0 +1,83 @@
+
+
+ 4.0.0
+
+
+ com.baomidou
+ dynamic-datasource-samples
+ 1.0.0
+
+
+ spring-boot-2-samples
+ pom
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+ 4.5.0
+ 2.3.1
+ 1.2.27
+ 3.9.1
+ 2.2.224
+ 2.7.18
+ 1.18.38
+
+
+
+ shardingsphere-jdbc-4.x-spring-sample
+
+
+
+
+
+ com.baomidou
+ dynamic-datasource-spring-boot-starter
+ ${ds.version}
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot-dependencies.version}
+ pom
+ import
+
+
+ org.springdoc
+ springdoc-openapi-ui
+ 1.7.0
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ ${mybatis-spring-boot-starter.version}
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+ com.alibaba
+ druid-spring-boot-starter
+ ${druid.version}
+
+
+ p6spy
+ p6spy
+ ${p6spy.version}
+
+
+ com.h2database
+ h2
+ ${h2.version}
+
+
+
+
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/pom.xml b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/pom.xml
similarity index 84%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/pom.xml
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/pom.xml
index 29c9128e..5d100517 100644
--- a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/pom.xml
+++ b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/pom.xml
@@ -3,7 +3,7 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- shardingsphere-sample
+ spring-boot-2-samples
com.baomidou
1.0.0
@@ -13,8 +13,9 @@
4.1.1
-
-
+
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/ShardingSphereApplication.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/ShardingSphereApplication.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/ShardingSphereApplication.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/ShardingSphereApplication.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/config/MyDataSourceConfiguration.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/config/MyDataSourceConfiguration.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/config/MyDataSourceConfiguration.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/config/MyDataSourceConfiguration.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/controller/TOrderController.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/controller/TOrderController.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/controller/TOrderController.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/controller/TOrderController.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/controller/UserController.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/controller/UserController.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/controller/UserController.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/controller/UserController.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/dto/UserDto.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/dto/UserDto.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/dto/UserDto.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/dto/UserDto.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/entity/TOrder.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/entity/TOrder.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/entity/TOrder.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/entity/TOrder.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/entity/User.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/entity/User.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/entity/User.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/entity/User.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/mapper/TOrderMapper.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/mapper/TOrderMapper.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/mapper/TOrderMapper.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/mapper/TOrderMapper.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/mapper/UserMapper.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/mapper/UserMapper.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/mapper/UserMapper.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/mapper/UserMapper.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/TOrderService.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/TOrderService.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/TOrderService.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/TOrderService.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/UserService.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/UserService.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/UserService.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/UserService.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/impl/TOrderServiceImpl.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/impl/TOrderServiceImpl.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/impl/TOrderServiceImpl.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/impl/TOrderServiceImpl.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/impl/UserServiceImpl.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/impl/UserServiceImpl.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/impl/UserServiceImpl.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/service/impl/UserServiceImpl.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/resources/application.yml b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/resources/application.yml
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/resources/application.yml
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/resources/application.yml
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/resources/db/schema.sql b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/resources/db/schema.sql
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/main/resources/db/schema.sql
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/main/resources/db/schema.sql
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/ControllerLayerTests.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/ControllerLayerTests.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/ControllerLayerTests.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/ControllerLayerTests.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/MapperLayerTests.java b/spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/MapperLayerTests.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-4.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/MapperLayerTests.java
rename to spring-boot-2/shardingsphere-jdbc-4.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v4/spring/MapperLayerTests.java
diff --git a/spring-boot-3/pom.xml b/spring-boot-3/pom.xml
new file mode 100644
index 00000000..58c699de
--- /dev/null
+++ b/spring-boot-3/pom.xml
@@ -0,0 +1,69 @@
+
+
+ 4.0.0
+
+
+ com.baomidou
+ dynamic-datasource-samples
+ 1.0.0
+
+
+ spring-boot-3-samples
+ pom
+
+
+ UTF-8
+ UTF-8
+ 17
+
+ 4.5.0
+ 3.0.3
+ 1.2.28
+ 2.2.224
+ 3.5.6
+ 1.18.38
+
+
+
+ springboot3-sample
+
+
+
+
+
+ com.baomidou
+ dynamic-datasource-spring-boot3-starter
+ ${ds.version}
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot-dependencies.version}
+ pom
+ import
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ ${mybatis-spring-boot-starter.version}
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+ com.alibaba
+ druid-spring-boot-3-starter
+ ${druid.version}
+
+
+ com.h2database
+ h2
+ ${h2.version}
+
+
+
+
diff --git a/springboot3-sample/pom.xml b/spring-boot-3/springboot3-sample/pom.xml
similarity index 99%
rename from springboot3-sample/pom.xml
rename to spring-boot-3/springboot3-sample/pom.xml
index 44ec8d6b..913ec18b 100644
--- a/springboot3-sample/pom.xml
+++ b/spring-boot-3/springboot3-sample/pom.xml
@@ -5,7 +5,7 @@
4.0.0
com.baomidou
- dynamic-datasource-samples
+ spring-boot-3-samples
1.0.0
diff --git a/springboot3-sample/src/main/java/com/baomidou/sample/boot3/SpringBoot3Application.java b/spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/SpringBoot3Application.java
similarity index 100%
rename from springboot3-sample/src/main/java/com/baomidou/sample/boot3/SpringBoot3Application.java
rename to spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/SpringBoot3Application.java
diff --git a/springboot3-sample/src/main/java/com/baomidou/sample/boot3/config/MyBatisNativeConfiguration.java b/spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/config/MyBatisNativeConfiguration.java
similarity index 100%
rename from springboot3-sample/src/main/java/com/baomidou/sample/boot3/config/MyBatisNativeConfiguration.java
rename to spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/config/MyBatisNativeConfiguration.java
diff --git a/springboot3-sample/src/main/java/com/baomidou/sample/boot3/config/ProjectRuntimeHintRegister.java b/spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/config/ProjectRuntimeHintRegister.java
similarity index 100%
rename from springboot3-sample/src/main/java/com/baomidou/sample/boot3/config/ProjectRuntimeHintRegister.java
rename to spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/config/ProjectRuntimeHintRegister.java
diff --git a/springboot3-sample/src/main/java/com/baomidou/sample/boot3/controller/UserController.java b/spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/controller/UserController.java
similarity index 100%
rename from springboot3-sample/src/main/java/com/baomidou/sample/boot3/controller/UserController.java
rename to spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/controller/UserController.java
diff --git a/springboot3-sample/src/main/java/com/baomidou/sample/boot3/dto/UserDto.java b/spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/dto/UserDto.java
similarity index 100%
rename from springboot3-sample/src/main/java/com/baomidou/sample/boot3/dto/UserDto.java
rename to spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/dto/UserDto.java
diff --git a/springboot3-sample/src/main/java/com/baomidou/sample/boot3/entity/User.java b/spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/entity/User.java
similarity index 100%
rename from springboot3-sample/src/main/java/com/baomidou/sample/boot3/entity/User.java
rename to spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/entity/User.java
diff --git a/springboot3-sample/src/main/java/com/baomidou/sample/boot3/mapper/UserMapper.java b/spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/mapper/UserMapper.java
similarity index 100%
rename from springboot3-sample/src/main/java/com/baomidou/sample/boot3/mapper/UserMapper.java
rename to spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/mapper/UserMapper.java
diff --git a/springboot3-sample/src/main/java/com/baomidou/sample/boot3/service/UserService.java b/spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/service/UserService.java
similarity index 100%
rename from springboot3-sample/src/main/java/com/baomidou/sample/boot3/service/UserService.java
rename to spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/service/UserService.java
diff --git a/springboot3-sample/src/main/java/com/baomidou/sample/boot3/service/impl/UserServiceImpl.java b/spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/service/impl/UserServiceImpl.java
similarity index 100%
rename from springboot3-sample/src/main/java/com/baomidou/sample/boot3/service/impl/UserServiceImpl.java
rename to spring-boot-3/springboot3-sample/src/main/java/com/baomidou/sample/boot3/service/impl/UserServiceImpl.java
diff --git a/springboot3-sample/src/main/resources/application.yml b/spring-boot-3/springboot3-sample/src/main/resources/application.yml
similarity index 100%
rename from springboot3-sample/src/main/resources/application.yml
rename to spring-boot-3/springboot3-sample/src/main/resources/application.yml
diff --git a/no-ds-samples/name-pattern-sample/src/main/resources/db/schema.sql b/spring-boot-3/springboot3-sample/src/main/resources/db/schema.sql
similarity index 100%
rename from no-ds-samples/name-pattern-sample/src/main/resources/db/schema.sql
rename to spring-boot-3/springboot3-sample/src/main/resources/db/schema.sql
diff --git a/features-samples/add-remove-datasource-sample/pom.xml b/spring-boot-4/add-remove-datasource-sample/pom.xml
similarity index 81%
rename from features-samples/add-remove-datasource-sample/pom.xml
rename to spring-boot-4/add-remove-datasource-sample/pom.xml
index 567d3219..b7edbae3 100644
--- a/features-samples/add-remove-datasource-sample/pom.xml
+++ b/spring-boot-4/add-remove-datasource-sample/pom.xml
@@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
com.baomidou
- features-samples
+ spring-boot-4-samples
1.0.0
4.0.0
@@ -14,7 +14,7 @@
com.alibaba
- druid-spring-boot-starter
+ druid-spring-boot-4-starter
com.github.chris2018998
@@ -36,11 +36,15 @@
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
com.h2database
diff --git a/features-samples/add-remove-datasource-sample/src/main/java/com/baomidou/samples/ds/AddRemoveDsApplication.java b/spring-boot-4/add-remove-datasource-sample/src/main/java/com/baomidou/samples/ds/AddRemoveDsApplication.java
similarity index 100%
rename from features-samples/add-remove-datasource-sample/src/main/java/com/baomidou/samples/ds/AddRemoveDsApplication.java
rename to spring-boot-4/add-remove-datasource-sample/src/main/java/com/baomidou/samples/ds/AddRemoveDsApplication.java
diff --git a/features-samples/add-remove-datasource-sample/src/main/java/com/baomidou/samples/ds/controller/DataSourceController.java b/spring-boot-4/add-remove-datasource-sample/src/main/java/com/baomidou/samples/ds/controller/DataSourceController.java
similarity index 100%
rename from features-samples/add-remove-datasource-sample/src/main/java/com/baomidou/samples/ds/controller/DataSourceController.java
rename to spring-boot-4/add-remove-datasource-sample/src/main/java/com/baomidou/samples/ds/controller/DataSourceController.java
diff --git a/features-samples/add-remove-datasource-sample/src/main/java/com/baomidou/samples/ds/dto/DataSourceDTO.java b/spring-boot-4/add-remove-datasource-sample/src/main/java/com/baomidou/samples/ds/dto/DataSourceDTO.java
similarity index 100%
rename from features-samples/add-remove-datasource-sample/src/main/java/com/baomidou/samples/ds/dto/DataSourceDTO.java
rename to spring-boot-4/add-remove-datasource-sample/src/main/java/com/baomidou/samples/ds/dto/DataSourceDTO.java
diff --git a/features-samples/add-remove-datasource-sample/src/main/resources/application.yml b/spring-boot-4/add-remove-datasource-sample/src/main/resources/application.yml
similarity index 100%
rename from features-samples/add-remove-datasource-sample/src/main/resources/application.yml
rename to spring-boot-4/add-remove-datasource-sample/src/main/resources/application.yml
diff --git a/spring-boot-4/add-remove-datasource-sample/src/test/java/com/baomidou/samples/ds/test/DataSourceControllerTest.java b/spring-boot-4/add-remove-datasource-sample/src/test/java/com/baomidou/samples/ds/test/DataSourceControllerTest.java
new file mode 100644
index 00000000..2553567a
--- /dev/null
+++ b/spring-boot-4/add-remove-datasource-sample/src/test/java/com/baomidou/samples/ds/test/DataSourceControllerTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright © ${project.inceptionYear} organization baomidou
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.samples.ds.test;
+
+import com.baomidou.samples.ds.controller.DataSourceController;
+import com.baomidou.samples.ds.dto.DataSourceDTO;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+class DataSourceControllerTest {
+
+ @Autowired
+ private DataSourceController dataSourceController;
+
+ @Test
+ void addAndRemoveDatasource() {
+ assertThat(dataSourceController.now()).doesNotContain("test_runtime");
+
+ DataSourceDTO dto = new DataSourceDTO();
+ dto.setPoolName("test_runtime");
+ dto.setDriverClassName("org.h2.Driver");
+ dto.setUrl("jdbc:h2:mem:test_runtime");
+ dto.setUsername("sa");
+ dto.setPassword("");
+ assertThat(dataSourceController.add(dto)).contains("test_runtime");
+
+ assertThat(dataSourceController.remove("test_runtime")).isNotNull();
+ assertThat(dataSourceController.now()).doesNotContain("test_runtime");
+ }
+}
diff --git a/orm-samples/beetlsql-sample/pom.xml b/spring-boot-4/beetlsql-sample/pom.xml
similarity index 83%
rename from orm-samples/beetlsql-sample/pom.xml
rename to spring-boot-4/beetlsql-sample/pom.xml
index 25304a00..6e5a781b 100644
--- a/orm-samples/beetlsql-sample/pom.xml
+++ b/spring-boot-4/beetlsql-sample/pom.xml
@@ -3,7 +3,7 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- orm-samples
+ spring-boot-4-samples
com.baomidou
1.0.0
@@ -22,16 +22,16 @@
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
com.ibeetl
- sql-springboot-starter
- 3.19.0-RELEASE
+ sql-springboot4-starter
+ 3.40.0-RELEASE
com.h2database
diff --git a/orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/BeetlApplication.java b/spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/BeetlApplication.java
similarity index 100%
rename from orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/BeetlApplication.java
rename to spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/BeetlApplication.java
diff --git a/orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/controller/UserController.java b/spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/controller/UserController.java
similarity index 100%
rename from orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/controller/UserController.java
rename to spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/controller/UserController.java
diff --git a/orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/dao/UserDao.java b/spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/dao/UserDao.java
similarity index 100%
rename from orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/dao/UserDao.java
rename to spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/dao/UserDao.java
diff --git a/orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/dto/UserDto.java b/spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/dto/UserDto.java
similarity index 100%
rename from orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/dto/UserDto.java
rename to spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/dto/UserDto.java
diff --git a/orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/entity/User.java b/spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/entity/User.java
similarity index 100%
rename from orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/entity/User.java
rename to spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/entity/User.java
diff --git a/orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/service/UserService.java b/spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/service/UserService.java
similarity index 100%
rename from orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/service/UserService.java
rename to spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/service/UserService.java
diff --git a/orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/service/impl/UserServiceImpl.java b/spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/service/impl/UserServiceImpl.java
similarity index 100%
rename from orm-samples/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/service/impl/UserServiceImpl.java
rename to spring-boot-4/beetlsql-sample/src/main/java/com/baomidou/samples/beetl/service/impl/UserServiceImpl.java
diff --git a/orm-samples/beetlsql-sample/src/main/resources/application.yml b/spring-boot-4/beetlsql-sample/src/main/resources/application.yml
similarity index 100%
rename from orm-samples/beetlsql-sample/src/main/resources/application.yml
rename to spring-boot-4/beetlsql-sample/src/main/resources/application.yml
diff --git a/orm-samples/beetlsql-sample/src/main/resources/db/schema.sql b/spring-boot-4/beetlsql-sample/src/main/resources/db/schema.sql
similarity index 100%
rename from orm-samples/beetlsql-sample/src/main/resources/db/schema.sql
rename to spring-boot-4/beetlsql-sample/src/main/resources/db/schema.sql
diff --git a/spring-boot-4/beetlsql-sample/src/test/java/com/baomidou/samples/beetl/test/UserServiceTest.java b/spring-boot-4/beetlsql-sample/src/test/java/com/baomidou/samples/beetl/test/UserServiceTest.java
new file mode 100644
index 00000000..000d4cf0
--- /dev/null
+++ b/spring-boot-4/beetlsql-sample/src/test/java/com/baomidou/samples/beetl/test/UserServiceTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright © ${project.inceptionYear} organization baomidou
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.samples.beetl.test;
+
+import com.baomidou.samples.beetl.entity.User;
+import com.baomidou.samples.beetl.service.UserService;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+class UserServiceTest {
+
+ @Autowired
+ private UserService userService;
+
+ @AfterEach
+ void cleanUp() {
+ userService.selectMasterUsers().forEach(user -> userService.deleteUserById(user.getId().longValue()));
+ }
+
+ @Test
+ void crudAcrossMasterAndSlave() {
+ User user = new User();
+ user.setName("Beetl");
+ user.setAge(20);
+ userService.addUser(user);
+
+ assertThat(userService.selectMasterUsers()).isNotEmpty();
+ assertThat(userService.selectSlaveUsers()).isNotEmpty();
+ assertThat(userService.selectSlaveAnnotationUsers()).isNotEmpty();
+
+ userService.deleteUserById(userService.selectMasterUsers().get(0).getId().longValue());
+ assertThat(userService.selectMasterUsers()).isEmpty();
+ }
+}
diff --git a/spring-boot-4/config-consul-sample/pom.xml b/spring-boot-4/config-consul-sample/pom.xml
new file mode 100644
index 00000000..20a5ff74
--- /dev/null
+++ b/spring-boot-4/config-consul-sample/pom.xml
@@ -0,0 +1,65 @@
+
+
+
+ spring-boot-4-samples
+ com.baomidou
+ 1.0.0
+
+ 4.0.0
+
+ config-consul-sample
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.cloud
+ spring-cloud-starter-consul-config
+
+
+ org.springframework.cloud
+ spring-cloud-starter-bootstrap
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+
+
+ com.baomidou
+ dynamic-datasource-spring-boot4-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+ com.h2database
+ h2
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.testcontainers
+ testcontainers-junit-jupiter
+ test
+
+
+ org.testcontainers
+ testcontainers-consul
+ test
+
+
+
+
\ No newline at end of file
diff --git a/config-samples/config-consul-sample/src/main/java/com/baomidou/samples/consul/ConsulApplication.java b/spring-boot-4/config-consul-sample/src/main/java/com/baomidou/samples/consul/ConsulApplication.java
similarity index 100%
rename from config-samples/config-consul-sample/src/main/java/com/baomidou/samples/consul/ConsulApplication.java
rename to spring-boot-4/config-consul-sample/src/main/java/com/baomidou/samples/consul/ConsulApplication.java
diff --git a/config-samples/config-consul-sample/src/main/java/com/baomidou/samples/consul/controller/DataSourceController.java b/spring-boot-4/config-consul-sample/src/main/java/com/baomidou/samples/consul/controller/DataSourceController.java
similarity index 100%
rename from config-samples/config-consul-sample/src/main/java/com/baomidou/samples/consul/controller/DataSourceController.java
rename to spring-boot-4/config-consul-sample/src/main/java/com/baomidou/samples/consul/controller/DataSourceController.java
diff --git a/config-samples/config-consul-sample/src/main/resources/application.yml b/spring-boot-4/config-consul-sample/src/main/resources/application.yml
similarity index 100%
rename from config-samples/config-consul-sample/src/main/resources/application.yml
rename to spring-boot-4/config-consul-sample/src/main/resources/application.yml
diff --git a/config-samples/config-consul-sample/src/main/resources/bootstrap.yml b/spring-boot-4/config-consul-sample/src/main/resources/bootstrap.yml
similarity index 100%
rename from config-samples/config-consul-sample/src/main/resources/bootstrap.yml
rename to spring-boot-4/config-consul-sample/src/main/resources/bootstrap.yml
diff --git a/spring-boot-4/config-consul-sample/src/test/java/com/baomidou/samples/consul/test/ConsulSampleTest.java b/spring-boot-4/config-consul-sample/src/test/java/com/baomidou/samples/consul/test/ConsulSampleTest.java
new file mode 100644
index 00000000..d688fdf3
--- /dev/null
+++ b/spring-boot-4/config-consul-sample/src/test/java/com/baomidou/samples/consul/test/ConsulSampleTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright © ${project.inceptionYear} organization baomidou
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.samples.consul.test;
+
+import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.testcontainers.consul.ConsulContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+import org.testcontainers.utility.DockerImageName;
+
+import javax.sql.DataSource;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@Testcontainers
+@SpringBootTest
+class ConsulSampleTest {
+
+ @Container
+ static ConsulContainer consul = new ConsulContainer(DockerImageName.parse("hashicorp/consul:1.15"));
+
+ @BeforeAll
+ static void setUp() throws Exception {
+ String yaml = "spring:\n"
+ + " datasource:\n"
+ + " dynamic:\n"
+ + " datasource:\n"
+ + " master:\n"
+ + " driver-class-name: org.h2.Driver\n"
+ + " url: jdbc:h2:mem:consul_master\n"
+ + " username: sa\n"
+ + " password: \"\"\n";
+ String baseUrl = "http://" + consul.getHost() + ":" + consul.getMappedPort(8500);
+ HttpRequest request = HttpRequest.newBuilder(URI.create(baseUrl + "/v1/kv/dynamic-datasource/application/data"))
+ .PUT(HttpRequest.BodyPublishers.ofString(yaml))
+ .build();
+ HttpResponse response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
+ assertThat(response.statusCode()).isEqualTo(200);
+ // 这里用系统属性而不用 @DynamicPropertySource,这样 Spring Cloud bootstrap 上下文也能读到这些值。
+ System.setProperty("spring.cloud.consul.host", consul.getHost());
+ System.setProperty("spring.cloud.consul.port", String.valueOf(consul.getMappedPort(8500)));
+ }
+
+ @AfterAll
+ static void tearDown() {
+ System.clearProperty("spring.cloud.consul.host");
+ System.clearProperty("spring.cloud.consul.port");
+ }
+
+ @Autowired
+ private DataSource dataSource;
+
+ @Test
+ void datasourceConfigLoadedFromConsul() {
+ DynamicRoutingDataSource routingDataSource = (DynamicRoutingDataSource) dataSource;
+ assertThat(routingDataSource.getDataSources().keySet()).contains("master");
+ }
+}
diff --git a/spring-boot-4/config-nacos-sample/pom.xml b/spring-boot-4/config-nacos-sample/pom.xml
new file mode 100644
index 00000000..0d61a1f2
--- /dev/null
+++ b/spring-boot-4/config-nacos-sample/pom.xml
@@ -0,0 +1,61 @@
+
+
+
+ spring-boot-4-samples
+ com.baomidou
+ 1.0.0
+
+ 4.0.0
+
+ config-nacos-sample
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.alibaba.cloud
+ spring-alibaba-nacos-config
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+
+
+ com.baomidou
+ dynamic-datasource-spring-boot4-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+ com.h2database
+ h2
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.testcontainers
+ testcontainers-junit-jupiter
+ test
+
+
+ org.testcontainers
+ testcontainers
+ test
+
+
+
+
\ No newline at end of file
diff --git a/config-samples/config-nacos-sample/src/main/java/com/baomidou/samples/nacos/NacosApplication.java b/spring-boot-4/config-nacos-sample/src/main/java/com/baomidou/samples/nacos/NacosApplication.java
similarity index 78%
rename from config-samples/config-nacos-sample/src/main/java/com/baomidou/samples/nacos/NacosApplication.java
rename to spring-boot-4/config-nacos-sample/src/main/java/com/baomidou/samples/nacos/NacosApplication.java
index d2ace6f6..8bdd5294 100644
--- a/config-samples/config-nacos-sample/src/main/java/com/baomidou/samples/nacos/NacosApplication.java
+++ b/spring-boot-4/config-nacos-sample/src/main/java/com/baomidou/samples/nacos/NacosApplication.java
@@ -15,20 +15,16 @@
*/
package com.baomidou.samples.nacos;
-import com.alibaba.nacos.api.config.ConfigType;
-import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@Slf4j
@SpringBootApplication
-@NacosPropertySource(dataId = "dynamic-datasource", type = ConfigType.YAML)
public class NacosApplication {
public static void main(String[] args) {
- log.info("nacos暂不支持最新版springboot 测试自行降级到2.3.12.RELEASE");
SpringApplication.run(NacosApplication.class, args);
log.info("open http://localhost:8080/swagger-ui.html");
}
-}
\ No newline at end of file
+}
diff --git a/config-samples/config-nacos-sample/src/main/java/com/baomidou/samples/nacos/controller/DataSourceController.java b/spring-boot-4/config-nacos-sample/src/main/java/com/baomidou/samples/nacos/controller/DataSourceController.java
similarity index 100%
rename from config-samples/config-nacos-sample/src/main/java/com/baomidou/samples/nacos/controller/DataSourceController.java
rename to spring-boot-4/config-nacos-sample/src/main/java/com/baomidou/samples/nacos/controller/DataSourceController.java
diff --git a/spring-boot-4/config-nacos-sample/src/main/resources/application.yml b/spring-boot-4/config-nacos-sample/src/main/resources/application.yml
new file mode 100644
index 00000000..b492c796
--- /dev/null
+++ b/spring-boot-4/config-nacos-sample/src/main/resources/application.yml
@@ -0,0 +1,10 @@
+spring:
+ application:
+ name: dynamic-datasource-nacos-sample
+ # 按 https://nacos.io/docs/latest/ecology/use-nacos-with-spring-boot3/ 的官方用法,
+ # 通过 spring.config.import 把 Nacos 上的配置作为属性源(无需 bootstrap 依赖)。
+ config:
+ import: nacos:dynamic-datasource.yaml?group=DEFAULT_GROUP
+ nacos:
+ config:
+ server-addr: 127.0.0.1:8848
diff --git a/spring-boot-4/config-nacos-sample/src/test/java/com/baomidou/samples/nacos/test/NacosSampleTest.java b/spring-boot-4/config-nacos-sample/src/test/java/com/baomidou/samples/nacos/test/NacosSampleTest.java
new file mode 100644
index 00000000..c74b3b8d
--- /dev/null
+++ b/spring-boot-4/config-nacos-sample/src/test/java/com/baomidou/samples/nacos/test/NacosSampleTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright © ${project.inceptionYear} organization baomidou
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.samples.nacos.test;
+
+import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+import org.testcontainers.utility.DockerImageName;
+
+import javax.sql.DataSource;
+import java.net.URI;
+import java.net.URLEncoder;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.charset.StandardCharsets;
+import java.time.Duration;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@Testcontainers
+@SpringBootTest
+class NacosSampleTest {
+
+ // 按 https://nacos.io/docs/latest/ecology/use-nacos-with-spring-boot3/ 的官方用法,
+ // Spring Boot 4 通过 com.alibaba.cloud:spring-alibaba-nacos-config + spring.config.import 接入,
+ // 测试服务端用同代的 Nacos 3.x。Nacos 3.x 的 HTTP 客户端 API 只读不写,
+ // 发布配置要走运维 API,且运维 API 自带独立鉴权开关,测试里一并关闭。
+ @Container
+ static GenericContainer> nacos = new GenericContainer<>(DockerImageName.parse("nacos/nacos-server:v3.2.4"))
+ .withEnv("MODE", "standalone")
+ .withEnv("NACOS_AUTH_ENABLE", "false")
+ .withEnv("NACOS_AUTH_ADMIN_ENABLE", "false")
+ .withEnv("NACOS_AUTH_CONSOLE_ENABLE", "false")
+ .withEnv("NACOS_AUTH_TOKEN", "MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY=")
+ .withEnv("NACOS_AUTH_IDENTITY_KEY", "serverIdentity")
+ .withEnv("NACOS_AUTH_IDENTITY_VALUE", "security")
+ .withExposedPorts(8848, 9848, 9849)
+ .waitingFor(Wait.forLogMessage(".*Nacos Server API started successfully.*", 1)
+ .withStartupTimeout(Duration.ofMinutes(5)));
+
+ @BeforeAll
+ static void setUp() throws Exception {
+ // spring.config.import 在环境准备的最早期求值,地址只能用系统属性覆盖。
+ System.setProperty("spring.nacos.config.server-addr",
+ nacos.getHost() + ":" + nacos.getMappedPort(8848));
+ // 3.x 客户端按(http 端口 + 偏移量)计算服务端的 gRPC 端口;
+ // testcontainers 的随机端口映射下默认的 1000 偏移不再成立,因此按实际映射端口动态计算偏移。
+ int offset = nacos.getMappedPort(9848) - nacos.getMappedPort(8848);
+ System.setProperty("nacos.server.grpc.port.offset", String.valueOf(offset));
+ publishConfig();
+ }
+
+ @AfterAll
+ static void tearDown() {
+ System.clearProperty("spring.nacos.config.server-addr");
+ System.clearProperty("nacos.server.grpc.port.offset");
+ }
+
+ static void publishConfig() throws Exception {
+ String yaml = "spring:\n"
+ + " datasource:\n"
+ + " dynamic:\n"
+ + " datasource:\n"
+ + " master:\n"
+ + " driver-class-name: org.h2.Driver\n"
+ + " url: jdbc:h2:mem:nacos_master\n"
+ + " username: sa\n"
+ + " password: \"\"\n";
+ String baseUrl = "http://" + nacos.getHost() + ":" + nacos.getMappedPort(8848);
+ String body = "dataId=dynamic-datasource.yaml&groupName=DEFAULT_GROUP&type=yaml&content="
+ + URLEncoder.encode(yaml, StandardCharsets.UTF_8);
+ HttpRequest request = HttpRequest.newBuilder(URI.create(baseUrl + "/nacos/v3/admin/cs/config"))
+ .header("Content-Type", "application/x-www-form-urlencoded")
+ .POST(HttpRequest.BodyPublishers.ofString(body))
+ .build();
+ HttpClient client = HttpClient.newHttpClient();
+ HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
+ assertThat(response.statusCode()).isEqualTo(200);
+ assertThat(response.body()).contains("\"data\":true");
+ // 发布后服务端内部同步需要一点时间,先等到配置可读再启动 Spring 上下文。
+ HttpRequest query = HttpRequest.newBuilder(
+ URI.create(baseUrl + "/nacos/v3/client/cs/config?dataId=dynamic-datasource.yaml&groupName=DEFAULT_GROUP"))
+ .GET()
+ .build();
+ boolean visible = false;
+ for (int i = 0; i < 60 && !visible; i++) {
+ HttpResponse queryResponse = client.send(query, HttpResponse.BodyHandlers.ofString());
+ visible = queryResponse.statusCode() == 200 && queryResponse.body().contains("jdbc:h2:mem:nacos_master");
+ if (!visible) {
+ Thread.sleep(1000);
+ }
+ }
+ assertThat(visible).isTrue();
+ }
+
+ @Autowired
+ private DataSource dataSource;
+
+ @Test
+ void datasourceConfigLoadedFromNacos() {
+ DynamicRoutingDataSource routingDataSource = (DynamicRoutingDataSource) dataSource;
+ assertThat(routingDataSource.getDataSources().keySet()).contains("master");
+ }
+}
diff --git a/datasource-samples/druid-sample/pom.xml b/spring-boot-4/druid-sample/pom.xml
similarity index 87%
rename from datasource-samples/druid-sample/pom.xml
rename to spring-boot-4/druid-sample/pom.xml
index bb0e7cc2..119103f2 100644
--- a/datasource-samples/druid-sample/pom.xml
+++ b/spring-boot-4/druid-sample/pom.xml
@@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
com.baomidou
- datasource-samples
+ spring-boot-4-samples
1.0.0
4.0.0
@@ -22,15 +22,15 @@
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
com.alibaba
- druid-spring-boot-starter
+ druid-spring-boot-4-starter
org.mybatis.spring.boot
diff --git a/datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/DruidApplication.java b/spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/DruidApplication.java
similarity index 100%
rename from datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/DruidApplication.java
rename to spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/DruidApplication.java
diff --git a/datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/controller/UserController.java b/spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/controller/UserController.java
similarity index 100%
rename from datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/controller/UserController.java
rename to spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/controller/UserController.java
diff --git a/datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/dto/UserDto.java b/spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/dto/UserDto.java
similarity index 100%
rename from datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/dto/UserDto.java
rename to spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/dto/UserDto.java
diff --git a/datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/entity/User.java b/spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/entity/User.java
similarity index 100%
rename from datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/entity/User.java
rename to spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/entity/User.java
diff --git a/datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/filters/Filter1.java b/spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/filters/Filter1.java
similarity index 100%
rename from datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/filters/Filter1.java
rename to spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/filters/Filter1.java
diff --git a/datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/filters/Filter2.java b/spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/filters/Filter2.java
similarity index 100%
rename from datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/filters/Filter2.java
rename to spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/filters/Filter2.java
diff --git a/datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/mapper/UserMapper.java b/spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/mapper/UserMapper.java
similarity index 100%
rename from datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/mapper/UserMapper.java
rename to spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/mapper/UserMapper.java
diff --git a/datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/service/UserService.java b/spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/service/UserService.java
similarity index 100%
rename from datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/service/UserService.java
rename to spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/service/UserService.java
diff --git a/datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/service/impl/UserServiceImpl.java b/spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/service/impl/UserServiceImpl.java
similarity index 100%
rename from datasource-samples/druid-sample/src/main/java/com/baomidou/samples/druid/service/impl/UserServiceImpl.java
rename to spring-boot-4/druid-sample/src/main/java/com/baomidou/samples/druid/service/impl/UserServiceImpl.java
diff --git a/datasource-samples/druid-sample/src/main/resources/application.yml b/spring-boot-4/druid-sample/src/main/resources/application.yml
similarity index 100%
rename from datasource-samples/druid-sample/src/main/resources/application.yml
rename to spring-boot-4/druid-sample/src/main/resources/application.yml
diff --git a/datasource-samples/druid-sample/src/main/resources/db/schema.sql b/spring-boot-4/druid-sample/src/main/resources/db/schema.sql
similarity index 100%
rename from datasource-samples/druid-sample/src/main/resources/db/schema.sql
rename to spring-boot-4/druid-sample/src/main/resources/db/schema.sql
diff --git a/datasource-samples/druid-sample/src/main/resources/spy.properties b/spring-boot-4/druid-sample/src/main/resources/spy.properties
similarity index 100%
rename from datasource-samples/druid-sample/src/main/resources/spy.properties
rename to spring-boot-4/druid-sample/src/main/resources/spy.properties
diff --git a/datasource-samples/druid-sample/src/test/java/com/baomidou/samples/druid/test/DruidApplicationTest.java b/spring-boot-4/druid-sample/src/test/java/com/baomidou/samples/druid/test/DruidApplicationTest.java
similarity index 100%
rename from datasource-samples/druid-sample/src/test/java/com/baomidou/samples/druid/test/DruidApplicationTest.java
rename to spring-boot-4/druid-sample/src/test/java/com/baomidou/samples/druid/test/DruidApplicationTest.java
diff --git a/orm-samples/jdbc-template-sample/pom.xml b/spring-boot-4/jdbc-template-sample/pom.xml
similarity index 89%
rename from orm-samples/jdbc-template-sample/pom.xml
rename to spring-boot-4/jdbc-template-sample/pom.xml
index 3b52fbe6..5e229302 100644
--- a/orm-samples/jdbc-template-sample/pom.xml
+++ b/spring-boot-4/jdbc-template-sample/pom.xml
@@ -3,7 +3,7 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- orm-samples
+ spring-boot-4-samples
com.baomidou
1.0.0
@@ -22,11 +22,11 @@
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
org.springframework.boot
diff --git a/orm-samples/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/JdbcTemplateApplication.java b/spring-boot-4/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/JdbcTemplateApplication.java
similarity index 100%
rename from orm-samples/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/JdbcTemplateApplication.java
rename to spring-boot-4/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/JdbcTemplateApplication.java
diff --git a/orm-samples/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/controller/UserController.java b/spring-boot-4/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/controller/UserController.java
similarity index 100%
rename from orm-samples/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/controller/UserController.java
rename to spring-boot-4/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/controller/UserController.java
diff --git a/orm-samples/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/dto/UserDto.java b/spring-boot-4/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/dto/UserDto.java
similarity index 100%
rename from orm-samples/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/dto/UserDto.java
rename to spring-boot-4/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/dto/UserDto.java
diff --git a/orm-samples/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/entity/User.java b/spring-boot-4/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/entity/User.java
similarity index 100%
rename from orm-samples/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/entity/User.java
rename to spring-boot-4/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/entity/User.java
diff --git a/orm-samples/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/service/UserService.java b/spring-boot-4/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/service/UserService.java
similarity index 100%
rename from orm-samples/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/service/UserService.java
rename to spring-boot-4/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/service/UserService.java
diff --git a/orm-samples/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/service/impl/UserServiceImpl.java b/spring-boot-4/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/service/impl/UserServiceImpl.java
similarity index 100%
rename from orm-samples/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/service/impl/UserServiceImpl.java
rename to spring-boot-4/jdbc-template-sample/src/main/java/com/baomidou/samples/jdbc/service/impl/UserServiceImpl.java
diff --git a/no-ds-samples/name-pattern-sample/src/main/resources/application.yml b/spring-boot-4/jdbc-template-sample/src/main/resources/application.yml
similarity index 100%
rename from no-ds-samples/name-pattern-sample/src/main/resources/application.yml
rename to spring-boot-4/jdbc-template-sample/src/main/resources/application.yml
diff --git a/orm-samples/jdbc-template-sample/src/main/resources/db/schema.sql b/spring-boot-4/jdbc-template-sample/src/main/resources/db/schema.sql
similarity index 100%
rename from orm-samples/jdbc-template-sample/src/main/resources/db/schema.sql
rename to spring-boot-4/jdbc-template-sample/src/main/resources/db/schema.sql
diff --git a/spring-boot-4/jdbc-template-sample/src/test/java/com/baomidou/samples/jdbc/test/UserServiceTest.java b/spring-boot-4/jdbc-template-sample/src/test/java/com/baomidou/samples/jdbc/test/UserServiceTest.java
new file mode 100644
index 00000000..0acc6542
--- /dev/null
+++ b/spring-boot-4/jdbc-template-sample/src/test/java/com/baomidou/samples/jdbc/test/UserServiceTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright © ${project.inceptionYear} organization baomidou
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.samples.jdbc.test;
+
+import com.baomidou.samples.jdbc.entity.User;
+import com.baomidou.samples.jdbc.service.UserService;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+class UserServiceTest {
+
+ @Autowired
+ private UserService userService;
+
+ @AfterEach
+ void cleanUp() {
+ userService.selectMasterUsers().forEach(user -> userService.deleteUserById(user.getId().longValue()));
+ }
+
+ @Test
+ void crudAcrossMasterAndSlave() {
+ User user = new User();
+ user.setName("JdbcTemplate");
+ user.setAge(21);
+ userService.addUser(user);
+
+ assertThat(userService.selectMasterUsers()).isNotEmpty();
+ assertThat(userService.selectSlaveUsers()).isNotEmpty();
+
+ userService.deleteUserById(userService.selectMasterUsers().get(0).getId().longValue());
+ assertThat(userService.selectMasterUsers()).isEmpty();
+ }
+}
diff --git a/features-samples/load-datasource-from-jdbc-sample/pom.xml b/spring-boot-4/load-datasource-from-jdbc-sample/pom.xml
similarity index 81%
rename from features-samples/load-datasource-from-jdbc-sample/pom.xml
rename to spring-boot-4/load-datasource-from-jdbc-sample/pom.xml
index 6e84ef1a..1e39004f 100644
--- a/features-samples/load-datasource-from-jdbc-sample/pom.xml
+++ b/spring-boot-4/load-datasource-from-jdbc-sample/pom.xml
@@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
com.baomidou
- features-samples
+ spring-boot-4-samples
1.0.0
4.0.0
@@ -26,11 +26,15 @@
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
com.h2database
diff --git a/features-samples/load-datasource-from-jdbc-sample/src/main/java/com/baomidou/samples/load/LoadDsApplication.java b/spring-boot-4/load-datasource-from-jdbc-sample/src/main/java/com/baomidou/samples/load/LoadDsApplication.java
similarity index 100%
rename from features-samples/load-datasource-from-jdbc-sample/src/main/java/com/baomidou/samples/load/LoadDsApplication.java
rename to spring-boot-4/load-datasource-from-jdbc-sample/src/main/java/com/baomidou/samples/load/LoadDsApplication.java
diff --git a/features-samples/load-datasource-from-jdbc-sample/src/main/resources/application.yml b/spring-boot-4/load-datasource-from-jdbc-sample/src/main/resources/application.yml
similarity index 100%
rename from features-samples/load-datasource-from-jdbc-sample/src/main/resources/application.yml
rename to spring-boot-4/load-datasource-from-jdbc-sample/src/main/resources/application.yml
diff --git a/spring-boot-4/load-datasource-from-jdbc-sample/src/test/java/com/baomidou/samples/load/test/LoadDsApplicationTest.java b/spring-boot-4/load-datasource-from-jdbc-sample/src/test/java/com/baomidou/samples/load/test/LoadDsApplicationTest.java
new file mode 100644
index 00000000..bbe1ebf0
--- /dev/null
+++ b/spring-boot-4/load-datasource-from-jdbc-sample/src/test/java/com/baomidou/samples/load/test/LoadDsApplicationTest.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright © ${project.inceptionYear} organization baomidou
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.samples.load.test;
+
+import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import javax.sql.DataSource;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+class LoadDsApplicationTest {
+
+ @Autowired
+ private DataSource dataSource;
+
+ @Test
+ void datasourcesLoadedFromJdbc() {
+ DynamicRoutingDataSource routingDataSource = (DynamicRoutingDataSource) dataSource;
+ assertThat(routingDataSource.getDataSources().keySet()).contains("db1", "db2", "db3");
+ }
+}
diff --git a/orm-samples/mybatis-sample/pom.xml b/spring-boot-4/mybatis-sample/pom.xml
similarity index 89%
rename from orm-samples/mybatis-sample/pom.xml
rename to spring-boot-4/mybatis-sample/pom.xml
index 603dd2a0..7546fba2 100644
--- a/orm-samples/mybatis-sample/pom.xml
+++ b/spring-boot-4/mybatis-sample/pom.xml
@@ -3,7 +3,7 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- orm-samples
+ spring-boot-4-samples
com.baomidou
1.0.0
@@ -22,11 +22,11 @@
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
org.mybatis.spring.boot
diff --git a/orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/MybatisApplication.java b/spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/MybatisApplication.java
similarity index 100%
rename from orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/MybatisApplication.java
rename to spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/MybatisApplication.java
diff --git a/orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/controller/UserController.java b/spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/controller/UserController.java
similarity index 100%
rename from orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/controller/UserController.java
rename to spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/controller/UserController.java
diff --git a/orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/dto/UserDto.java b/spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/dto/UserDto.java
similarity index 100%
rename from orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/dto/UserDto.java
rename to spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/dto/UserDto.java
diff --git a/orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/entity/User.java b/spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/entity/User.java
similarity index 100%
rename from orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/entity/User.java
rename to spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/entity/User.java
diff --git a/orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/mapper/UserMapper.java b/spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/mapper/UserMapper.java
similarity index 100%
rename from orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/mapper/UserMapper.java
rename to spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/mapper/UserMapper.java
diff --git a/orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/service/UserService.java b/spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/service/UserService.java
similarity index 100%
rename from orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/service/UserService.java
rename to spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/service/UserService.java
diff --git a/orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/service/impl/UserServiceImpl.java b/spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/service/impl/UserServiceImpl.java
similarity index 100%
rename from orm-samples/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/service/impl/UserServiceImpl.java
rename to spring-boot-4/mybatis-sample/src/main/java/com/baomidou/samples/mybatis/service/impl/UserServiceImpl.java
diff --git a/orm-samples/mybatis-sample/src/main/resources/application.yml b/spring-boot-4/mybatis-sample/src/main/resources/application.yml
similarity index 100%
rename from orm-samples/mybatis-sample/src/main/resources/application.yml
rename to spring-boot-4/mybatis-sample/src/main/resources/application.yml
diff --git a/orm-samples/mybatis-sample/src/main/resources/db/schema.sql b/spring-boot-4/mybatis-sample/src/main/resources/db/schema.sql
similarity index 100%
rename from orm-samples/mybatis-sample/src/main/resources/db/schema.sql
rename to spring-boot-4/mybatis-sample/src/main/resources/db/schema.sql
diff --git a/orm-samples/mybatis-sample/src/test/java/com/baomidou/mybatis/test/EncTest.java b/spring-boot-4/mybatis-sample/src/test/java/com/baomidou/mybatis/test/EncTest.java
similarity index 100%
rename from orm-samples/mybatis-sample/src/test/java/com/baomidou/mybatis/test/EncTest.java
rename to spring-boot-4/mybatis-sample/src/test/java/com/baomidou/mybatis/test/EncTest.java
diff --git a/orm-samples/mybatisplus3-sample/pom.xml b/spring-boot-4/mybatisplus3-sample/pom.xml
similarity index 84%
rename from orm-samples/mybatisplus3-sample/pom.xml
rename to spring-boot-4/mybatisplus3-sample/pom.xml
index 4d7565b2..6c9c922b 100644
--- a/orm-samples/mybatisplus3-sample/pom.xml
+++ b/spring-boot-4/mybatisplus3-sample/pom.xml
@@ -3,7 +3,7 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- orm-samples
+ spring-boot-4-samples
com.baomidou
1.0.0
@@ -22,16 +22,15 @@
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
com.baomidou
- mybatis-plus-boot-starter
- 3.5.3.2
+ mybatis-plus-spring-boot4-starter
com.h2database
diff --git a/orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/MybatisPlus3Application.java b/spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/MybatisPlus3Application.java
similarity index 100%
rename from orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/MybatisPlus3Application.java
rename to spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/MybatisPlus3Application.java
diff --git a/orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/controller/UserController.java b/spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/controller/UserController.java
similarity index 100%
rename from orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/controller/UserController.java
rename to spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/controller/UserController.java
diff --git a/orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/dto/UserDto.java b/spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/dto/UserDto.java
similarity index 100%
rename from orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/dto/UserDto.java
rename to spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/dto/UserDto.java
diff --git a/orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/entity/User.java b/spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/entity/User.java
similarity index 100%
rename from orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/entity/User.java
rename to spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/entity/User.java
diff --git a/orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/mapper/UserMapper.java b/spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/mapper/UserMapper.java
similarity index 100%
rename from orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/mapper/UserMapper.java
rename to spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/mapper/UserMapper.java
diff --git a/orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/service/UserService.java b/spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/service/UserService.java
similarity index 89%
rename from orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/service/UserService.java
rename to spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/service/UserService.java
index 3362e7ca..6c7d0cac 100644
--- a/orm-samples/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/service/UserService.java
+++ b/spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/service/UserService.java
@@ -16,12 +16,12 @@
package com.baomidou.samples.mybatisplus3.service;
-import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.repository.IRepository;
import com.baomidou.samples.mybatisplus3.entity.User;
import java.util.List;
-public interface UserService extends IService {
+public interface UserService extends IRepository {
List selectMasterUsers();
diff --git a/spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/service/impl/UserServiceImpl.java b/spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/service/impl/UserServiceImpl.java
new file mode 100644
index 00000000..87c699e3
--- /dev/null
+++ b/spring-boot-4/mybatisplus3-sample/src/main/java/com/baomidou/samples/mybatisplus3/service/impl/UserServiceImpl.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright © ${project.inceptionYear} organization baomidou
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.samples.mybatisplus3.service.impl;
+
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.dynamic.datasource.annotation.Slave;
+import com.baomidou.mybatisplus.core.enums.SqlMethod;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.repository.AbstractRepository;
+import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
+import com.baomidou.samples.mybatisplus3.entity.User;
+import com.baomidou.samples.mybatisplus3.mapper.UserMapper;
+import com.baomidou.samples.mybatisplus3.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+@Service
+public class UserServiceImpl extends AbstractRepository implements UserService {
+
+ @Autowired
+ private UserMapper baseMapper;
+
+ @Override
+ public UserMapper getBaseMapper() {
+ return baseMapper;
+ }
+
+ @Override
+ public List selectMasterUsers() {
+ return baseMapper.selectList(null);
+ }
+
+ @Override
+ @DS("slave")
+ public List selectSlaveUsers() {
+ return baseMapper.selectList(null);
+ }
+
+ @Override
+ public List selectLambdaMasterUsers() {
+ return this.lambdaQuery().list();
+ }
+
+ @Override
+ @DS("slave")
+ public List selectLambdaSlaveUsers() {
+ return this.lambdaQuery().list();
+ }
+
+ @Override
+ @Slave
+ public List selectSlaveAnnotationUsers() {
+ return this.lambdaQuery().list();
+ }
+
+ @Override
+ public void addUser(User user) {
+ baseMapper.insert(user);
+ }
+
+ @Override
+ public void deleteUserById(Long id) {
+ baseMapper.deleteById(id);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean saveBatch(Collection entityList, int batchSize) {
+ String sqlStatement = SqlHelper.getSqlStatement(getMapperClass(), SqlMethod.INSERT_ONE);
+ return executeBatch(entityList, batchSize, (sqlSession, entity) -> sqlSession.insert(sqlStatement, entity));
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean saveOrUpdateBatch(Collection entityList, int batchSize) {
+ TableInfo tableInfo = TableInfoHelper.getTableInfo(User.class);
+ Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");
+ String keyProperty = tableInfo.getKeyProperty();
+ Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");
+ String updateStatement = SqlHelper.getSqlStatement(getMapperClass(), SqlMethod.UPDATE_BY_ID);
+ return SqlHelper.saveOrUpdateBatch(getSqlSessionFactory(), getMapperClass(), log, entityList, batchSize,
+ (sqlSession, entity) -> StringUtils.checkValNull(tableInfo.getPropertyValue(entity, keyProperty)),
+ // BaseMapper.updateById 的参数声明为 @Param("et"),因此实体必须包一层再传入。
+ (sqlSession, entity) -> sqlSession.update(updateStatement, Collections.singletonMap("et", entity)));
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean updateBatchById(Collection entityList, int batchSize) {
+ String sqlStatement = SqlHelper.getSqlStatement(getMapperClass(), SqlMethod.UPDATE_BY_ID);
+ // BaseMapper.updateById 的参数声明为 @Param("et"),因此实体必须包一层再传入。
+ return executeBatch(entityList, batchSize, (sqlSession, entity) -> sqlSession.update(sqlStatement, Collections.singletonMap("et", entity)));
+ }
+}
diff --git a/orm-samples/jdbc-template-sample/src/main/resources/application.yml b/spring-boot-4/mybatisplus3-sample/src/main/resources/application.yml
similarity index 100%
rename from orm-samples/jdbc-template-sample/src/main/resources/application.yml
rename to spring-boot-4/mybatisplus3-sample/src/main/resources/application.yml
diff --git a/orm-samples/mybatisplus3-sample/src/main/resources/db/schema.sql b/spring-boot-4/mybatisplus3-sample/src/main/resources/db/schema.sql
similarity index 100%
rename from orm-samples/mybatisplus3-sample/src/main/resources/db/schema.sql
rename to spring-boot-4/mybatisplus3-sample/src/main/resources/db/schema.sql
diff --git a/spring-boot-4/mybatisplus3-sample/src/test/java/com/baomidou/samples/mybatisplus3/test/UserServiceTest.java b/spring-boot-4/mybatisplus3-sample/src/test/java/com/baomidou/samples/mybatisplus3/test/UserServiceTest.java
new file mode 100644
index 00000000..f67ed83a
--- /dev/null
+++ b/spring-boot-4/mybatisplus3-sample/src/test/java/com/baomidou/samples/mybatisplus3/test/UserServiceTest.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright © ${project.inceptionYear} organization baomidou
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.samples.mybatisplus3.test;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.samples.mybatisplus3.entity.User;
+import com.baomidou.samples.mybatisplus3.service.UserService;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+class UserServiceTest {
+
+ @Autowired
+ private UserService userService;
+
+ @AfterEach
+ void cleanUp() {
+ userService.remove(Wrappers.emptyWrapper());
+ }
+
+ @Test
+ void addAndSelectMasterUsers() {
+ User user = new User();
+ user.setName("Tom");
+ user.setAge(20);
+ userService.addUser(user);
+ assertThat(user.getId()).isNotNull();
+ assertThat(userService.selectMasterUsers()).isNotEmpty();
+ userService.deleteUserById(user.getId().longValue());
+ assertThat(userService.selectMasterUsers()).isEmpty();
+ }
+
+ @Test
+ void repositoryCrudMethods() {
+ User user = new User();
+ user.setName("Jerry");
+ user.setAge(18);
+ assertThat(userService.save(user)).isTrue();
+ assertThat(user.getId()).isNotNull();
+
+ User loaded = userService.getById(user.getId());
+ assertThat(loaded.getName()).isEqualTo("Jerry");
+
+ loaded.setAge(19);
+ assertThat(userService.updateById(loaded)).isTrue();
+ assertThat(userService.getById(user.getId()).getAge()).isEqualTo(19);
+
+ assertThat(userService.count()).isEqualTo(1);
+ assertThat(userService.list()).hasSize(1);
+
+ assertThat(userService.removeById(user.getId())).isTrue();
+ assertThat(userService.count()).isZero();
+ }
+
+ @Test
+ void repositoryBatchMethods() {
+ User first = new User();
+ first.setName("Batch1");
+ first.setAge(21);
+ User second = new User();
+ second.setName("Batch2");
+ second.setAge(22);
+ List users = new ArrayList<>(Arrays.asList(first, second));
+ assertThat(userService.saveBatch(users, 100)).isTrue();
+ assertThat(userService.count()).isEqualTo(2);
+
+ users.forEach(user -> user.setAge(30));
+ assertThat(userService.updateBatchById(users, 100)).isTrue();
+ assertThat(userService.list()).allMatch(user -> user.getAge() == 30);
+
+ User third = new User();
+ third.setName("Batch3");
+ third.setAge(23);
+ users.add(third);
+ assertThat(userService.saveOrUpdateBatch(users, 100)).isTrue();
+ assertThat(userService.count()).isEqualTo(3);
+
+ assertThat(userService.removeByIds(Arrays.asList(first.getId(), second.getId(), third.getId()))).isTrue();
+ assertThat(userService.count()).isZero();
+ }
+
+ @Test
+ void slaveRoutingMethods() {
+ User user = new User();
+ user.setName("Slave");
+ user.setAge(25);
+ userService.addUser(user);
+ try {
+ assertThat(userService.selectSlaveUsers()).isNotEmpty();
+ assertThat(userService.selectLambdaMasterUsers()).isNotEmpty();
+ assertThat(userService.selectLambdaSlaveUsers()).isNotEmpty();
+ assertThat(userService.selectSlaveAnnotationUsers()).isNotEmpty();
+ assertThat(userService.lambdaQuery().list()).isNotEmpty();
+ } finally {
+ userService.deleteUserById(user.getId().longValue());
+ }
+ }
+}
diff --git a/no-ds-samples/name-pattern-sample/pom.xml b/spring-boot-4/name-pattern-sample/pom.xml
similarity index 89%
rename from no-ds-samples/name-pattern-sample/pom.xml
rename to spring-boot-4/name-pattern-sample/pom.xml
index 3150ed22..e38690cf 100644
--- a/no-ds-samples/name-pattern-sample/pom.xml
+++ b/spring-boot-4/name-pattern-sample/pom.xml
@@ -3,7 +3,7 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- no-ds-samples
+ spring-boot-4-samples
com.baomidou
1.0.0
@@ -22,11 +22,11 @@
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
org.mybatis.spring.boot
diff --git a/no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/PatternApplication.java b/spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/PatternApplication.java
similarity index 100%
rename from no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/PatternApplication.java
rename to spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/PatternApplication.java
diff --git a/no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/config/MyConfig.java b/spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/config/MyConfig.java
similarity index 100%
rename from no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/config/MyConfig.java
rename to spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/config/MyConfig.java
diff --git a/no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/controller/UserController.java b/spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/controller/UserController.java
similarity index 100%
rename from no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/controller/UserController.java
rename to spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/controller/UserController.java
diff --git a/no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/dto/UserDto.java b/spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/dto/UserDto.java
similarity index 100%
rename from no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/dto/UserDto.java
rename to spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/dto/UserDto.java
diff --git a/no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/entity/User.java b/spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/entity/User.java
similarity index 100%
rename from no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/entity/User.java
rename to spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/entity/User.java
diff --git a/no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/mapper/UserMapper.java b/spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/mapper/UserMapper.java
similarity index 100%
rename from no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/mapper/UserMapper.java
rename to spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/mapper/UserMapper.java
diff --git a/no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/service/UserService.java b/spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/service/UserService.java
similarity index 100%
rename from no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/service/UserService.java
rename to spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/service/UserService.java
diff --git a/no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/service/impl/UserServiceImpl.java b/spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/service/impl/UserServiceImpl.java
similarity index 100%
rename from no-ds-samples/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/service/impl/UserServiceImpl.java
rename to spring-boot-4/name-pattern-sample/src/main/java/com/baomidou/samples/pattern/service/impl/UserServiceImpl.java
diff --git a/orm-samples/mybatisplus3-sample/src/main/resources/application.yml b/spring-boot-4/name-pattern-sample/src/main/resources/application.yml
similarity index 100%
rename from orm-samples/mybatisplus3-sample/src/main/resources/application.yml
rename to spring-boot-4/name-pattern-sample/src/main/resources/application.yml
diff --git a/springboot3-sample/src/main/resources/db/schema.sql b/spring-boot-4/name-pattern-sample/src/main/resources/db/schema.sql
similarity index 100%
rename from springboot3-sample/src/main/resources/db/schema.sql
rename to spring-boot-4/name-pattern-sample/src/main/resources/db/schema.sql
diff --git a/spring-boot-4/name-pattern-sample/src/test/java/com/baomidou/samples/pattern/test/UserServiceTest.java b/spring-boot-4/name-pattern-sample/src/test/java/com/baomidou/samples/pattern/test/UserServiceTest.java
new file mode 100644
index 00000000..e55a8ee9
--- /dev/null
+++ b/spring-boot-4/name-pattern-sample/src/test/java/com/baomidou/samples/pattern/test/UserServiceTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright © ${project.inceptionYear} organization baomidou
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.samples.pattern.test;
+
+import com.baomidou.samples.pattern.entity.User;
+import com.baomidou.samples.pattern.service.UserService;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+class UserServiceTest {
+
+ @Autowired
+ private UserService userService;
+
+ @AfterEach
+ void cleanUp() {
+ userService.deleteAll();
+ }
+
+ @Test
+ void namePatternRoutingCrud() {
+ User user = new User();
+ user.setName("Pattern");
+ user.setAge(22);
+ userService.addUser(user);
+
+ assertThat(userService.selectAll()).isNotEmpty();
+
+ User loaded = userService.selectAll().get(0);
+ loaded.setName("PatternUpdated");
+ userService.updateUser(loaded);
+ assertThat(userService.selectAll().get(0).getName()).isEqualTo("PatternUpdated");
+
+ userService.deleteUserById(loaded.getId().longValue());
+ assertThat(userService.selectAll()).isEmpty();
+ }
+}
diff --git a/spring-boot-4/pom.xml b/spring-boot-4/pom.xml
new file mode 100644
index 00000000..1d4431fe
--- /dev/null
+++ b/spring-boot-4/pom.xml
@@ -0,0 +1,126 @@
+
+
+ 4.0.0
+
+
+ com.baomidou
+ dynamic-datasource-samples
+ 1.0.0
+
+
+ spring-boot-4-samples
+ pom
+
+
+ UTF-8
+ UTF-8
+ 17
+
+ 4.5.0
+ 4.0.0
+ 3.5.17
+ 1.2.28
+ 3.9.1
+ 2.3.232
+ 4.0.0
+ 2025.1.0
+ 3.0.3
+ 2025.1.0.0
+ 1.18.38
+ 2.0.5
+
+
+
+ add-remove-datasource-sample
+ beetlsql-sample
+ config-consul-sample
+ config-nacos-sample
+ druid-sample
+ jdbc-template-sample
+ load-datasource-from-jdbc-sample
+ mybatis-sample
+ mybatisplus3-sample
+ name-pattern-sample
+ quartz-sample
+ shardingsphere-jdbc-5.x-core-sample
+ shardingsphere-jdbc-5.x-spring-sample
+ spel-sample
+ tx-local-sample
+ tx-seata-sample
+
+
+
+
+
+
+ org.testcontainers
+ testcontainers-bom
+ ${testcontainers-bom.version}
+ pom
+ import
+
+
+ com.baomidou
+ dynamic-datasource-spring-boot4-starter
+ ${ds.version}
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot-dependencies.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud-dependencies.version}
+ pom
+ import
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ ${springdoc-openapi.version}
+
+
+ com.alibaba.cloud
+ spring-alibaba-nacos-config
+ ${alibaba-nacos-config.version}
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ ${mybatis-spring-boot-starter.version}
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+ com.alibaba
+ druid-spring-boot-4-starter
+ ${druid.version}
+
+
+ com.baomidou
+ mybatis-plus-spring-boot4-starter
+ ${mybatis-plus.version}
+
+
+ p6spy
+ p6spy
+ ${p6spy.version}
+
+
+ com.h2database
+ h2
+ ${h2.version}
+
+
+
+
diff --git a/third-part-samples/quartz-sample/pom.xml b/spring-boot-4/quartz-sample/pom.xml
similarity index 77%
rename from third-part-samples/quartz-sample/pom.xml
rename to spring-boot-4/quartz-sample/pom.xml
index 50cf6a16..6cccc596 100644
--- a/third-part-samples/quartz-sample/pom.xml
+++ b/spring-boot-4/quartz-sample/pom.xml
@@ -3,7 +3,7 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- third-part-samples
+ spring-boot-4-samples
com.baomidou
1.0.0
@@ -22,11 +22,11 @@
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
org.springframework.boot
@@ -56,5 +56,15 @@
spring-boot-starter-test
test
+
+ org.testcontainers
+ testcontainers-junit-jupiter
+ test
+
+
+ org.testcontainers
+ testcontainers-mysql
+ test
+
\ No newline at end of file
diff --git a/third-part-samples/quartz-sample/src/main/java/com/baomidou/samples/quartz/QuartzApplication.java b/spring-boot-4/quartz-sample/src/main/java/com/baomidou/samples/quartz/QuartzApplication.java
similarity index 100%
rename from third-part-samples/quartz-sample/src/main/java/com/baomidou/samples/quartz/QuartzApplication.java
rename to spring-boot-4/quartz-sample/src/main/java/com/baomidou/samples/quartz/QuartzApplication.java
diff --git a/third-part-samples/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/MyQuartzAutoConfigurationMode1.java b/spring-boot-4/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/MyQuartzAutoConfigurationMode1.java
similarity index 94%
rename from third-part-samples/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/MyQuartzAutoConfigurationMode1.java
rename to spring-boot-4/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/MyQuartzAutoConfigurationMode1.java
index 8b1031d7..222ad366 100644
--- a/third-part-samples/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/MyQuartzAutoConfigurationMode1.java
+++ b/spring-boot-4/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/MyQuartzAutoConfigurationMode1.java
@@ -16,8 +16,8 @@
package com.baomidou.samples.quartz.config;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
-import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer;
+import org.springframework.boot.jdbc.autoconfigure.DataSourceProperties;
+import org.springframework.boot.quartz.autoconfigure.SchedulerFactoryBeanCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
diff --git a/third-part-samples/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/MyQuartzAutoConfigurationMode2.java b/spring-boot-4/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/MyQuartzAutoConfigurationMode2.java
similarity index 95%
rename from third-part-samples/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/MyQuartzAutoConfigurationMode2.java
rename to spring-boot-4/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/MyQuartzAutoConfigurationMode2.java
index 3080f73a..18725f67 100644
--- a/third-part-samples/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/MyQuartzAutoConfigurationMode2.java
+++ b/spring-boot-4/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/MyQuartzAutoConfigurationMode2.java
@@ -19,8 +19,8 @@
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
-import org.springframework.boot.autoconfigure.quartz.QuartzDataSource;
+import org.springframework.boot.jdbc.autoconfigure.DataSourceProperties;
+import org.springframework.boot.quartz.autoconfigure.QuartzDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
diff --git a/third-part-samples/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/QuartzCommonAutoConfiguration.java b/spring-boot-4/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/QuartzCommonAutoConfiguration.java
similarity index 100%
rename from third-part-samples/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/QuartzCommonAutoConfiguration.java
rename to spring-boot-4/quartz-sample/src/main/java/com/baomidou/samples/quartz/config/QuartzCommonAutoConfiguration.java
diff --git a/third-part-samples/quartz-sample/src/main/java/com/baomidou/samples/quartz/job/HelloworldJob.java b/spring-boot-4/quartz-sample/src/main/java/com/baomidou/samples/quartz/job/HelloworldJob.java
similarity index 100%
rename from third-part-samples/quartz-sample/src/main/java/com/baomidou/samples/quartz/job/HelloworldJob.java
rename to spring-boot-4/quartz-sample/src/main/java/com/baomidou/samples/quartz/job/HelloworldJob.java
diff --git a/third-part-samples/quartz-sample/src/main/resources/application.yml b/spring-boot-4/quartz-sample/src/main/resources/application.yml
similarity index 100%
rename from third-part-samples/quartz-sample/src/main/resources/application.yml
rename to spring-boot-4/quartz-sample/src/main/resources/application.yml
diff --git a/spring-boot-4/quartz-sample/src/test/java/com/baomidou/samples/quartz/test/QuartzSampleTest.java b/spring-boot-4/quartz-sample/src/test/java/com/baomidou/samples/quartz/test/QuartzSampleTest.java
new file mode 100644
index 00000000..79d3219f
--- /dev/null
+++ b/spring-boot-4/quartz-sample/src/test/java/com/baomidou/samples/quartz/test/QuartzSampleTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright © ${project.inceptionYear} organization baomidou
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.samples.quartz.test;
+
+import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
+import org.junit.jupiter.api.Test;
+import org.quartz.Scheduler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.testcontainers.containers.MySQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+import org.testcontainers.utility.DockerImageName;
+
+import javax.sql.DataSource;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@Testcontainers
+@SpringBootTest
+class QuartzSampleTest {
+
+ @Container
+ static MySQLContainer> mysql = new MySQLContainer<>(DockerImageName.parse("mysql:8.4.7-oraclelinux9"))
+ .withDatabaseName("quartz");
+
+ @org.springframework.test.context.DynamicPropertySource
+ static void datasourceProperties(org.springframework.test.context.DynamicPropertyRegistry registry) {
+ registry.add("spring.datasource.url", () -> mysql.getJdbcUrl() + "?useSSL=false&allowPublicKeyRetrieval=true");
+ registry.add("spring.datasource.username", mysql::getUsername);
+ registry.add("spring.datasource.password", mysql::getPassword);
+ registry.add("spring.datasource.dynamic.datasource.quartz.url",
+ () -> mysql.getJdbcUrl() + "?useSSL=false&allowPublicKeyRetrieval=true");
+ registry.add("spring.datasource.dynamic.datasource.quartz.username", mysql::getUsername);
+ registry.add("spring.datasource.dynamic.datasource.quartz.password", mysql::getPassword);
+ }
+
+ @Autowired
+ private Scheduler scheduler;
+
+ @Autowired
+ private DataSource dataSource;
+
+ @Test
+ void schedulerUsesJdbcStore() throws Exception {
+ assertThat(scheduler.isStarted()).isTrue();
+ assertThat(scheduler.getJobGroupNames()).contains("myJobGroup1");
+ DynamicRoutingDataSource routingDataSource = (DynamicRoutingDataSource) dataSource;
+ assertThat(routingDataSource.getDataSources().keySet()).contains("master", "quartz");
+ Integer quartzTables = new JdbcTemplate(routingDataSource.getDataSource("quartz"))
+ .queryForObject("select count(*) from QRTZ_JOB_DETAILS", Integer.class);
+ assertThat(quartzTables).isGreaterThanOrEqualTo(1);
+ }
+}
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/pom.xml b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/pom.xml
similarity index 90%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/pom.xml
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/pom.xml
index 1aa0b663..ad8111ea 100644
--- a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/pom.xml
+++ b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/pom.xml
@@ -3,7 +3,7 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- shardingsphere-sample
+ spring-boot-4-samples
com.baomidou
1.0.0
@@ -65,7 +65,7 @@
org.testcontainers
- junit-jupiter
+ testcontainers-junit-jupiter
test
@@ -76,15 +76,15 @@
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
org.testcontainers
- mysql
+ testcontainers-mysql
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/ShardingSphereApplication.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/ShardingSphereApplication.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/ShardingSphereApplication.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/ShardingSphereApplication.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/common/TcMySQLDatabaseType.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/common/TcMySQLDatabaseType.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/common/TcMySQLDatabaseType.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/common/TcMySQLDatabaseType.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/controller/TOrderController.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/controller/TOrderController.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/controller/TOrderController.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/controller/TOrderController.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/controller/UserController.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/controller/UserController.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/controller/UserController.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/controller/UserController.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/entity/TOrder.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/entity/TOrder.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/entity/TOrder.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/entity/TOrder.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/entity/User.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/entity/User.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/entity/User.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/entity/User.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/mapper/TOrderMapper.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/mapper/TOrderMapper.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/mapper/TOrderMapper.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/mapper/TOrderMapper.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/mapper/UserMapper.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/mapper/UserMapper.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/mapper/UserMapper.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/mapper/UserMapper.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/TOrderService.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/TOrderService.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/TOrderService.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/TOrderService.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/UserService.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/UserService.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/UserService.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/UserService.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/impl/TOrderServiceImpl.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/impl/TOrderServiceImpl.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/impl/TOrderServiceImpl.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/impl/TOrderServiceImpl.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/impl/UserServiceImpl.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/impl/UserServiceImpl.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/impl/UserServiceImpl.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/service/impl/UserServiceImpl.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.database.core.type.DatabaseType b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.database.core.type.DatabaseType
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.database.core.type.DatabaseType
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.database.core.type.DatabaseType
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/resources/application.yml b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/resources/application.yml
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/resources/application.yml
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/resources/application.yml
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/resources/config.yaml b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/resources/config.yaml
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/resources/config.yaml
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/resources/config.yaml
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/resources/db/schema.sql b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/resources/db/schema.sql
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/main/resources/db/schema.sql
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/main/resources/db/schema.sql
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/ControllerLayerTests.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/ControllerLayerTests.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/ControllerLayerTests.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/ControllerLayerTests.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/MapperLayerTests.java b/spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/MapperLayerTests.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-core-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/MapperLayerTests.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-core-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/core/MapperLayerTests.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/pom.xml b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/pom.xml
similarity index 77%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/pom.xml
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/pom.xml
index 27c6ceb4..90c48e20 100644
--- a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/pom.xml
+++ b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/pom.xml
@@ -3,23 +3,22 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- shardingsphere-sample
+ spring-boot-4-samples
com.baomidou
1.0.0
4.0.0
shardingsphere-jdbc-5.x-spring-sample
- 5.2.1
-
- 1.33
+ 5.5.2
+ 33.4.6-jre
- org.yaml
- snakeyaml
- ${snakeyaml.version}
+ com.google.guava
+ guava
+ ${guava.version}
@@ -56,16 +55,16 @@
org.apache.shardingsphere
- shardingsphere-jdbc-core-spring-boot-starter
+ shardingsphere-jdbc
${shardingsphere.version}
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/ShardingSphereApplication.java b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/ShardingSphereApplication.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/ShardingSphereApplication.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/ShardingSphereApplication.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/controller/TOrderController.java b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/controller/TOrderController.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/controller/TOrderController.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/controller/TOrderController.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/controller/UserController.java b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/controller/UserController.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/controller/UserController.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/controller/UserController.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/entity/TOrder.java b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/entity/TOrder.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/entity/TOrder.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/entity/TOrder.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/entity/User.java b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/entity/User.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/entity/User.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/entity/User.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/mapper/TOrderMapper.java b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/mapper/TOrderMapper.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/mapper/TOrderMapper.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/mapper/TOrderMapper.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/mapper/UserMapper.java b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/mapper/UserMapper.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/mapper/UserMapper.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/mapper/UserMapper.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/TOrderService.java b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/TOrderService.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/TOrderService.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/TOrderService.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/UserService.java b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/UserService.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/UserService.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/UserService.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/impl/TOrderServiceImpl.java b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/impl/TOrderServiceImpl.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/impl/TOrderServiceImpl.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/impl/TOrderServiceImpl.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/impl/UserServiceImpl.java b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/impl/UserServiceImpl.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/impl/UserServiceImpl.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/service/impl/UserServiceImpl.java
diff --git a/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/resources/application.yml b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/resources/application.yml
new file mode 100644
index 00000000..be84b951
--- /dev/null
+++ b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/resources/application.yml
@@ -0,0 +1,21 @@
+spring:
+ # dynamic-datasource 配置
+ datasource:
+ dynamic:
+ datasource:
+ master:
+ driver-class-name: org.h2.Driver
+ url: jdbc:h2:mem:baomidou_master;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'
+ username: sa
+ password: ""
+ test:
+ driver-class-name: org.h2.Driver
+ url: jdbc:h2:mem:baomidou_test;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'
+ username: sa
+ password: ""
+ shardingSphere:
+ driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
+ url: jdbc:shardingsphere:classpath:config.yaml
+logging:
+ level:
+ com.baomidou: debug
diff --git a/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/resources/config.yaml b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/resources/config.yaml
new file mode 100644
index 00000000..94127416
--- /dev/null
+++ b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/resources/config.yaml
@@ -0,0 +1,56 @@
+dataSources:
+ shardingmaster:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:master;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'
+ username: sa
+ password:
+ shardingslave0:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:slave1;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'
+ username: sa
+ password:
+ shardingslave1:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:slave2;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'
+ username: sa
+ password:
+rules:
+- !SHARDING
+ tables:
+ t_order:
+ actualDataNodes: shardingmaster.t_order$->{0..1}
+ tableStrategy:
+ standard:
+ shardingColumn: order_id
+ shardingAlgorithmName: baomidou_inline
+ keyGenerateStrategy:
+ column: order_id
+ keyGeneratorName: baomidou_snowflake
+ shardingAlgorithms:
+ baomidou_inline:
+ type: INLINE
+ props:
+ algorithm-expression: t_order$->{order_id % 2}
+ allow-range-query-with-inline-sharding: true
+ keyGenerators:
+ baomidou_snowflake:
+ type: SNOWFLAKE
+- !READWRITE_SPLITTING
+ dataSourceGroups:
+ baomidou_readwrite_data_sources:
+ writeDataSourceName: shardingmaster
+ readDataSourceNames:
+ - shardingslave0
+ - shardingslave1
+ loadBalancerName: baomidou_load_balance_algorithm
+ loadBalancers:
+ baomidou_load_balance_algorithm:
+ type: ROUND_ROBIN
+- !SINGLE
+ tables:
+ - "*.*"
+props:
+ sql-show: true
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/resources/db/schema.sql b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/resources/db/schema.sql
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/resources/db/schema.sql
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/main/resources/db/schema.sql
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/ControllerLayerTests.java b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/ControllerLayerTests.java
similarity index 100%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/ControllerLayerTests.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/ControllerLayerTests.java
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/MapperLayerTests.java b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/MapperLayerTests.java
similarity index 94%
rename from third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/MapperLayerTests.java
rename to spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/MapperLayerTests.java
index 04c1a213..1c55168c 100644
--- a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/MapperLayerTests.java
+++ b/spring-boot-4/shardingsphere-jdbc-5.x-spring-sample/src/test/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/MapperLayerTests.java
@@ -23,7 +23,7 @@
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.jdbc.UncategorizedSQLException;
+import org.springframework.dao.DataIntegrityViolationException;
import java.util.List;
@@ -31,7 +31,7 @@
import static org.junit.jupiter.api.Assertions.assertThrows;
/**
- * TODO Unit tests for ShardingSphere 5.5.2 need to be synchronized.
+ * 单元测试已按 ShardingSphere 5.5.2 driver 模式同步。
*/
@SpringBootTest
public class MapperLayerTests {
@@ -66,7 +66,7 @@ void whenRequestToAddByNameAndUserId() {
void whenRequestToAddByNameAndUserIdWithPrimaryKey() {
List emptyState = tOrderMapper.findAll();
assertEquals(0, emptyState.size());
- assertThrows(UncategorizedSQLException.class, () -> {
+ assertThrows(DataIntegrityViolationException.class, () -> {
tOrderMapper.addByNameAndUserId("Bright", 114514L);
tOrderMapper.addByNameAndUserId("Jordan", 114515L);
});
diff --git a/features-samples/spel-sample/pom.xml b/spring-boot-4/spel-sample/pom.xml
similarity index 88%
rename from features-samples/spel-sample/pom.xml
rename to spring-boot-4/spel-sample/pom.xml
index e64b903a..8fabe7a8 100644
--- a/features-samples/spel-sample/pom.xml
+++ b/spring-boot-4/spel-sample/pom.xml
@@ -3,7 +3,7 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- features-samples
+ spring-boot-4-samples
com.baomidou
1.0.0
@@ -22,11 +22,11 @@
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
org.mybatis.spring.boot
diff --git a/features-samples/spel-sample/src/main/java/com/baomidou/samples/spel/SpelApplication.java b/spring-boot-4/spel-sample/src/main/java/com/baomidou/samples/spel/SpelApplication.java
similarity index 100%
rename from features-samples/spel-sample/src/main/java/com/baomidou/samples/spel/SpelApplication.java
rename to spring-boot-4/spel-sample/src/main/java/com/baomidou/samples/spel/SpelApplication.java
diff --git a/features-samples/spel-sample/src/main/java/com/baomidou/samples/spel/controller/UserController.java b/spring-boot-4/spel-sample/src/main/java/com/baomidou/samples/spel/controller/UserController.java
similarity index 97%
rename from features-samples/spel-sample/src/main/java/com/baomidou/samples/spel/controller/UserController.java
rename to spring-boot-4/spel-sample/src/main/java/com/baomidou/samples/spel/controller/UserController.java
index b21a436a..03ee0124 100644
--- a/features-samples/spel-sample/src/main/java/com/baomidou/samples/spel/controller/UserController.java
+++ b/spring-boot-4/spel-sample/src/main/java/com/baomidou/samples/spel/controller/UserController.java
@@ -21,7 +21,7 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
@RequestMapping("/users")
diff --git a/features-samples/spel-sample/src/main/java/com/baomidou/samples/spel/entity/User.java b/spring-boot-4/spel-sample/src/main/java/com/baomidou/samples/spel/entity/User.java
similarity index 100%
rename from features-samples/spel-sample/src/main/java/com/baomidou/samples/spel/entity/User.java
rename to spring-boot-4/spel-sample/src/main/java/com/baomidou/samples/spel/entity/User.java
diff --git a/features-samples/spel-sample/src/main/java/com/baomidou/samples/spel/mapper/UserMapper.java b/spring-boot-4/spel-sample/src/main/java/com/baomidou/samples/spel/mapper/UserMapper.java
similarity index 100%
rename from features-samples/spel-sample/src/main/java/com/baomidou/samples/spel/mapper/UserMapper.java
rename to spring-boot-4/spel-sample/src/main/java/com/baomidou/samples/spel/mapper/UserMapper.java
diff --git a/features-samples/spel-sample/src/main/java/com/baomidou/samples/spel/service/UserService.java b/spring-boot-4/spel-sample/src/main/java/com/baomidou/samples/spel/service/UserService.java
similarity index 100%
rename from features-samples/spel-sample/src/main/java/com/baomidou/samples/spel/service/UserService.java
rename to spring-boot-4/spel-sample/src/main/java/com/baomidou/samples/spel/service/UserService.java
diff --git a/features-samples/spel-sample/src/main/java/com/baomidou/samples/spel/service/impl/UserServiceImpl.java b/spring-boot-4/spel-sample/src/main/java/com/baomidou/samples/spel/service/impl/UserServiceImpl.java
similarity index 100%
rename from features-samples/spel-sample/src/main/java/com/baomidou/samples/spel/service/impl/UserServiceImpl.java
rename to spring-boot-4/spel-sample/src/main/java/com/baomidou/samples/spel/service/impl/UserServiceImpl.java
diff --git a/features-samples/spel-sample/src/main/resources/application.yml b/spring-boot-4/spel-sample/src/main/resources/application.yml
similarity index 100%
rename from features-samples/spel-sample/src/main/resources/application.yml
rename to spring-boot-4/spel-sample/src/main/resources/application.yml
diff --git a/features-samples/spel-sample/src/main/resources/db/schema.sql b/spring-boot-4/spel-sample/src/main/resources/db/schema.sql
similarity index 100%
rename from features-samples/spel-sample/src/main/resources/db/schema.sql
rename to spring-boot-4/spel-sample/src/main/resources/db/schema.sql
diff --git a/features-samples/spel-sample/src/test/java/com/baomidou/samples/spel/test/SPELTest.java b/spring-boot-4/spel-sample/src/test/java/com/baomidou/samples/spel/test/SPELTest.java
similarity index 100%
rename from features-samples/spel-sample/src/test/java/com/baomidou/samples/spel/test/SPELTest.java
rename to spring-boot-4/spel-sample/src/test/java/com/baomidou/samples/spel/test/SPELTest.java
diff --git a/tx-samples/tx-local-sample/pom.xml b/spring-boot-4/tx-local-sample/pom.xml
similarity index 74%
rename from tx-samples/tx-local-sample/pom.xml
rename to spring-boot-4/tx-local-sample/pom.xml
index b14ecfc6..21372aee 100644
--- a/tx-samples/tx-local-sample/pom.xml
+++ b/spring-boot-4/tx-local-sample/pom.xml
@@ -3,7 +3,7 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- tx-samples
+ spring-boot-4-samples
com.baomidou
1.0.0
@@ -21,16 +21,15 @@
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
com.baomidou
- mybatis-plus-boot-starter
- 3.5.3.2
+ mybatis-plus-spring-boot4-starter
com.mysql
@@ -57,5 +56,15 @@
spring-boot-starter-test
test
+
+ org.testcontainers
+ testcontainers-junit-jupiter
+ test
+
+
+ org.testcontainers
+ testcontainers-postgresql
+ test
+
\ No newline at end of file
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/LocalTxApplication.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/LocalTxApplication.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/LocalTxApplication.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/LocalTxApplication.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/common/OrderStatus.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/common/OrderStatus.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/common/OrderStatus.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/common/OrderStatus.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/config/GlobalExceptionHandler.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/config/GlobalExceptionHandler.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/config/GlobalExceptionHandler.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/config/GlobalExceptionHandler.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/controller/OrderController.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/controller/OrderController.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/controller/OrderController.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/controller/OrderController.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/dto/PlaceOrderRequest.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/dto/PlaceOrderRequest.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/dto/PlaceOrderRequest.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/dto/PlaceOrderRequest.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/dto/ReduceBalanceRequest.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/dto/ReduceBalanceRequest.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/dto/ReduceBalanceRequest.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/dto/ReduceBalanceRequest.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/dto/ReduceStockRequest.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/dto/ReduceStockRequest.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/dto/ReduceStockRequest.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/dto/ReduceStockRequest.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/entity/Account.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/entity/Account.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/entity/Account.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/entity/Account.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/entity/Order.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/entity/Order.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/entity/Order.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/entity/Order.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/entity/Product.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/entity/Product.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/entity/Product.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/entity/Product.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/mapper/AccountMapper.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/mapper/AccountMapper.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/mapper/AccountMapper.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/mapper/AccountMapper.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/mapper/OrderMapper.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/mapper/OrderMapper.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/mapper/OrderMapper.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/mapper/OrderMapper.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/mapper/ProductMapper.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/mapper/ProductMapper.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/mapper/ProductMapper.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/mapper/ProductMapper.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/service/AccountService.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/service/AccountService.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/service/AccountService.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/service/AccountService.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/service/OrderService.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/service/OrderService.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/service/OrderService.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/service/OrderService.java
diff --git a/tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/service/ProductService.java b/spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/service/ProductService.java
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/java/com/baomidou/samples/localtx/service/ProductService.java
rename to spring-boot-4/tx-local-sample/src/main/java/com/baomidou/samples/localtx/service/ProductService.java
diff --git a/tx-samples/tx-local-sample/src/main/resources/application.yml b/spring-boot-4/tx-local-sample/src/main/resources/application.yml
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/resources/application.yml
rename to spring-boot-4/tx-local-sample/src/main/resources/application.yml
diff --git a/tx-samples/tx-local-sample/src/main/resources/db/postgresql/schema-account.sql b/spring-boot-4/tx-local-sample/src/main/resources/db/postgresql/schema-account.sql
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/resources/db/postgresql/schema-account.sql
rename to spring-boot-4/tx-local-sample/src/main/resources/db/postgresql/schema-account.sql
diff --git a/tx-samples/tx-local-sample/src/main/resources/db/postgresql/schema-order.sql b/spring-boot-4/tx-local-sample/src/main/resources/db/postgresql/schema-order.sql
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/resources/db/postgresql/schema-order.sql
rename to spring-boot-4/tx-local-sample/src/main/resources/db/postgresql/schema-order.sql
diff --git a/tx-samples/tx-local-sample/src/main/resources/db/postgresql/schema-product.sql b/spring-boot-4/tx-local-sample/src/main/resources/db/postgresql/schema-product.sql
similarity index 100%
rename from tx-samples/tx-local-sample/src/main/resources/db/postgresql/schema-product.sql
rename to spring-boot-4/tx-local-sample/src/main/resources/db/postgresql/schema-product.sql
diff --git a/spring-boot-4/tx-local-sample/src/test/java/com/baomidou/samples/localtx/test/LocalTxSampleTest.java b/spring-boot-4/tx-local-sample/src/test/java/com/baomidou/samples/localtx/test/LocalTxSampleTest.java
new file mode 100644
index 00000000..cd61adf3
--- /dev/null
+++ b/spring-boot-4/tx-local-sample/src/test/java/com/baomidou/samples/localtx/test/LocalTxSampleTest.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright © ${project.inceptionYear} organization baomidou
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.samples.localtx.test;
+
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.samples.localtx.dto.PlaceOrderRequest;
+import com.baomidou.samples.localtx.entity.Account;
+import com.baomidou.samples.localtx.entity.Order;
+import com.baomidou.samples.localtx.entity.Product;
+import com.baomidou.samples.localtx.mapper.AccountMapper;
+import com.baomidou.samples.localtx.mapper.OrderMapper;
+import com.baomidou.samples.localtx.mapper.ProductMapper;
+import com.baomidou.samples.localtx.service.OrderService;
+import org.junit.jupiter.api.AfterEach;
+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.DynamicPropertyRegistry;
+import org.springframework.test.context.DynamicPropertySource;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+import org.testcontainers.utility.DockerImageName;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+@Testcontainers
+@SpringBootTest
+class LocalTxSampleTest {
+
+ @Container
+ static PostgreSQLContainer> postgres = new PostgreSQLContainer<>(DockerImageName.parse("postgres:16-alpine"))
+ .withInitScript("db/postgresql/init-schemas.sql");
+
+ @DynamicPropertySource
+ static void datasourceProperties(DynamicPropertyRegistry registry) {
+ registry.add("spring.datasource.dynamic.datasource.order.url", postgres::getJdbcUrl);
+ registry.add("spring.datasource.dynamic.datasource.order.username", postgres::getUsername);
+ registry.add("spring.datasource.dynamic.datasource.order.password", postgres::getPassword);
+ registry.add("spring.datasource.dynamic.datasource.account.url", postgres::getJdbcUrl);
+ registry.add("spring.datasource.dynamic.datasource.account.username", postgres::getUsername);
+ registry.add("spring.datasource.dynamic.datasource.account.password", postgres::getPassword);
+ registry.add("spring.datasource.dynamic.datasource.product.url", postgres::getJdbcUrl);
+ registry.add("spring.datasource.dynamic.datasource.product.username", postgres::getUsername);
+ registry.add("spring.datasource.dynamic.datasource.product.password", postgres::getPassword);
+ }
+
+ @Autowired
+ private OrderService orderService;
+
+ @Autowired
+ private OrderMapper orderMapper;
+
+ @Autowired
+ private AccountMapper accountMapper;
+
+ @Autowired
+ private ProductMapper productMapper;
+
+ @AfterEach
+ void cleanUp() {
+ DynamicDataSourceContextHolder.push("order");
+ try {
+ orderMapper.delete(null);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+ DynamicDataSourceContextHolder.push("product");
+ try {
+ Product product = productMapper.selectById(1);
+ product.setStock(20);
+ productMapper.updateById(product);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+ DynamicDataSourceContextHolder.push("account");
+ try {
+ Account account = accountMapper.selectById(1L);
+ account.setBalance(50.0);
+ accountMapper.updateById(account);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+ }
+
+ @Test
+ void placeOrderSuccess() {
+ orderService.placeOrder(new PlaceOrderRequest(1L, 1L, 2));
+
+ DynamicDataSourceContextHolder.push("order");
+ try {
+ assertThat(orderMapper.selectCount(null)).isEqualTo(1);
+ Order order = orderMapper.selectList(null).get(0);
+ assertThat(order.getStatus().name()).isEqualTo("SUCCESS");
+ assertThat(order.getTotalPrice()).isEqualTo(20.0);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+
+ DynamicDataSourceContextHolder.push("product");
+ try {
+ assertThat(productMapper.selectById(1).getStock()).isEqualTo(18);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+
+ DynamicDataSourceContextHolder.push("account");
+ try {
+ assertThat(accountMapper.selectById(1L).getBalance()).isEqualTo(30.0);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+ }
+
+ @Test
+ void placeOrderRollbackOnInsufficientBalance() {
+ // 总价 100 超过预置的余额 50,整个分布式本地事务必须回滚。
+ assertThatThrownBy(() -> orderService.placeOrder(new PlaceOrderRequest(1L, 1L, 10)))
+ .isInstanceOf(RuntimeException.class);
+
+ DynamicDataSourceContextHolder.push("order");
+ try {
+ assertThat(orderMapper.selectCount(null)).isZero();
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+
+ DynamicDataSourceContextHolder.push("product");
+ try {
+ assertThat(productMapper.selectById(1).getStock()).isEqualTo(20);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+
+ DynamicDataSourceContextHolder.push("account");
+ try {
+ assertThat(accountMapper.selectById(1L).getBalance()).isEqualTo(50.0);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+ }
+}
diff --git a/spring-boot-4/tx-local-sample/src/test/resources/db/postgresql/init-schemas.sql b/spring-boot-4/tx-local-sample/src/test/resources/db/postgresql/init-schemas.sql
new file mode 100644
index 00000000..a8af2c53
--- /dev/null
+++ b/spring-boot-4/tx-local-sample/src/test/resources/db/postgresql/init-schemas.sql
@@ -0,0 +1,3 @@
+CREATE SCHEMA IF NOT EXISTS local_order;
+CREATE SCHEMA IF NOT EXISTS local_account;
+CREATE SCHEMA IF NOT EXISTS local_product;
diff --git a/tx-samples/tx-seata-sample/README.md b/spring-boot-4/tx-seata-sample/README.md
similarity index 100%
rename from tx-samples/tx-seata-sample/README.md
rename to spring-boot-4/tx-seata-sample/README.md
diff --git a/tx-samples/tx-seata-sample/pom.xml b/spring-boot-4/tx-seata-sample/pom.xml
similarity index 73%
rename from tx-samples/tx-seata-sample/pom.xml
rename to spring-boot-4/tx-seata-sample/pom.xml
index a535566b..290a594e 100644
--- a/tx-samples/tx-seata-sample/pom.xml
+++ b/spring-boot-4/tx-seata-sample/pom.xml
@@ -3,7 +3,7 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- tx-samples
+ spring-boot-4-samples
com.baomidou
1.0.0
@@ -21,21 +21,20 @@
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot4-starter
- io.seata
+ org.apache.seata
seata-spring-boot-starter
- 1.7.0
+ 2.6.0
com.baomidou
- mybatis-plus-boot-starter
- 3.5.3.2
+ mybatis-plus-spring-boot4-starter
org.postgresql
@@ -62,5 +61,15 @@
spring-boot-starter-test
test
+
+ org.testcontainers
+ testcontainers-junit-jupiter
+ test
+
+
+ org.testcontainers
+ testcontainers-postgresql
+ test
+
\ No newline at end of file
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/SeataApplication.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/SeataApplication.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/SeataApplication.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/SeataApplication.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/common/OrderStatus.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/common/OrderStatus.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/common/OrderStatus.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/common/OrderStatus.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/config/GlobalExceptionHandler.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/config/GlobalExceptionHandler.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/config/GlobalExceptionHandler.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/config/GlobalExceptionHandler.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/controller/OrderController.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/controller/OrderController.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/controller/OrderController.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/controller/OrderController.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/dto/PlaceOrderRequest.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/dto/PlaceOrderRequest.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/dto/PlaceOrderRequest.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/dto/PlaceOrderRequest.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/dto/ReduceBalanceRequest.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/dto/ReduceBalanceRequest.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/dto/ReduceBalanceRequest.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/dto/ReduceBalanceRequest.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/dto/ReduceStockRequest.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/dto/ReduceStockRequest.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/dto/ReduceStockRequest.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/dto/ReduceStockRequest.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/entity/Account.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/entity/Account.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/entity/Account.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/entity/Account.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/entity/Order.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/entity/Order.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/entity/Order.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/entity/Order.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/entity/Product.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/entity/Product.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/entity/Product.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/entity/Product.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/mapper/AccountMapper.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/mapper/AccountMapper.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/mapper/AccountMapper.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/mapper/AccountMapper.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/mapper/OrderMapper.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/mapper/OrderMapper.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/mapper/OrderMapper.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/mapper/OrderMapper.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/mapper/ProductMapper.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/mapper/ProductMapper.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/mapper/ProductMapper.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/mapper/ProductMapper.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/AccountService.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/AccountService.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/AccountService.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/AccountService.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/OrderService.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/OrderService.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/OrderService.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/OrderService.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/ProductService.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/ProductService.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/ProductService.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/ProductService.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/impl/AccountServiceImpl.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/impl/AccountServiceImpl.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/impl/AccountServiceImpl.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/impl/AccountServiceImpl.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/impl/OrderServiceImpl.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/impl/OrderServiceImpl.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/impl/OrderServiceImpl.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/impl/OrderServiceImpl.java
diff --git a/tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/impl/ProductServiceImpl.java b/spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/impl/ProductServiceImpl.java
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/impl/ProductServiceImpl.java
rename to spring-boot-4/tx-seata-sample/src/main/java/com/baomidou/samples/seata/service/impl/ProductServiceImpl.java
diff --git a/tx-samples/tx-seata-sample/src/main/resources/application-mysql.yml b/spring-boot-4/tx-seata-sample/src/main/resources/application-mysql.yml
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/resources/application-mysql.yml
rename to spring-boot-4/tx-seata-sample/src/main/resources/application-mysql.yml
diff --git a/tx-samples/tx-seata-sample/src/main/resources/application-postgresql.yml b/spring-boot-4/tx-seata-sample/src/main/resources/application-postgresql.yml
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/resources/application-postgresql.yml
rename to spring-boot-4/tx-seata-sample/src/main/resources/application-postgresql.yml
diff --git a/tx-samples/tx-seata-sample/src/main/resources/application.yml b/spring-boot-4/tx-seata-sample/src/main/resources/application.yml
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/resources/application.yml
rename to spring-boot-4/tx-seata-sample/src/main/resources/application.yml
diff --git a/tx-samples/tx-seata-sample/src/main/resources/db/mysql/schema-account.sql b/spring-boot-4/tx-seata-sample/src/main/resources/db/mysql/schema-account.sql
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/resources/db/mysql/schema-account.sql
rename to spring-boot-4/tx-seata-sample/src/main/resources/db/mysql/schema-account.sql
diff --git a/tx-samples/tx-seata-sample/src/main/resources/db/mysql/schema-order.sql b/spring-boot-4/tx-seata-sample/src/main/resources/db/mysql/schema-order.sql
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/resources/db/mysql/schema-order.sql
rename to spring-boot-4/tx-seata-sample/src/main/resources/db/mysql/schema-order.sql
diff --git a/tx-samples/tx-seata-sample/src/main/resources/db/mysql/schema-product.sql b/spring-boot-4/tx-seata-sample/src/main/resources/db/mysql/schema-product.sql
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/resources/db/mysql/schema-product.sql
rename to spring-boot-4/tx-seata-sample/src/main/resources/db/mysql/schema-product.sql
diff --git a/tx-samples/tx-seata-sample/src/main/resources/db/mysql/undo_log.sql b/spring-boot-4/tx-seata-sample/src/main/resources/db/mysql/undo_log.sql
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/resources/db/mysql/undo_log.sql
rename to spring-boot-4/tx-seata-sample/src/main/resources/db/mysql/undo_log.sql
diff --git a/tx-samples/tx-seata-sample/src/main/resources/db/postgresql/schema-account.sql b/spring-boot-4/tx-seata-sample/src/main/resources/db/postgresql/schema-account.sql
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/resources/db/postgresql/schema-account.sql
rename to spring-boot-4/tx-seata-sample/src/main/resources/db/postgresql/schema-account.sql
diff --git a/tx-samples/tx-seata-sample/src/main/resources/db/postgresql/schema-order.sql b/spring-boot-4/tx-seata-sample/src/main/resources/db/postgresql/schema-order.sql
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/resources/db/postgresql/schema-order.sql
rename to spring-boot-4/tx-seata-sample/src/main/resources/db/postgresql/schema-order.sql
diff --git a/tx-samples/tx-seata-sample/src/main/resources/db/postgresql/schema-product.sql b/spring-boot-4/tx-seata-sample/src/main/resources/db/postgresql/schema-product.sql
similarity index 100%
rename from tx-samples/tx-seata-sample/src/main/resources/db/postgresql/schema-product.sql
rename to spring-boot-4/tx-seata-sample/src/main/resources/db/postgresql/schema-product.sql
diff --git a/spring-boot-4/tx-seata-sample/src/test/java/com/baomidou/samples/seata/test/SeataSampleTest.java b/spring-boot-4/tx-seata-sample/src/test/java/com/baomidou/samples/seata/test/SeataSampleTest.java
new file mode 100644
index 00000000..0061405e
--- /dev/null
+++ b/spring-boot-4/tx-seata-sample/src/test/java/com/baomidou/samples/seata/test/SeataSampleTest.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright © ${project.inceptionYear} organization baomidou
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.samples.seata.test;
+
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.samples.seata.dto.PlaceOrderRequest;
+import com.baomidou.samples.seata.entity.Account;
+import com.baomidou.samples.seata.entity.Order;
+import com.baomidou.samples.seata.entity.Product;
+import com.baomidou.samples.seata.mapper.AccountMapper;
+import com.baomidou.samples.seata.mapper.OrderMapper;
+import com.baomidou.samples.seata.mapper.ProductMapper;
+import com.baomidou.samples.seata.service.OrderService;
+import org.junit.jupiter.api.AfterEach;
+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.ActiveProfiles;
+import org.springframework.test.context.DynamicPropertyRegistry;
+import org.springframework.test.context.DynamicPropertySource;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+import org.testcontainers.utility.DockerImageName;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+@Testcontainers
+@SpringBootTest
+@ActiveProfiles("postgresql")
+class SeataSampleTest {
+
+ @Container
+ static PostgreSQLContainer> postgres = new PostgreSQLContainer<>(DockerImageName.parse("postgres:16-alpine"))
+ .withInitScript("db/postgresql/init-schemas.sql");
+
+ @Container
+ static GenericContainer> seataServer = new GenericContainer<>(DockerImageName.parse("apache/seata-server:2.6.0"))
+ .withExposedPorts(8091)
+ .waitingFor(Wait.forListeningPort());
+
+ @DynamicPropertySource
+ static void datasourceProperties(DynamicPropertyRegistry registry) {
+ registry.add("spring.datasource.dynamic.datasource.order.url", postgres::getJdbcUrl);
+ registry.add("spring.datasource.dynamic.datasource.order.username", postgres::getUsername);
+ registry.add("spring.datasource.dynamic.datasource.order.password", postgres::getPassword);
+ registry.add("spring.datasource.dynamic.datasource.account.url", postgres::getJdbcUrl);
+ registry.add("spring.datasource.dynamic.datasource.account.username", postgres::getUsername);
+ registry.add("spring.datasource.dynamic.datasource.account.password", postgres::getPassword);
+ registry.add("spring.datasource.dynamic.datasource.product.url", postgres::getJdbcUrl);
+ registry.add("spring.datasource.dynamic.datasource.product.username", postgres::getUsername);
+ registry.add("spring.datasource.dynamic.datasource.product.password", postgres::getPassword);
+ registry.add("seata.service.grouplist.default",
+ () -> seataServer.getHost() + ":" + seataServer.getMappedPort(8091));
+ }
+
+ @Autowired
+ private OrderService orderService;
+
+ @Autowired
+ private OrderMapper orderMapper;
+
+ @Autowired
+ private AccountMapper accountMapper;
+
+ @Autowired
+ private ProductMapper productMapper;
+
+ @AfterEach
+ void cleanUp() {
+ DynamicDataSourceContextHolder.push("order");
+ try {
+ orderMapper.delete(null);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+ DynamicDataSourceContextHolder.push("product");
+ try {
+ Product product = productMapper.selectById(1);
+ product.setStock(20);
+ productMapper.updateById(product);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+ DynamicDataSourceContextHolder.push("account");
+ try {
+ Account account = accountMapper.selectById(1L);
+ account.setBalance(50.0);
+ accountMapper.updateById(account);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+ }
+
+ @Test
+ void placeOrderSuccess() {
+ orderService.placeOrder(new PlaceOrderRequest(1L, 1L, 2));
+
+ DynamicDataSourceContextHolder.push("order");
+ try {
+ assertThat(orderMapper.selectCount(null)).isEqualTo(1);
+ Order order = orderMapper.selectList(null).get(0);
+ assertThat(order.getStatus().name()).isEqualTo("SUCCESS");
+ assertThat(order.getTotalPrice()).isEqualTo(20.0);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+
+ DynamicDataSourceContextHolder.push("product");
+ try {
+ assertThat(productMapper.selectById(1).getStock()).isEqualTo(18);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+
+ DynamicDataSourceContextHolder.push("account");
+ try {
+ assertThat(accountMapper.selectById(1L).getBalance()).isEqualTo(30.0);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+ }
+
+ @Test
+ void placeOrderRollbackOnInsufficientBalance() {
+ // 总价 100 超过预置的余额 50,seata 全局事务必须回滚。
+ assertThatThrownBy(() -> orderService.placeOrder(new PlaceOrderRequest(1L, 1L, 10)))
+ .isInstanceOf(RuntimeException.class);
+
+ DynamicDataSourceContextHolder.push("order");
+ try {
+ assertThat(orderMapper.selectCount(null)).isZero();
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+
+ DynamicDataSourceContextHolder.push("product");
+ try {
+ assertThat(productMapper.selectById(1).getStock()).isEqualTo(20);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+
+ DynamicDataSourceContextHolder.push("account");
+ try {
+ assertThat(accountMapper.selectById(1L).getBalance()).isEqualTo(50.0);
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+ }
+}
diff --git a/spring-boot-4/tx-seata-sample/src/test/resources/db/postgresql/init-schemas.sql b/spring-boot-4/tx-seata-sample/src/test/resources/db/postgresql/init-schemas.sql
new file mode 100644
index 00000000..be93f581
--- /dev/null
+++ b/spring-boot-4/tx-seata-sample/src/test/resources/db/postgresql/init-schemas.sql
@@ -0,0 +1,3 @@
+CREATE SCHEMA IF NOT EXISTS seata_order;
+CREATE SCHEMA IF NOT EXISTS seata_account;
+CREATE SCHEMA IF NOT EXISTS seata_product;
diff --git a/third-part-samples/pom.xml b/third-part-samples/pom.xml
deleted file mode 100644
index 71e35e34..00000000
--- a/third-part-samples/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
- dynamic-datasource-samples
- com.baomidou
- 1.0.0
-
- 4.0.0
- third-part-samples
- pom
-
- quartz-sample
- shardingsphere-sample
-
-
\ No newline at end of file
diff --git a/third-part-samples/shardingsphere-sample/pom.xml b/third-part-samples/shardingsphere-sample/pom.xml
deleted file mode 100644
index 83cdecc8..00000000
--- a/third-part-samples/shardingsphere-sample/pom.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
- third-part-samples
- com.baomidou
- 1.0.0
-
- 4.0.0
- shardingsphere-sample
- pom
-
- shardingsphere-jdbc-5.x-spring-sample
- shardingsphere-jdbc-4.x-spring-sample
- shardingsphere-jdbc-5.x-core-sample
-
-
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/config/MyDataSourceConfiguration.java b/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/config/MyDataSourceConfiguration.java
deleted file mode 100644
index e88fabad..00000000
--- a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/java/com/baomidou/samples/shardingsphere/jdbc/v5/spring/config/MyDataSourceConfiguration.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright © ${project.inceptionYear} organization baomidou
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.baomidou.samples.shardingsphere.jdbc.v5.spring.config;
-
-import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
-import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
-import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
-import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
-import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-
-import javax.sql.DataSource;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@Configuration
-public class MyDataSourceConfiguration {
- private final DynamicDataSourceProperties properties;
- private final DefaultDataSourceCreator dataSourceCreator;
- private final DataSource shardingSphereDataSource;
-
- /**
- * 1. 建议 spring-boot 2.5.0 以下版本或者发现不加 `@Lazy`, `DataSource shardingSphereDataSource` 是 null 的情况都打开 `@Lazy`
- * 2. 与使用 Spring Boot Starter 相比,如果开发者遇到此类问题,
- * 开发者应该直接使用 ShardingSphere 的 JDBC Driver 将其配置为 JDBC 数据源,即:
- * 使用 `org.apache.shardingsphere:shardingsphere-jdbc-core:5.2.1` 而不是 `org.apache.shardingsphere:shardingsphere-jdbc-core-spring-boot-starter:5.2.1`。
- * 更多信息请参阅 JDBC Driver
- *
- * @see org.springframework.context.annotation.Lazy
- * @see org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource
- */
- public MyDataSourceConfiguration(DynamicDataSourceProperties properties,
- DefaultDataSourceCreator dataSourceCreator,
- @Qualifier("shardingSphereDataSource") DataSource shardingSphereDataSource) {
- this.properties = properties;
- this.dataSourceCreator = dataSourceCreator;
- this.shardingSphereDataSource = shardingSphereDataSource;
- }
-
- @Bean
- public DynamicDataSourceProvider dynamicDataSourceProvider() {
- return new AbstractDataSourceProvider(dataSourceCreator) {
- @Override
- public Map loadDataSources() {
- Map dataSourceMap = new HashMap<>();
- // 把 shardingSphereDataSource 加入多数据源,到时候使用的时候就可以 `@DS("shardingSphere")`
- dataSourceMap.put("shardingSphere", shardingSphereDataSource);
- return dataSourceMap;
- }
- };
- }
-
- /**
- * 将 dynamic-datasource 设置为首选的
- * 当 Spring 存在多个数据源时, 自动注入的是首选的对象
- * 设置为主要的数据源之后,就可以支持 shardingSphere 原生的配置方式了
- */
- @Primary
- @Bean
- public DataSource dataSource(List providers) {
- DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource(providers);
- dataSource.setPrimary(properties.getPrimary());
- dataSource.setStrict(properties.getStrict());
- dataSource.setStrategy(properties.getStrategy());
- dataSource.setP6spy(properties.getP6spy());
- dataSource.setSeata(properties.getSeata());
- return dataSource;
- }
-}
diff --git a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/resources/application.yml b/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/resources/application.yml
deleted file mode 100644
index b91c603a..00000000
--- a/third-part-samples/shardingsphere-sample/shardingsphere-jdbc-5.x-spring-sample/src/main/resources/application.yml
+++ /dev/null
@@ -1,72 +0,0 @@
-spring:
- shardingsphere:
- datasource:
- names: shardingmaster,shardingslave0,shardingslave1
- shardingmaster:
- type: com.zaxxer.hikari.HikariDataSource
- driver-class-name: org.h2.Driver
- jdbc-url: jdbc:h2:mem:master;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'
- username: sa
- password:
- shardingslave0:
- type: com.zaxxer.hikari.HikariDataSource
- driver-class-name: org.h2.Driver
- jdbc-url: jdbc:h2:mem:slave1;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'
- username: sa
- password:
- shardingslave1:
- type: com.zaxxer.hikari.HikariDataSource
- driver-class-name: org.h2.Driver
- jdbc-url: jdbc:h2:mem:slave2;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'
- username: sa
- password:
- rules:
- sharding:
- tables:
- t_order:
- actualDataNodes: shardingmaster.t_order$->{0..1}
- table-strategy:
- standard:
- sharding-column: order_id
- sharding-algorithm-name: baomidou_inline
- key-generate-strategy:
- column: order_id
- key-generator-name: baomidou_snowflake
- sharding-algorithms:
- baomidou_inline:
- type: INLINE
- props:
- algorithm-expression: t_order$->{order_id % 2}
- allow-range-query-with-inline-sharding: true
- key-generators:
- baomidou_snowflake:
- type: SNOWFLAKE
- readwrite-splitting:
- data-sources:
- baomidou_readwrite_data_sources:
- static-strategy:
- write-data-source-name: shardingmaster
- read-data-source-names: shardingslave0,shardingslave1
- load-balancer-name: baomidou_load_balance_algorithm
- load-balancers:
- baomidou_load_balance_algorithm:
- type: ROUND_ROBIN
- props:
- sql-show: true
- # dynamic-datasource 配置
- datasource:
- dynamic:
- datasource:
- master:
- driver-class-name: org.h2.Driver
- url: jdbc:h2:mem:baomidou_master;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'
- username: sa
- password: ""
- test:
- driver-class-name: org.h2.Driver
- url: jdbc:h2:mem:baomidou_test;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'
- username: sa
- password: ""
-logging:
- level:
- com.baomidou: debug
diff --git a/tx-samples/pom.xml b/tx-samples/pom.xml
deleted file mode 100644
index 3d786ab4..00000000
--- a/tx-samples/pom.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- dynamic-datasource-samples
- com.baomidou
- 1.0.0
-
-
- 4.0.0
-
- tx-samples
- pom
-
-
- tx-local-sample
- tx-seata-sample
-
-
-
\ No newline at end of file