# spring_r2dbc **Repository Path**: wuyuan/spring_r2dbc ## Basic Information - **Project Name**: spring_r2dbc - **Description**: springwebmvc 整合 r2dbc 和 jpa 混编 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-12 - **Last Updated**: 2026-04-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring R2DBC 一个支持 R2DBC(响应式关系型数据库映射)和 JPA 双数据源的 Spring Boot 混合项目。 ## 项目简介 本项目演示了如何在同一个 Spring Boot 应用中同时使用 R2DBC(响应式)和 JPA(阻塞式)两种数据库访问技术。通过 `CoroutineBridge` 组件实现协程与阻塞式操作之间的桥接,支持在响应式编程和传统阻塞式编程之间灵活切换。 ## 技术栈 - **Spring Boot** - 应用框架 - **R2DBC** - 响应式关系型数据库映射 - **Kotlin** - 开发语言 - **Coroutines** - 协程支持 - **JPA** - 传统持久化 API(双数据源支持) ## 主要功能 ### 双数据源支持 - **R2DBC 数据源**:响应式数据库操作,适用于高性能场景 - **JPA 数据源**:传统阻塞式操作,兼容现有业务逻辑 ### 协程桥接 通过 `CoroutineBridge` 组件实现: - `findById` - 根据 ID 查询 - `save` / `saveAll` - 保存实体 - `deleteById` - 删除实体 - `findAll` - 查询所有 - `count` - 计数 - `existsById` - 检查是否存在 ### REST API - `/users/{id}` - R2DBC 用户接口 - `/ujpa/{id}` - JPA 用户接口 ## 快速开始 ### 环境要求 - JDK 11+ - Maven 3.6+ ### 构建运行 ```bash mvn clean install mvn spring-boot:run ``` ### 配置说明 在 `application.yml` 中配置数据源: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/yourdb username: your_username password: your_password r2dbc: url: r2dbc:mysql://localhost:3306/yourdb username: your_username password: your_password ``` ## 项目结构 ``` src/main/java/com/podman/spring_r2dbc/ ├── SpringR2dbcApplication.java # 主启动类 ├── bridge/ │ └── CoroutineBridge.kt # 协程桥接组件 ├── config/ │ └── JpaConfig.kt # JPA 配置 ├── controller/ │ ├── UserControllerExt.kt # R2DBC 控制器 │ └── UserJpaController.kt # JPA 控制器 ├── entity/ │ └── User.kt # R2DBC 实体 ├── jpa/ │ ├── entity/ │ │ └── Users.kt # JPA 实体 │ └── repository/ │ └── UserRe.java # JPA 仓库 ├── repository/ │ └── UserRepository.kt # R2DBC 仓库 └── ext/ ├── RepositoryExtensions.kt # 仓库扩展 └── JpaUtils.kt # JPA 工具类 ``` ## 使用示例 ### 使用 R2DBC 仓库 ```kotlin @Autowired lateinit var userRepository: UserRepository suspend fun getUser(id: Long): User? { return userRepository.findById(id) } ``` ### 使用协程桥接 ```kotlin @Autowired lateinit var coroutineBridge: CoroutineBridge fun getUserSync(id: Long): Completable