跨越数据孤岛!SpringBoot使用JDBC调用Calcite联邦查询实战

Apache Calcite 优化器详解(二) 由于篇幅有限,这里就不一一罗列了,20道常见面试题(含答案)+21条MySQL性能调优经验小编已整理成Word文档或PDF文档还有更多面试复习笔记分享如下《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!由于篇幅有限,这里就不一一罗列了,20道常见面试题(含答案)+21条MySQL性能调优经验小编已整理成Word文档或PDF文档[外链图片转存中…(img-5q3gDAyI-1714466885865)]还有更多面试复习笔记分享如下。 阅读详情

01 引言

前面专门介绍了Apache Calcite动态数据源基于原生connection的使用方法。使用起来有点不太方便,能不能像JDBC一样查询数据呢?

正好前面分享了Spring 6.x的JdbcClient用法,我们直接一步到位,使用JdbcClient查询。

02 最佳实践配置

Apache Calcite是一个标准SQL解析器、验证器和优化器框架,支持多种后端数据源。这里就不多介绍了,直接看用法。

2.1 依赖引入

 <!-- Apache Calcite -->
<dependency>
    <groupId>org.apache.calcite</groupId>
    <artifactId>calcite-core</artifactId>
    <version>1.38.0</version>
</dependency>
<dependency>
    <groupId>org.apache.calcite</groupId>
    <artifactId>calcite-csv</artifactId>
    <version>1.38.0</version>
</dependency>

 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!--- 根据需要引入  -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

2.2 配置数据源

要使用JDBC的客户端,就需要配置数据源。

@Bean
public DataSource calciteDataSource() throws Exception {
    Properties prop = new Properties();
    prop.put("lex", "MYSQL");
    prop.put("model", "src/main/resources/calcite-model.json");
    Connection connection = DriverManager.getConnection("jdbc:calcite:", prop);

    SingleConnectionDataSource calciteDataSource = new SingleConnectionDataSource(connection, true);
    return calciteDataSource;
}

因为DataSource是一个接口,需要我们自行构建或者使用其实现类,并且可以设置connection的类。DataSourceBuilder的构建方式行不通,我们只能使用其子类。

SingleConnectionDataSource类刚好可以满足我们的条件。当然也可以自行去兼容,我们这里怎么简单怎么来。

2.3 配置文件

配置文件需要配置一个jdbcd的方言,否则调用会报错。

spring.data.jdbc.dialect=mysql

2.4 模型文件

模型文件之前已经介绍了,想要了解可以看看之前的文章:《多数据源:CSV、内存对象可以通过SQL查询,甚至联查,你敢信!》

{
  "version": "1.0",
  "defaultSchema": "MEM",
  "schemas": [
    {
      "name": "MEM",
      "type": "custom",
      "factory": "org.apache.calcite.adapter.java.ReflectiveSchema$Factory",
      "operand": {
        "class": "com.simonking.boot.calcite.schema.UserSchema"
      }
    },
    {
      "name": "CSV",
      "type": "custom",
      "factory": "org.apache.calcite.adapter.csv.CsvSchemaFactory",
      "operand": {
        "directory": "csv",
        "flavor": "scannable"
      }
    },
    {
      "name": "MYSQL_DB",
      "type": "custom",
      "factory": "org.apache.calcite.adapter.jdbc.JdbcSchema$Factory",
      "operand": {
        "jdbcUrl": "jdbc:mysql://127.0.0.1:3306/test",
        "jdbcUser": "root",
        "jdbcPassword": "root"
      }
    }
  ]
}

03 实战

我们分别从内存、CSV、mysql这三个数据源实战,应该可以覆盖常用的场景了。

3.1 内存实战

模拟内存数据

public class UserSchema {

    public final User[] users;

    public UserSchema() {
        // 模拟数据
        this.users = new User[]{
                new User(1, "zhangsan", 18),
                new User(2, "admin", 20),
                new User(3, "lisi", 22)
        };
    }

    /**
     * @Description: 字段类型
     **/
    @AllArgsConstructor
    public class User {

        /** 用户id */
        public final Integer id;
        /** 用户名 */
        public final String name;
        /** 年龄 */
        public final Integer age;
    }
}

案例

@Autowired
private JdbcClient jdbcClient;

@Test
void contextLoads01() {
    UserVO userVO = jdbcClient
        .sql("select * from MEM.users where id = ?")
        .param(1)
        .query(UserVO.class)
        .single();
    System.out.println(JSON.toJSONString(userVO));
}

结果

3.2 CSV实战

模拟数据

案例

@Autowired
private JdbcClient jdbcClient;

@Test
void contextLoads01() {
    OrderVO orderVO = jdbcClient
        .sql("select * from CSV.orders where user_id = :userId")
        .param("userId", 2)
        .query(OrderVO.class)
        .single();
    System.out.println(JSON.toJSONString(orderVO));
}

结果

坑点

CSV数据源查询的时候有个小问题,上面的接受的实体使用的参数类型都是String。正常来讲order_id、user_id应该为Integer或Long类型,amount应该为BigDecimal类型。

开始我就是这么定义的,结果发现执行报错:

从报错中可以看出calcite是通过StringAccessor来解析的,源码中包含了IntegerAccessor但是没有调用到。

解决方案

没有在官网中找到明确的文档,但是从官方给的example找到了答案:

直接在字段后面直接指定类型并用冒号隔开。这里使用的是基础数据类型。BigDecimal可以使用double处理。

我们看看结果吧。

3.3 Mysql实战

模拟数据

案例

@Autowired
private JdbcClient jdbcClient;

@Test
void contextLoads01() {
    UserRoleVO userRoleVO = jdbcClient
        .sql("select * from MYSQL_DB.user_roles where user_id = :userId")
        .param("userId", 2)
        .query(UserRoleVO.class)
        .single();
    System.out.println(JSON.toJSONString(userRoleVO));
}

结果

3.4 联查

为了方便,我们就不定义实体了,直接使用Map接收。

List<Map<String, Object>> list = jdbcClient.sql("""
                 SELECT * FROM CSV.orders o
                 INNER JOIN MEM.users u ON o.user_id = u.id
                 INNER JOIN MYSQL_DB.user_roles r 
                 ON u.id = r.user_id
                 WHERE u.id = :userId
                """)
        .param("userId", 2)
        .query()
        .listOfRows();

System.out.println(JSON.toJSONString(list));

结果

这里的查询不受定义的字段类型的影响。

04 小结

原本想着之前使用connection方式已经完成了案例,改造成JdbcClient应该很顺利,但是没有想到还需遇到的意想不到的问题,好在都解决了。后面项目中使用就可以直接使用JdbcClient愉快的干活了。

CAD文件转换避坑指南:Inventor导出STP时这些设置千万别忽略 本文深入解析了使用Autodesk Inventor导出STP文件时的关键设置与避坑指南。重点探讨了应用协议选择、样条曲线拟合精度对几何保真度的影响,以及装配体结构和元数据的保全策略,旨在帮助用户实现高质量、零误差的CAD数据交付,避免下游软件打开时出现特征丢失或曲面破碎等问题。 阅读详情

相关推荐

零、HarmonyOS应用开发者基础学习总览

零、HarmonyOS应用开发者基础学习总览

weixin_45029825的博客 1449

【Calcite】Apache Calcite 框架初探及概念详解

1. 简介 Calcite 是什么?如果用一句话形容 Calcite,Calcite 是一个用于优化异构数据源的查询处理的基础框架。 最近十几年来,出现了很多专门的数据处理引擎。例如列式存储 (HBase)、流处理引擎 (Flink)、文档搜索引擎 (Elasticsearch) 等等。这些引擎在各自针对的领域都有独特的优势,在现有复杂的业务场景下,我们很难只采用当中的某一个而舍弃其他的数据引擎。当引擎发展到一定成熟阶段,为了减少用户的学习成本,大多引擎都会考虑引入 SQL 支持,但如何避免重复造轮子又成了

yiyezhiqiu167的博客 9151

ISCC-Amy‘s Code CTF-Reverse

ISCC-Amy's Code CTF-Reverse

m0_72904009的博客 682

apache calcite源码阅读(五)org.apache.calcite.sql.parser包下的SqlParser类 解析

`SqlParser` 构造函数:接受 `SqlAbstractParserImpl` 对象和 `SqlParser.Config` 对象作为参数,并根据配置初始化 `SqlParser` 的实例。`SqlParser` 类提供了一组方法来解析和验证 SQL 语句,并返回相应的 `SqlNode` 对象,以便进一步处理和分析 SQL 语句的结构和内容。- `parseStmt` 方法:与 `parseQuery` 方法相同,解析完整的 SQL 查询并返回 `SqlNode` 对象。

goTsHgo的博客 1430

踩坑ubuntu24.04 编译vtk9.3.1的安卓版本

NDK官方明确废弃了旧版 armeabi ABI,强制使用armeabi-v7a或arm64-v8a。错误信息显示你的构建系统仍在使用超级构建(superbuild)模式,并且内部引用了已不再支持的。生成的合并库: $(pwd)/libvtk_combined.a"超级构建过程可能内部未充分考虑现代NDK变化导致内部配置ARM老ABI,重复失败。echo "正在提取所有.o文件..."echo "合并前所有库的总大小:"# 提取所有.a文件中的.o文件。echo "创建合并库..."

zhangyihu321的专栏 1891

Kali下RTL8812AU网卡5G抓包精准适配指南

WiFi监听模式是无线安全测试的基础能力,其核心在于网卡驱动对802.11a/n/ac协议栈的完整支持。RTL8812AU系列USB无线网卡因成本低、兼容性广被广泛用于渗透测试,但其芯片版本碎片化(如VA/VC/ACM)与Linux内核演进(6.1~6.5)存在严重适配断层,导致5GHz频段Beacon帧捕获失败、信道切换异常、注入功能残缺等典型问题。技术价值在于突破‘即插即用’幻觉,建立从USB设备ID识别、固件版本校验到射频寄存器级补丁的全链路可控流程。典型应用场景包括CTF无线赛题实战、红蓝对抗中的W

weixin_33783283的博客 757

Apache Calcite 处理流程详解(一)

关于 Apache Calcite 的简单介绍可以参考Apache Calcite:Hadoop 中新型大数据查询引擎这篇文章,Calcite 一开始设计的目标就是one size fits all,它希望能为不同计算存储引擎提供统一的 SQL 查询引擎,当然 Calcite 并不仅仅是一个简单的 SQL 查询引擎,在论文Apache Calcite: A Foundational Framework for Optimized Query Processing Over Heterogeneous...

Baron_ND的博客 2696

说一下Intel Fortran 编译器经典版ifort和新一代ifx

摘要:ifort是Intel开发的传统Fortran编译器,以稳定性和遗留代码兼容性著称,现已进入维护模式。ifx则是基于LLVM架构的新一代Fortran编译器,具有更好的性能优化、更快的编译速度,并支持最新Fortran标准和GPU加速。英特尔计划逐步用ifx取代ifort,前者将成为未来主力发展的产品线。两者的核心区别在于技术基础(传统vs.现代化LLVM)和功能支持(维护状态vs.持续更新)。

luohaitao的专栏 1347

apache calcite源码阅读(三)org.apache.calcite.sql.validate下的接口SqlValidator 方法解析

21. `validateAggregateParams(SqlCall var1, @Nullable SqlNode var2, @Nullable SqlNodeList var3, @Nullable SqlNodeList var4, SqlValidatorScope var5)` 方法:验证聚合函数的参数。7. `getValidatedNodeTypeIfKnown(SqlNode var1)` 方法:获取给定 SQL 节点的验证后数据类型,如果未知则返回 `null`。

goTsHgo的博客 871

12、控件使用之录入英文、阿拉伯数字删除增加功能及二维码显示

控件使用之录入英文、阿拉伯数字删除增加功能及二维码显示1、用到的控件2、添加控件2.1、添加【文本录入】控件2.1、添加【文本显示】控件2.1、添加【QR 二维码】控件3、保存工程及生成文件4、下载文件 1、用到的控件   需要用的显示控件为【文本显示】控件和【QR二维码】控件,以及触控控件【文本录入】控件。 2、添加控件 2.1、添加【文本录入】控件   【文本录入】控件也叫【ASCI 文本录入】,是用来录入ASCI 字符,打开 DGUS 软件,点击【触控控件】—【文本录入】,用鼠标框选一个区域,即可在右

嵌入式羊圈 622

22、用户界面流程(UI Flow)全解析

本文全面解析了用户界面流程(UI Flow)的概念、创建步骤及其在系统设计中的应用。通过示例和操作步骤,详细介绍了如何确定屏幕范围、识别屏幕、创建过渡和标记触发器,并阐述了UI Flow在导航识别、验证、可用性优化、测试用例开发和需求推导中的重要作用。文章还结合问答系统案例,展示了UI Flow的实际应用价值,帮助读者深入理解并有效运用这一工具提升系统用户体验。

rice5的博客 153

开源SQL解析框架 Apache Calcite 介绍及使用示例

Apache Calcite 是一个非常有用的框架,尤其适合那些希望构建自定义数据存储或处理系统的开发者。它提供了一整套工具和服务,使得 SQL 解析、查询优化、数据源适配变得更加容易。通过 Calcite,你可以快速地开发出具有强大功能的数据管理系统。如果你正在寻找一种方式来构建下一代数据库或数据仓库解决方案,Calcite 是一个很好的选择。

学亮编程手记 5833

竞赛经验——挑战杯、互联网加、北斗杯、微软创新杯、计算机设计等比赛教训与经验

最近参加一些比赛,北斗杯、挑战者杯、微软创新杯等比赛,每次比赛都有不少需要总结的地方,特别是项目展示上技巧很多,总结一下。 首先最重要的是作品自身硬!自身的作品完成度不高,或者是没有创新点,就没必要参加了。 比如是出去比赛的话,我反正每次碰到最多的是智慧农场、智慧家居之类,不知道为啥这种的太多了。如果是创业型比赛,评委基本会问小米已经做得很好了很便宜了,你的优势在哪里?这些都是常见的问题提前要...

沉迷单车的追风少年 7325

Apache Calcite 入门

Apahce Calcite 是一个动态的数据管理框架。它和经典的数据管理系统的主要区别在于它省略了经典数据管理系统的数据存储,数据加工,元数据存储等功能。 正是因为Calcite 有意的回避了这些功能,使得它成为了在应用和数据库之间的很好的一个中间适配软件。 如何引入calcite,以maven方式为例 <dependency> <groupId>org.a...

陆小森_红齐飘飘的博客 2667

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Apache Calcite入门

Apache Calcite是一款开源SQL解析工具, 可以将各种SQL语句解析成抽象语法术, 之后通过操作AST就可以把SQL中所要表达的算法与关系体现在具体代码之中,将来会有越来越多的数据处理引擎采用Calcite作为SQL解析工具。...

阿甘兄 2684

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

apache calcite 新手入门 hello world

简述 业务员与开发人员经常口述 能不能帮我导点 xxx数据,隔几个小时又来能不能给我导 xxx数据。反复接收到这样的任务心里一万个CNM。那能不能智能点呢,如果业务人员会SQL,你就会想能不能写个能识别SQL语句的功能让她想导什么就导什么。如,文件太大,她想用SQL查看抽样信息。在比如,内存redis想看内存的数据信息。还有hbase敲命令好复杂,我能不能自己写个SQL语法解析器来转换成命令执行...

qq_27408211的博客 8368

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Apache Calcite 框架原理入门和生产应用

全网最全大数据面试提升手册!1. 简介 Calcite 是什么?如果用一句话形容 Calcite,Calcite 是一个用于优化异构数据源的查询处理的基础框架。最近十几年来,出现了很多专门的数据处理引擎。例如列式存储 (HBase)、流处理引擎 (Flink)、文档搜索引擎 (Elasticsearch) 等等。这些引擎在各自针对的领域都有独特的优势,在现有复杂的业务场景...

微信搜:import_bigdata,大数据领域硬核原创作者 1677

apache calcite 进阶篇(一)

介绍 上一篇已经介绍过如何利用SQL解析查询出hello world,通过工厂模式实例化Scheam, schema包含表,表包含数据。没看过的可以去看https://blog.csdn.net/qq_27408211/article/details/86497097 用过工具的基本也都是这种形态。今天学习用不一样的方式也非常简单的代码实现复杂的SQL解析。 代码结构 pom.xm...

qq_27408211的博客 5264

apache calcite源码阅读(一)org.apache.calcite.sql下的SqlNode.class

以及一个 `Litmus` 参数 `litmus`,表示比较的结果。28. `public static <T extends SqlNode> Collector<T, ArrayList<SqlNode>, SqlNodeList> toList()`:返回一个 `Collector` 对象,用于将 `SqlNode` 对象流收集为 `SqlNodeList` 对象。`:定义了一个空数组常量 `EMPTY_ARRAY`,它的类型是 `SqlNode[]`,表示一个空的 `SqlNode` 数组。

goTsHgo的博客 668

apache 工具使用杂记

pluginManagement一般是用来在父POM中定义,提供给子POM使用,子POM也可以覆盖这个定义,而且你在父POM中定义了版本之后,子模块中直接应用groupId和artifactId,而不用指定版本,同时也方便统一管理;JAVA_HOME的值配错了,后来改过,但这个变量只初始化一次,所以他总是用错误的JAVA_HOME的值。什么样的包为测试源,答案是,在maven项目中包含test的依赖定义为测试源。错误:在src/test/java源文件夹下测试相关的包是找不到的,其他的包是正常的。

Debug日记的博客 483

Apache Calcite - 自定义数据源适配之访问内存列表

为了适配多源数据,根据上一篇文章,我们需要扩展实现Calcite中的Schema与Table。实现多源访问,了解框架结构及核心类最终实现。

Revivedsun的专栏 2318

Apache Calcite整合异构数据源查询 以csv、ES、内存表为例

Apache Calcite接入不同数据源demo 1. 准备工作 1.1 maven引入依赖 在maven项目的根目录pom.xml的标签中写入下列依赖 <!-- calcite核心包 --> <dependency> <groupId>org.apache.calcite</groupId> <artifactId>calcite-core</artifactId> <version>1.20.0

imsugar的博客 5394

【亲测免费】 Apache Calcite 项目使用教程

Apache Calcite 是一个动态数据管理框架,其项目结构清晰,便于理解和使用。以下是项目的主要目录结构及其介绍: - **`core/`**: 包含 Calcite 的核心功能,如 SQL 解析器、优化器和执行引擎。 - **`example/`**: 提供一些示例代码,展示如何使用 Calcite 进行数据查询和处理。 - **`server/`**: 包含用于构建和运行 Calcit...

gitblog_01051的博客 882
上一篇: CSV、内存对象可以通过SQL查询,甚至联查,你敢信!
下一篇: SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
智_永无止境
博客等级 码龄10年 803粉丝 403原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值