多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 跨库支持实现 如果BeetlSQL 目前不支持你所用的数据库,可以自己轻松扩展实现。主要的核心类是 * DbStyle * BeanProcessor 首先,先看看数据库跟哪些数据库比较接近或者兼容,比如很多云数据库都有传统数据库的影子,因此,你可以尝试使用传统数据库的DBStyle,比如阿里云云数据库兼容MySQL。因此,完全可以使用MySqlStyle,华为开源高斯数据库类似Postgres。 其次,新兴的数据库都有传统数据库的影子,比如翻页,大部分都是`limit ${offset}, ${limit}` , 比如mysql,因此可以用复用类`OffsetLimitRange` ;有的数据库则是`limit ${limit} offset ${offset}` ,比如apache drill,couchbase,apache ignite,还有国产TD-Engine, 这时候可以复用`LimitWithOffsetRange`。 有的数据库翻页类似Oralce,因此可以复用`RowNumRange`,比如国产数据库达梦 实现XXX数据库基本上只要是实现XXXStyle,继承AbstractDbStyle,AbstractDbStyle的一些核心方法是BeetlSQL解决不同数据库差异的主要类,这些方法将在本章后面详细简介,现在简单说明如下 ```java @Override public String getName() { return "mysql"; } @Override public int getDBType() { return DBType.DB_MYSQL; } ``` getName 返回数据库名称,getDBType则返回一个唯一标识,可以返回1000以外。数据库名称可以用于各种特殊处理。数据库sql文件也可以存放在以数据库名称作为目录名下,以实现跨数据库操作。 ```java @Override public RangeSql getRangeSql() { return this.rangeSql; } ``` 返回一个翻页辅助类,这将在后面详细讲解。这也是大部分数据库的差异点 对于NOSQL或者查询引擎来说,还有需要考虑的地方,以Presto为例子 ```java @Override public boolean isNoSql(){ return true; } public boolean preparedStatementSupport(){ return false; } @Override public String wrapStatementValue(Object value){ return super.wrapStatementValue(value); } @Override public SQLExecutor buildExecutor(ExecuteContext executeContext){ return new QuerySQLExecutor(executeContext); } ``` `isNoSql` 返回true,表示是非传统数据库。 `preparedStatementSupport` 返回false,表示数据库jdbc 不支持预编译,因此BeetlSQL将使用Statement而不是PreparedStatement,并会调用`wrapStatementValue`来动态构造sql buildExecutor 实际上构造了BeetlSQL的执行核心,这里返回QuerySQLExecutor而不是默认的BaseSQLExecutor,因为QuerySQLExecutor只保留了查询支持 有些数据库对MetaData支持不够友好,比如某些查询数据库查询文件,因此需要代码添加对“表”的描述,DBStyle需要重载initMetadataManager ```java @Override public MetadataManager initMetadataManager(ConnectionSource cs){ metadataManager = new NoSchemaMetaDataManager(); return metadataManager; } ``` NoSchemaMetaDataManager 类提供了addBean方法用于通过POJO提供一个表描述,这样才能保证BeetlSQL的代码能执行。 AbstractStyle 还支持config(SQLManager sqlManager),有机会配置sqlManager ```java @Override public void config(SQLManager sqlManager){ } ```