
最近发现一个叫 Anyline 的 Java 中间件,主要解决的问题是统一操作各种不同类型的数据源。
做开发时,我们通常会用 MyBatis 或 Hibernate 操作固定的数据库(比如 MySQL)。但在做低代码平台、数据中台、灵活查询或者报表工具时,情况就不一样了。用户可能除了原来主流的 Oracle、mysql、postgresql、sql server 数据库,还要使用 TDSQL、Gbase8A(南大通用)、Gbase8S(南大通用)、 高斯、postgresql 、Tidb 、 OceanBase、 达梦、oscar(神州通用)、GoldenDB、PolarDB 等国产数据库,还可能会用 ElasticSearch、MongoDB、Neo4j 等非关系型数据库,总之客户是上帝,客户说用啥就用啥
如果针对每种数据库都去写一套驱动连接和 SQL 拼装,工作量太大。Anyline 做的就是把这些差异抹平,用一套 Java 代码操作几百种数据源。
项目地址:
Gitee: https://gitee.com/anyline/anyline
Github: https://github.com/anylineorg/anyline
官网: http://www.anyline.org
快速开始: http://doc.anyline.org/ss/49_18
它支持 469 种数据源。这个数字不仅包含常见的数据库,也包含很多冷门的、国产的数据库以及非数据库类的数据来源。
数据库支持列表:doc.anyline.org/dbs

核心功能与支持范围
Anyline 不是要替代 MyBatis,它更多是用在动态性要求很高的场景。
支持的数据库种类:
- 关系型数据库:MySQL, PostgreSQL, Oracle, SQL Server, DB2, MariaDB 等主流数据库。
- 国产数据库:达梦(DM)、人大金仓(Kingbase)、神舟通用(Oscar)、南大通用(GBase)、TiDB、OceanBase、OpenGauss 等。
- 大数据与列式存储:Hive, HBase, ClickHouse, Cassandra。
- 时序数据库:InfluxDB, IoTDB, TDengine。
- 搜索与文档:ElasticSearch、EasySearch, MongoDB。
- 向量数据库:chroma、faiss、milvus、pinecone、qdrant、vald、vearch、vespa、weaviate。
- 特殊数据源:coze、difi、ragflow 等 AI 接口当作一个“表”来查询。
适用场景:
- 低代码/零代码平台:用户拖拽生成表单,后台自动在数据库建表、改字段。
- 数据同步工具:从 MySQL 读数据,写入到 Oracle,不用管两者的 SQL 方言差异。
- SaaS 多租户:每个租户可能使用不同的数据库类型。
- 动态报表:运行时决定查哪个库、哪张表。
引入与配置
Anyline 是一个 Java 依赖库,支持 Spring Boot。
Maven 依赖:
在 pom.xml 中统一下版本定义:
<properties>
<anyline.version>8.7.3-20260202</anyline.version>
</properties>
如果是 Spring Boot 项目,然后按需引入需要的数据库实现即可。
<!-- Source: https://mvnrepository.com/artifact/org.anyline/anyline-environment-spring-boot -->
<!-- 只有spring环境才需要这个 其他环境参考 http://doc.anyline.org/aa/2f_3951 -->
<dependency>
<groupId>org.anyline</groupId>
<artifactId>anyline-environment-spring-boot</artifactId>
<version>${anyline.version}</version> <!-- 去官网查看最新版本 -->
</dependency>
<!--引入需要的数据库适配器 -->
<dependency>
<groupId>org.anyline</groupId>
<artifactId>anyline-data-jdbc-gaussdb</artifactId>
<version>${anyline.version}</version>
</dependency>
<dependency>
<groupId>org.anyline</groupId>
<artifactId>anyline-data-jdbc-postgresql</artifactId>
<version>${anyline.version}</version>
</dependency>
<!--引入数据库需要的jdbc 驱动包 ,去 anyline-data-jdbc-xxx 中看一下引入的驱动依赖,一般里面都声明了 provided 的作用域,手动引入一下即可-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
支持全平台:
只要你的环境能跑 JDK 1.8+,就能运行,Windows、macOS、Linux (CentOS, Ubuntu, Debian 等) 均可。JDK17、JDK21 有专门的版本支持,去maven仓库查看即可
代码示例
Anyline 的核心操作对象是 AnylineService 和 DataSet(类似于 List
1. 最简单的查询与插入
不需要写 Entity 实体类,不需要写 Mapper 文件。
@Autowired
private AnylineService service;
public void demo() {
// 插入数据:自动识别数据库类型生成 SQL
DataRow row = new DataRow();
row.put("name", "张三");
row.put("age", 25);
service.insert("user_table", row);
// 查询数据:返回 DataSet 集合
// 相当于 SELECT * FROM user_table WHERE age > 20
ConfigStore configs = new DefaultConfigStore();
configs.and("age", Compare.GREATER, 20);
DataSet set = service.querys("user_table", configs);
//或者
// 查询数据,直接返回 DataRow 集合
//DataSet set = service.querys("user_info", "AGE > 20");
// 取值
for(DataRow r : set){
System.out.println(r.getString("name"));
}
}
2. 动态切换数据源
这是它最强的地方。你可以在代码运行时,通过字符串 key 切换到完全不同的数据库。
// 注册一个新的数据源(通常从配置文件或数据库读取连接信息)
// 比如这里注册一个 ClickHouse 数据源
Map<String, String> params = new HashMap<>();
params.put("url", "jdbc:clickhouse://127.0.0.1:8123/default");
params.put("driver", "com.clickhouse.jdbc.ClickHouseDriver");
// ...其他账号密码参数
DataSourceHolder.reg("my_clickhouse", params);
// 临时切换到 ClickHouse 查询
// 这里的 "crm_user" 表位于 ClickHouse 中
DataSet result = service.querys("my_clickhouse", "crm_user");
3. 读取数据库元数据(低代码必备)
做低代码平台时,需要知道数据库里有哪些表,表里有哪些列,列是什么类型。Anyline 封装了统一的方法。
// 获取所有表名
List<String> tables = service.metadata().tables();
// 获取某张表的结构(列名、类型、注释)
LinkedHashMap<String, Column> columns = service.metadata().columns("user_table");
for(Column col : columns.values()){
System.out.println("列名:" + col.getName());
System.out.println("类型:" + col.getTypeName());
System.out.println("注释:" + col.getComment());
}
4. DDL 操作(建表、加字段)
根据定义好的结构,在数据库中自动创建表。
Table table = new Table("new_order_table");
table.addColumn("id", "BIGINT").setPrimaryKey(true).setAutoIncrement(true);
table.addColumn("order_no", "VARCHAR(50)");
table.addColumn("amount", "DECIMAL(10,2)");
// 在当前数据库创建这张表
service.ddl().create(table);
这个功能会根据你连的数据库类型,自动把数据类型翻译过去。比如你代码里写的是 varchar,连 Oracle 时它就会自动转成 varchar2。
5. 内存计算与结果集二次处理
有时候数据查出来了,但还需要做复杂的过滤、计算,或者数据来源本身不支持 SQL(比如调用的第三方 HTTP 接口)。
Anyline 搞了一套 DataSet/DataRow 模型,实现了 无实体类的全功能内存数据处理。
你可以把它理解为在内存里跑的一个微型数据库。
// 核心代码:内存中的 SQL 级操作
DataSet set = service.querys("sys_order");
// 即使数据已经到了内存里,依然可以使用 SQL 风格的语法进行二次筛选
// 比如行专列 DataSet.pivot("姓名", "科目", "成绩");
// 比如按部门分组求和,或者进行复杂的数学计算
set = coreDataSet.select.greater("amount", "1000")
.group("amount", Aggregation.SUM, "dept") // 对部门分组后,对数量进行求和
.desc("amount") // 排序
.getRows(0, 10); // 内存分页
// 支持 JSON 互转,方便直接丢给前端
String json = set.toJSON();
其他针对结果集进行二次操作的功能支持:http://doc.anyline.org/ss/94_1062

借鉴价值
即使你所在的公司规定不能引入第三方非标框架,Anyline 的源码也非常值得看。
它为了兼容 400 多种数据源,处理了大量的方言差异和驱动坑。
比如:
- 分页实现:Oracle 11g 和 12c 的分页写法不同,MySQL 和 SQL Server 的分页写法也不同。Anyline 内部有非常完整的 Adapter 模式实现。
- 数据类型映射:Java 的
Date存入不同数据库时,有的对应DATETIME,有的对应TIMESTAMP,有的甚至是字符串。 - 特殊语法:如何获取刚刚插入的主键 ID,不同数据库实现差异很大。
如果你们内部在自研数据库中间件或数据同步工具,遇到兼容性问题解决不了时,去翻翻 Anyline 对应数据库的 Adapter 源码(https://gitee.com/anyline/anyline/tree/master/anyline-data-dialect-relational),大概率能找到答案。
这里只截取了 Anyline 源码目录下的部分关系型数据库的实现




如果你要在自己公司的自研框架里支持一种冷门的数据库,直接去 Anyline 的源码里把那部分方言转换逻辑抄过来改改,就能避开很多数据类型转换和分页语法的坑。这是一个典型的“脏活累活”类型的项目,作者把最麻烦的适配工作都做完了,直接用或者参考实现都很划算。
写在最后
💬 互动环节:
你们在处理异构数据源同步,或者对接 AI 平台数据时,通常是自己造轮子还是有什么现成的方案?欢迎在评论区分享你的填坑经验。
如果觉得本文对你有帮助,别忘了 点赞、推荐、分享 给更多需要的朋友!
Q.E.D.


