SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询 📅 发布时间:2026/7/17 14:53:40 👁️ 浏览次数: 01 引言上一节介绍了Apache Calcite使用JDBC客户端统一查询但是DAO几乎已经被Myabits占了半壁江山可不可以通过Mybaits的形式调用呢我们一下来看下吧还会遇到哪些坑点呢follow me02 实战配置2.1 Maven依赖!-- Apache Calcite --dependencygroupIdorg.apache.calcite/groupIdartifactIdcalcite-core/artifactIdversion1.38.0/version/dependencydependencygroupIdorg.apache.calcite/groupIdartifactIdcalcite-csv/artifactIdversion1.38.0/version/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdscoperuntime/scope/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion3.0.4/version/dependency这里列举了主要配置其他的辅助配置按需引入。2.2 配置文件配置mybaits相关的内容。因为我们不写mapper.xml所以就不配置mybatis.mapper-locations。# 日志 mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl # 开启驼峰匹配 mybatis.configuration.map-underscore-to-camel-casetrue2.3 模型文件模型文件和之前的一致。{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}}]}2.4 数据源配置BeanpublicDataSourcecalciteDataSource()throwsException{PropertiespropnewProperties();prop.put(lex,MYSQL);prop.put(model,src/main/resources/calcite-model.json);ConnectionconnectionDriverManager.getConnection(jdbc:calcite:,prop);SingleConnectionDataSourcecalciteDataSourcenewSingleConnectionDataSource(connection,true);// 绑定资源TransactionSynchronizationManager.bindResource(calciteDataSource,newConnectionHolder(connection));returncalciteDataSource;}这里的数据源配置需要注意的代码TransactionSynchronizationManager.bindResource(calciteDataSource, new ConnectionHolder(connection));这里是为了绑定资源否则就会默认提交事务导致报错。因为本身只能查询所以没必要提交事务。报错如下报错源码位置只需要配置上面的代码即可跳过事务的提交。2.5 启动类配置增加Mapper扫描MapperScan(com.simonking.boot.calcite.mapper)03 实战3.1 内存Mybatis应用实体DatapublicclassUserVOimplementsSerializable{SerialprivatestaticfinallongserialVersionUID-8236381006056066976L;/** 用户id */privateIntegerid;/** 用户名 */privateStringname;/** 年龄 */privateIntegerage;}Mapper查询publicinterfaceUserMapper{Select(select * from MEM.users where id #{id})UserVOselectById(Param(id)Integerid);}示例与结果3.2 CSV的Mybatis应用实体DatapublicclassOrderVOimplementsSerializable{SerialprivatestaticfinallongserialVersionUID1063926652351474739L;/** 订单ID */privateIntegerorderId;/** 订单ID */privateIntegeruserId;/** 金额 */privateBigDecimalamount;}Mapper查询publicinterfaceOrderMapper{Select(select * from CSV.orders where order_id #{orderId})OrderVOselectById(Param(orderId)IntegerorderId);}示例与结果3.3 Mysql的Mybaits应用实体DatapublicclassUserRoleVOimplementsSerializable{SerialprivatestaticfinallongserialVersionUID-7359882062781599308L;/** id */privateIntegerid;/** 用户ID */privateIntegeruserId;/** 用户名 */privateStringusername;/** 角色名称 */privateStringrole_name;}Mapper查询publicinterfaceUserRoleMapper{Select(SELECT * FROM MYSQL_DB.user_roles WHERE user_id #{userId})UserRoleVOgetUserRoleByUserId(Param(userId)IntegeruserId);}示例及结果3.4 联查联查我们可以随意使用一个Mapper我们直接使用UserRoleMapper为了方便接受消息我们直接使用JSONObject接收。Mapper查询publicinterfaceUserRoleMapper{Select( 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} )JSONObjectselectByUserId(Param(userId)IntegeruserId);}示例及结果04 小结使用Mybatis的方式更加适合我们日常的编码风格使用的时候基本和单表的查询没有区别到这里坑基本上踩的差不多了老铁们还遇到什么问题评论区唠唠
冥想第一千八百零八天(1808) 1.周六,今天下雨了,早上下的小,下午和中午下的很大,项目上全力以赴的一天。 今天发现手机被磕碎了一小块,屏幕翘起了。 2.感谢父母,感谢朋友,感谢家人,感谢不断进步的自己。 2026/7/13 1:43:00
vLLM v0.16.0 重磅发布:吞吐量提升30%,异步调度+流水线并行全面整合 今天早上部署了vLLM v0.16.0,传说是真的。2026年2月,vLLM 迎来了 v0.16.0 版本。这次更新最值得关注的不是又新增了多少模型支持,而是一个底层架构的质变——Async Scheduling(异步调度)与 Pipeline Parallelism(流水线… 2026/7/12 16:45:29
学长亲荐!AI论文软件 千笔ai写作 VS 文途AI,MBA写论文更高效! 随着人工智能技术的迅猛发展,AI辅助写作工具已逐渐成为高校学生完成毕业论文的重要助手。无论是开题报告、文献综述还是整篇论文的撰写,越来越多的学生开始借助AI工具提升效率、降低写作压力。然而,在众多功能各异的AI写作平台中,… 2026/7/15 7:11:53
AudioShare技术方案:基于WebSocket的跨平台音频实时传输系统实现 AudioShare技术方案:基于WebSocket的跨平台音频实时传输系统实现 【免费下载链接】AudioShare 将Windows的音频在其他Android设备上实时播放。Share windows audio 项目地址: https://gitcode.com/gh_mirrors/audi/AudioShare AudioShare是一款开源的跨平台音… 2026/7/17 14:52:15
Rust Rosetta Code数据结构:链表、树和图在Rust中的优雅实现 Rust Rosetta Code数据结构:链表、树和图在Rust中的优雅实现 【免费下载链接】rust-rosetta Implementing Rosetta Code problems in Rust. 项目地址: https://gitcode.com/gh_mirrors/ru/rust-rosetta Rust Rosetta Code项目提供了丰富的算法和数据结构实现… 2026/7/17 14:52:15
Steam饰品交易终极指南:24小时自动追踪多平台挂刀比例数据 Steam饰品交易终极指南:24小时自动追踪多平台挂刀比例数据 【免费下载链接】SteamTradingSiteTracker Steam 挂刀行情站 —— 24小时更新的 BUFF & IGXE & C5 & UUYP & ECO 挂刀比例数据 | Track cheap Steam Community Market items on buff.163.c… 2026/7/17 14:50:13
Devstral-Small-2-24B-Instruct-2512-8bit API开发:构建企业级视觉AI应用的完整方案 Devstral-Small-2-24B-Instruct-2512-8bit API开发:构建企业级视觉AI应用的完整方案 【免费下载链接】Devstral-Small-2-24B-Instruct-2512-8bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Devstral-Small-2-24B-Instruct-2512-8bit Devs… 2026/7/17 14:50:13
CANN/asc-devkit: half2比较函数__hgtux2 __hgtux2 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/c… 2026/7/17 14:50:13
RAG 服务的优雅降级:当向量库或 LLM 不可用时如何保持基本可用性 RAG 服务的优雅降级:当向量库或 LLM 不可用时如何保持基本可用性 一、深度引言与场景痛点 用户满怀期待地输入问题,等了三秒钟,等来一个红色错误提示或者一个空白页面。后端日志里可能写着一行"ConnectionRefusedError: milvus:19530&qu… 2026/7/17 14:50:13
【WPS AI表格避坑白皮书】:实测发现87%用户正在误用AI函数——这5个致命错误导致结果偏差超42% 更多请点击: https://intelliparadigm.com 第一章:WPS AI表格的核心能力与适用边界 WPS AI表格将大语言模型能力深度集成于电子表格环境中,实现从自然语言指令到结构化数据操作的端到端转化。其核心并非替代传统公式或宏编程,而是… 2026/7/17 0:00:08
Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案 更多请点击: https://intelliparadigm.com 第一章:Cursor终端插件生态避坑指南概览 Cursor 作为基于 VS Code 内核构建的 AI 原生编辑器,其终端插件生态虽活跃,但存在兼容性断层、权限策略突变与调试链路断裂等典型风险。开发者常… 2026/7/17 0:00:08
ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表) 更多请点击: https://codechina.net 第一章:ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表) 提示词工程已从经验试错迈入变量驱动的科学阶段。实证研究表明,影响… 2026/7/17 0:00:08
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/17 0:28:39
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/17 6:02:24
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/16 12:08:13