跳到主要内容

数据源差异

dbVisitor 力争使用统一的 API 来操作所有 关系型数据库非关系型数据库。但实际中数据源由于其本身的特性仍存在一些个体差异。 dbVisitor 对待差异的处理方式主要体现在两个方面:

  • API 支持性,是指被调用的 API 在某数据源上是否支持。
  • 数据库方言,是指在使用 构造器 API 时相同 API 操不同数据库时采用了不同的命令或语法。
特点

您若想改变这些差异,可以参与项目并贡献您的改进代码。

数据源支持一览

dbVisitor 在统一内核架构下设计了 4 种 API:编程式 API声明式 API构造器 APIMapper File。 其中 JdbcTemplate注解方式Mapper File 在所有数据源上均可使用。

dbVisitor 具备智能的方言推断能力,会自动根据 JDBC URL 识别目标数据库类型并配置最佳方言,通常 无需手动配置。 如需显式指定,支持 方言别名(如 mysql)或 方言全限定类名

下表汇总了各数据源的 API 支持与方言特性差异,各列含义:

  • 构造器 API — 包含 LambdaTemplate、BaseMapper、对象映射和结果集映射,四者支持性一致
  • 写入冲突 — 所有数据源均支持标准写入(Into),此列仅标注额外支持的冲突策略(详解
  • 分页 — 方言是否实现 PageSqlDialect 接口
  • 序列 — 方言是否实现 SeqSqlDialect 接口
  • 向量 — 方言是否实现 VectorSqlDialect 接口(详解
  • 空值排序 — 方言是否覆写了 orderByNulls 方法
数据源配置 Key构造器 APIBatch存储过程自增回填分页写入冲突序列向量空值排序
MySQLmysqlIgnore Update
MariaDBmariadbIgnore Update
PostgreSQLpostgresqlIgnore Update¹
人大金仓kingbaseIgnore Update¹
OracleoracleIgnore¹ Update¹
达梦dmIgnore¹
SQL Serversqlserver/ jtds
SQL Server (jTDS)jtds
DB2db2
H2h2
Apache Derbyderby
HSQLhsql
Hivehive⚠️
Apache Impalaimpala
IBM Informixinformix
SQLitesqlite
虚谷数据库xugu
Redis
MongoDBmongo
ElasticSearch 6elastic6
ElasticSearch 7elastic7
ElasticSearch 8elastic8
Milvusmilvus

✅ 支持   ❌ 不支持

¹ 需有主键

⚠️ Hive:虽然实现了 PageSqlDialect,但 countSqlpageSql 均会抛出 UnsupportedOperationException,实际不可用。

JDBC 特性支持

对于非关系型数据库驱动(Mongo、Elastic),dbVisitor 实现了 Statement.RETURN_GENERATED_KEYS 特性。 这意味着在使用 JdbcTemplateStatement 执行插入操作时,可以自动获取生成的 _id

非关系型数据源指南

  • Redis — 支持 140+ 命令,5 种数据类型操作;不支持构造器 API 和对象映射
  • MongoDB — 完整 CRUD 支持,ObjectId 自动映射,分页查询;不支持批量和存储过程
  • ElasticSearch — 完整 CRUD 支持,基于 REST DSL;不支持批量和存储过程
  • Milvus — SQL 风格语法操作向量数据库,完整 CRUD 支持,KNN 近邻搜索与范围搜索;不支持批量和存储过程

写入策略详解

对于支持写入冲突策略的数据库,各方言采用了不同的底层实现方式:

方言Ignore 实现Update 实现
MySQLINSERT IGNORE INTO ...INSERT INTO ... ON DUPLICATE KEY UPDATE
PostgreSQLINSERT INTO ... ON CONFLICT DO NOTHINGINSERT INTO ... ON CONFLICT(pk) DO UPDATE SET ...
OracleMERGE INTO ... WHEN NOT MATCHED THEN INSERTMERGE INTO ... WHEN MATCHED THEN UPDATE WHEN NOT MATCHED THEN INSERT
达梦INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX */ INTO ...不支持

向量查询支持详解

不同数据库的向量方言支持的距离度量函数和查询方式有所不同:

方言查询方式支持的距离度量
PostgreSQLpgvector 运算符L2(<->)、余弦(<=>)、内积(<#>)等
Elastic 7script_score 脚本l2norm、cosineSimilarity、dotProduct、l1norm
Elastic 8原生 kNN + script 查询L2、COSINE、IP(原生);l2norm 等(script 回退)
Milvus原生向量运算符L2(<->)、余弦(<=>)、内积(<#>)等

自定义方言

如果内置方言不满足需求,可以通过继承 AbstractDialect 并实现所需接口来自定义方言。和方言相关的接口共 5 个,SqlDialect 是公共基础接口:

接口职责
SqlDialect基础接口,管理关键词清单、生成表名/列名/排序列名
ConditionSqlDialect条件相关的 SQL 生成(如 LIKE 语句)
InsertSqlDialect高级 INSERT 语句生成(如 写入冲突策略
PageSqlDialect分页语句生成(countSql + pageSql
SeqSqlDialect序列查询语句生成
提示

继承 AbstractDialect 抽象类并实现 PageSqlDialect 接口即可自定义分页方言。

  • countSql — 生成计算 count 的 SQL 语句
  • pageSql — 生成分页 SQL 语句
注册自定义方言
SqlDialectRegister.registerDialectAlias(JdbcUtils.MYSQL, MyDialect.class);