在2019年的时候,由于人力成本等因素,项目组没有前端人员,所以我们需要自己开发报表(react + fusion + 后端接口), 开始两周,大家都在重复同样的工作( 写SQL -> 写接口 -> 写页面)。
我希望有更多的时间做自己的事情,于是我尝试把这个过程进行抽象,可以自动的生成我们需要的报表页面。
最终,我完成了一个FlashQuery的框架,这个框架只需要写Sql模板(可以任意模板,但是为了降低学习成本,默认支持MyBatis的xml模板格式),模板中的参数就是前端的入参,整个过程抽象成了 (前端传参 -> 接收到JsonObject -> 渲染sql -> 执行sql -> 返回前端组件认识的格式 -> 报表展现)
FlashSqlEngine 是一个模板渲染引擎,详情参照 FlashSqlEngine
<dependency>
<groupId>io.github.flash-query</groupId>
<artifactId>flash-query-framework</artifactId>
<version>1.0</version>
</dependency>
CacheManager cacheManager = new CacheManager();
// 会自动注册到cacheManger
new FileDataCacheProcessor(cacheManager);
// 会自动注册到cacheManager
new LocalMemoryCacheProcessor(cacheManager);
这边需要注意:框架默认只提供JDBC直连的方式,因为不明确其他项目所使用的连接池方案,所以只提供了扩展接入方式,具体参考 自定义SqlConnectionPool
SqlConnectionPoolManager sqlConnectionPoolManager = new SqlConnectionPoolManager();
//自动注册到sql连接管理
new DefaultJdbcDirectConnectPool(sqlConnectionPoolManager);
//初始化DataQueryProcessorManager
DataQueryProcessorManager dataQueryProcessorManager = new DataQueryProcessorManager();
//自动注册到DataQueryProcessorManager
new SqlDataQueryProcessor(sqlConnectionPoolManager, dataQueryProcessorManager);
关于SqlEngine是一个独立可用的模板引擎,更多详细用法,参考 FlashSqlEngine
// 初始化SqlEngine
FlashSqlEngine sqlEngine = new FlashSqlEngine();
// 通过配置文件加载的方式载入所有sqlId 对应的模板内容
sqlEngine.loadConfig("test-sql-id-mapper.xml");
// 默认提供了Mybatis的模板方式,也可以扩展别的
sqlEngine.registerSqlParseProvider(MYBATIS_SQL_TYPE, new DefaultMybatisSqlParseProvider());
当前1.0版本只支持字段脱敏的转换
//初始化系统的字段转换器
List<FieldValueConvertor> desensitizeFieldValueConvertors = Lists.newArrayList(new DesensitizeFieldValueConvertor());
dataQueryScenarioProcessor = new DataQueryScenarioProcessorImpl(cacheManager, dataQueryProcessorManager, sqlEngine, desensitizeFieldValueConvertors);
//构造一个场景配置
DataQueryScenario scenario = buildDefaultScenario();
// 入参
JSONObject params = JSONUtil.createObj();
params.set("id", 1L);
// 查询得到的结果
DataQueryResponse<JSON> response = dataQueryScenarioProcessor.process(scenario, params);
logger.info("{}", response);
完整代码参考 DataQueryScenarioProcessImplTest.java
{
"code": "default-test-scenario", // 场景code
"name": "测试场景1", // 场景名称
"sqlId": "getUserById", // 配置文件里面的sqlId,如果同时配置sqlId和queryTemplateContent,以queryTemplateContent为准
"templateProviderType": "MYBATIS_SQL_TYPE", // 模板渲染的类型,MYBATIS_SQL_TYPE是FlashSqlEngine默认提供的模板渲染(兼容mybatis)
"dataSource": { // 配置数据源
"code": "sample_db",
"dataSourceType": "DB",
"properties": { // jdbc配置在properties里面
"driverClassName": "org.h2.Driver",
"url": "jdbc:h2:tcp://localhost:9092/mem:sample_db",
"userName": "root",
"password": "root"
}
}
},
"cacheConfig": { // 缓存配置,当前支持两种,本地JVM缓存以及静态化文件的缓存
"code": "local_memory_cache",
"cacheType": "LOCAL_MEMORY", // STATIC_LOCAL_FILE 静态化 , LOCAL_MEMORY本地内存
"properties": {} // 对于扩展的缓存类型,一些扩展属性会放在这边,基础框架未使用
},
"outputFields": [
{
"fieldName": "NAME", // 字段名
"fieldConvertTypes": [ // 需要处理的类型,当前只支持脱敏
"DesensitizedType"
]
}
]