# SDR **Repository Path**: yeahsj/sdr ## Basic Information - **Project Name**: SDR - **Description**: SDR (SQL Dialect Rewriter) 是一个基于 Spring Boot 构建的强大 SQL 方言转换工具,用于在不同数据库系统的 SQL 方言之间进行无缝转换。该工具集成了 Apache Calcite 解析引擎,确保转换的准确性和兼容性。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2026-01-22 - **Last Updated**: 2026-01-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SDR (SQL Dialect Rewriter) - SQL 方言自动转换工具 ## 项目背景与核心价值 ### 国产化数据库是趋势 随着国家对信息技术自主可控的重视,越来越多的项目需要从传统数据库(如 Oracle、MySQL)迁移到国产数据库(如达梦、人大金仓、南大通用等)。这一趋势在金融、政务、能源等关键领域尤为明显。 ### 传统迁移方式的痛点 传统项目进行国产化数据库迁移时,面临着 SQL 方言差异、函数不兼容、分页语法不同等问题,需要大量的代码修改和测试工作,耗时耗力,项目风险高。 ### SDR 的核心价值 **简单引入,无需修改代码**:只需要在项目中引入 SDR 依赖,即可实现 SQL 方言的自动转换,无需修改现有代码,大幅降低了迁移成本和风险。 **透明集成,零配置使用**:基于 Spring Boot 自动配置,提供 DataSource 代理,实现 SQL 执行前的透明转换,开发者感受不到任何变化。 **过渡阶段的完美解决方案**:作为国产化数据库迁移的过渡阶段工具,让您的项目先跑通,再逐步优化,降低了迁移的技术门槛。 **强大的转换能力**:基于 Apache Calcite 解析引擎,支持复杂 SQL 语句的转换,包括 JOIN、聚合函数、分组查询等高级功能。 **模块化架构**:采用 SPI 扩展机制,每个转换模块独立开发和部署,用户可按需引入,实现零配置集成。 ## 项目概述 SDR (SQL Dialect Rewriter) 是一个基于 Spring Boot 构建的强大 SQL 方言转换工具,用于在不同数据库系统的 SQL 方言之间进行无缝转换。该工具集成了 Apache Calcite 解析引擎,确保转换的准确性和兼容性。 ## 项目架构 ### 核心模块架构 SDR 采用模块化架构设计,主要包含以下核心模块: - **converter-core**:SQL 解析和转换的核心引擎,提供统一的接口和实现 - **converter-api**:对外暴露的 API 接口,方便集成到其他系统 - **converter-modules**:所有 SQL 方言转换模块的父模块,包含以下子模块: - converter-oracle-mysql:Oracle 到 MySQL 的 SQL 转换模块 - converter-mysql-oracle:MySQL 到 Oracle 的 SQL 转换模块 - converter-mysql-dameng:MySQL 到达梦的 SQL 转换模块 - converter-mysql-kingbase:MySQL 到人大金仓的 SQL 转换模块 - converter-mysql-postgresql:MySQL 到 PostgreSQL 的 SQL 转换模块 - converter-mysql-sqlserver:MySQL 到 SQL Server 的 SQL 转换模块 - converter-mysql-db2:MySQL 到 DB2 的 SQL 转换模块 - converter-mysql-gbase:MySQL 到南大通用的 SQL 转换模块 - converter-mysql-shentong:MySQL 到神州通用的 SQL 转换模块 - **converter-spring-boot-starter**:Spring Boot 自动配置和 DataSource 代理 - **converter-test**:测试和示例应用,包含 REST API 服务 ### SPI 扩展机制 所有转换模块都基于 Java SPI (Service Provider Interface) 机制实现,允许用户根据需要引入相应的转换模块,实现零配置集成。 ## 功能特性 ### ✅ 已实现功能 - **Apache Calcite 解析引擎**:强大的 SQL 解析/验证/生成框架,支持跨方言处理 - **REST API 服务**:提供简洁的 HTTP 接口,支持快速集成到现有系统 - **语义保留**:确保转换后的 SQL 保持原始语义不变 - **Java 17 兼容**:支持 Java 17 及以上版本 - **轻量级部署**:基于 Spring Boot,可快速部署和启动 - **复杂查询转换**:支持包含连接(JOIN)、聚合函数(COUNT/SUM)、GROUP BY、HAVING 和 ORDER BY 的复杂 SQL 语句转换 - **SPI 扩展架构**:基于 Java SPI 实现模块化的方言转换器,用户可按需引入转换模块 - **分页转换**:将 Oracle 的 `ROWNUM` 和 `OFFSET/FETCH` 分页转换为 MySQL 的 `LIMIT/OFFSET` 格式,或 MySQL 的 LIMIT/OFFSET 转换为 ROWNUM 格式,以及其他数据库的分页语法转换 - **模块化转换器**:支持 Oracle→MySQL、MySQL→Oracle、MySQL→Dameng(达梦)、MySQL→Kingbase(人大金仓)、MySQL→PostgreSQL、MySQL→SQL Server、MySQL→DB2、MySQL→GBase(南大通用)和 MySQL→ShenTong(神州通用)方言转换模块 - **Spring Boot DataSource 代理**:自动代理 DataSource,实现 SQL 执行前的透明转换,无需修改现有代码 - **自动配置**:提供 Spring Boot 自动配置,用户可零配置使用核心功能 - **列名大小写处理**:自动将 SQL 标识符(列名、表名)转换为小写,以匹配 MySQL 数据库的实际列名 - **函数转换**:支持常见函数的转换,如 COALESCE、NOW()、DATE_ADD 等在不同数据库之间的转换 - **批量转换支持**:提供批量 SQL 转换功能,提高处理效率 - **转换历史记录**:记录转换历史,支持查询和分析 - **健康检查接口**:提供应用程序健康状态检查功能 ### 📅 计划实现功能 - **JDK 8 兼容性优化**:提供对 JDK 8 的支持,以便更多老项目能够使用该工具 - **函数转换增强**:扩展函数转换规则,包括 `TO_CHAR` → `DATE_FORMAT`、`TO_DATE` → `STR_TO_DATE` 等 - **关键字处理**:自动识别并处理目标数据库的保留关键字(如添加反引号) - **多方言扩展**:增强对 PostgreSQL、SQL Server 等其他数据库方言的支持 - **批量转换**:支持批量 SQL 转换,提高处理效率 - **转换历史**:记录转换历史,支持查询和分析 - **可视化界面**:提供 Web 可视化界面,方便用户进行 SQL 转换操作 ## 支持的数据库方言 当前版本主要支持以下方言转换: - **Oracle → MySQL**:重点优化了分页和列名大小写处理 - **MySQL → Oracle**:支持基本查询、分页查询和函数转换(如 DATE_ADD 函数) - **MySQL → Dameng(达梦)**:支持基本查询、分页查询(使用 ROWNUM 方式与 Oracle 保持一致)和函数转换 - **MySQL → Kingbase(人大金仓)**:支持基本查询、分页查询和函数转换,为国产化数据库迁移提供支持 - **MySQL → PostgreSQL**:支持基本查询、分页查询和函数转换 - **MySQL → SQL Server**:支持基本查询、分页查询和函数转换 - **MySQL → DB2**:支持基本查询、分页查询和函数转换 - **MySQL → GBase(南大通用)**:支持基本查询、分页查询和函数转换 - **MySQL → ShenTong(神州通用)**:支持基本查询、分页查询和函数转换 每个转换模块都包含以下核心功能: - SQL 解析与验证 - 方言特性识别 - SQL 节点转换 - 正则表达式匹配与替换 - 生成目标方言的 SQL 语句 ## 快速开始 ### 系统要求 - Java 17 或以上版本 - Maven 3.6.0 或以上版本 ### 从源码构建和运行 ```bash # 克隆仓库 git clone https://github.com/finpire/sdr.git cd sdr # 构建所有模块(跳过测试快速构建) mvn clean install -DskipTests # 运行 REST API 服务和测试应用 cd converter-test mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Djava.home=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home" ``` ### 测试应用 应用启动后,可以通过以下 URL 访问: - 健康检查:http://localhost:8080/api/test/health - 用户查询(测试 MyBatis 操作):http://localhost:8080/api/test/users - SQL 转换接口:http://localhost:8080/api/test/convert(POST 请求) ### 使用示例 以下是通过 REST API 进行 SQL 转换的示例: ```bash curl -X POST http://localhost:8080/api/test/convert/custom \ -H "Content-Type: application/json" \ -d '{ "sql": "SELECT id, name, email, created_at FROM users WHERE active = 1 ORDER BY created_at DESC LIMIT 10 OFFSET 5", "sourceDialect": "mysql", "targetDialect": "oracle" }' ``` 该请求将 MySQL 方言的 SQL 转换为 Oracle 方言的 SQL。 ## 使用方法 ### Spring Boot Starter 集成 在您的 Spring Boot 项目的 `pom.xml` 中添加以下依赖: ```xml com.example converter-spring-boot-starter 1.0.0 ``` 添加依赖后,Spring Boot 会自动配置 `SqlConverter` 作为 Spring Bean,您可以直接在代码中注入使用。 ### REST API 接口 #### 测试 MyBatis 操作(展示实际效果) ```http GET /api/test/users ``` **响应示例**: ```json [ { "id": 1, "username": "testuser1", "email": "testuser1@example.com", "phone": null, "createdAt": "2026-01-04T22:13:47.000+00:00", "updatedAt": "2026-01-04T22:13:47.000+00:00", "status": 1 }, { "id": 2, "username": "testuser2", "email": "testuser2@example.com", "phone": null, "createdAt": "2026-01-04T22:13:47.000+00:00", "updatedAt": "2026-01-04T22:13:47.000+00:00", "status": 1 } ] ``` **效果说明**: 项目测试应用中使用的 `UserMapper.xml` 包含了以下 Oracle 方言的 SQL 查询,但配置的是 MySQL 数据库: ```sql SELECT * FROM ( SELECT t.*, ROWNUM rn FROM ( SELECT id, username, email, phone, created_at, updated_at, status FROM users ORDER BY id ) t WHERE ROWNUM <= 100 ) WHERE rn > 0 ``` 当调用 `/api/test/users` 接口时,SDR 工具会自动将 Oracle 方言的 SQL 转换为 MySQL 方言的 SQL: ```sql -- 自动转换后的 MySQL 方言 SQL SELECT id, username, email, phone, created_at, updated_at, status FROM users ORDER BY id LIMIT 100 OFFSET 0 ``` 这样,您的项目可以继续使用现有的 Oracle 方言 SQL 代码,而无需修改任何代码,即可正常运行在 MySQL 数据库上。同样的原理也适用于 MySQL 到国产数据库(如达梦、人大金仓)的转换。 ## 技术栈 - **Spring Boot 2.7.18**:快速构建 REST API 服务 - **Apache Calcite 1.41.0**:强大的 SQL 解析/验证/生成框架,支持跨方言处理 - **Java 17**:项目编译和运行时需要使用 Java 17 - **Maven**:项目依赖和构建管理 - **MyBatis**:持久层框架,用于测试 SQL 改写功能 - **MySQL Connector**:MySQL 数据库连接驱动 - **SLF4J & Logback**:日志框架 - **Gson**:JSON 序列化库 ## 许可证 本项目采用 Apache License 2.0 - 查看 [LICENSE](LICENSE) 文件了解详情。 ## 联系方式 - 项目主页: https://github.com/finpire/sdr - 问题反馈: https://github.com/finpire/sdr/issues - 技术讨论: https://github.com/finpire/sdr/discussions - 贡献指南: 欢迎提交 Issue 和 Pull Request 来改进项目 --- **版本**: 1.0.0 **发布日期**: 2026-01-06 **作者**: Finpire Team