企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## MetadataManager 此类定义了数据库的Metadata,类似JDBC的DatabaseMetaData。但考虑到有些数据库可能没有metadata,比如文件系统,因此 MetadataManager有如下子类 * SchemaMetadataManager: 大部分数据库,大数据使用,这些数据库都有严格的schema * NoSchemaMetaDataManager,无schema,如drill使用文件系统,这时候需要调用addBean方法通过POJO定义反向得到一个模拟的Schema * SchemaLessMetaDataManager,综合上面俩种情况 ```java public interface MetadataManager { boolean existTable(String tableName); TableDesc getTable(String name); Set<String> allTable(); public void addTableVirtuals(String realTable,String virtual); } ``` * existTable 用于检测表是否存在 * getTable,返回TableDesc ,表的详细描述,如主键,列,备注等 * allTable 返回所有表名 * addTableVirtuals, 建立一个真实不要和虚拟表的映射,因此当beetlsql 通过getTable,传入虚拟表的时候,实际得到的是真实表的TableDesc,比如在分表场景下,有user_001,user_002,但表定义都是user表 对于NoSchemaMetaDataManager,还有如下方法 * addBean 传入一个POJO,通过POJO的定义可以反向得到表定义 比如TD-Engine的JDBC目前不支持,因此DbStyle定义如下 ```java @Override public MetadataManager initMetadataManager(ConnectionSource cs){ metadataManager = new NoSchemaMetaDataManager(); return metadataManager; } ``` 然后在代码里手工添加定义 ```java NoSchemaMetaDataManager metaDataManager = (NoSchemaMetaDataManager)sqlManager.getMetaDataManager(); metaDataManager.addBean(Data.class); //Data是一个POJO,描述了个表t,有字段ts和a @Table(name="t") @lombok.Data public class Data { @Column("ts") Timestamp ts; @Column("a") Integer a; } ```