# dynamic-datasource **Repository Path**: Lee_SmallNorth/dynamic-datasource ## Basic Information - **Project Name**: dynamic-datasource - **Description**: 不同角色根据不同用户名密码访问数据库 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-23 - **Last Updated**: 2026-01-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 动态数据源切换项目 本项目是一个基于 Spring Boot + MyBatis Plus 的动态数据源切换解决方案,支持在运行时根据用户类型动态切换数据源。 ## 项目简介 在实际业务场景中,我们经常需要根据不同的业务需求访问不同的数据库。本项目实现了通过拦截器自动识别用户类型,并在请求处理过程中动态切换数据源的功能。系统预置了管理员(admin)和普通用户(user)两套数据源配置,可根据实际需求扩展。 ## 技术栈 - **Spring Boot** - 应用框架 - **MyBatis Plus** - ORM 框架 - **HikariCP** - 高性能数据库连接池 - **Spring MVC** - Web 框架 ## 核心功能 - **动态数据源切换**:根据用户类型自动切换到对应的数据源 - **透明化集成**:对业务代码无侵入,通过注解和拦截器自动完成切换 - **多数据源支持**:支持配置任意数量的数据源 - **事务管理**:确保跨数据源操作的事务一致性 ## 快速开始 ### 环境要求 - JDK 1.8 或更高版本 - Maven 3.0+ - MySQL 5.7+ ### 配置文件 在 `src/main/resources/application.yml` 中配置数据源信息: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/your_database driver-class-name: com.mysql.cj.jdbc.Driver admin: username: admin账户 password: admin密码 user: username: user账户 password: user密码 ``` ### 运行项目 ```bash mvn spring-boot:run ``` ## 使用说明 ### 数据源切换原理 1. 客户端请求到达 `DataSourceInterceptor` 拦截器 2. 拦截器根据请求参数或用户信息确定目标数据源类型 3. 将数据源类型设置到 `DataSourceContextHolder`(线程本地存储) 4. `DynamicDataSource` 根据上下文中的数据源类型查找对应连接 5. 请求完成后自动清理上下文,避免内存泄漏 ### API 接口 获取用户列表: ``` GET /api/list ``` ## 扩展指南 ### 添加新的数据源 1. 在 `application.yml` 中添加新数据源配置 2. 在 `DataSourceConfig` 中创建对应的 DataSource Bean 3. 在 `DynamicDataSource` 的 targetDataSources 中注册新数据源 4. 在 `UserType` 枚举中添加新类型 5. 根据业务需求更新拦截器逻辑 ### 自定义数据源切换策略 可通过修改 `DataSourceInterceptor` 或 `DataSourceContextHolder` 实现更复杂的切换逻辑,例如: - 基于请求路径 - 基于请求头信息 - 基于登录用户信息 ## 项目结构 ``` src/main/java/com/example/ ├── DynamicDatasourceApplication.java # 启动类 ├── config/ # 配置类 │ ├── DataSourceConfig.java # 数据源配置 │ ├── MyBatisPlusConfig.java # MyBatis Plus配置 │ └── WebConfig.java # Web配置 ├── context/ # 上下文管理 │ ├── DataSourceContextHolder.java # 数据源上下文持有者 │ └── DynamicDataSource.java # 动态数据源实现 ├── controller/ # 控制器 │ └── DynamicDataSourceController.java # API接口 ├── entity/ # 实体类 │ └── SysUser.java # 用户实体 ├── enums/ # 枚举 │ └── UserType.java # 用户类型枚举 ├── handle/ # 处理器 │ └── DataSourceInterceptor.java # 数据源拦截器 ├── mapper/ # Mapper接口 │ └── SysUserMapper.java # 用户Mapper └── service/ # 服务层 ├── ISysUserService.java # 服务接口 └── impl/ └── SysUserServiceImpl.java # 服务实现 ``` ## 注意事项 - 数据源切换对事务有影响,应避免在事务内切换数据源 - 确保数据库连接配置正确,避免连接失败 - 建议为不同数据源创建独立的数据库用户并分配最小必要权限 ## 许可证 本项目仅供学习参考使用。