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 -
${user.dir}/license.txt
+
${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