news 2026/9/15 13:19:10

SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询

01 引言

上一节介绍了Apache Calcite使用JDBC客户端统一查询,但是DAO几乎已经被Myabits占了半壁江山,可不可以通过Mybaits的形式调用呢?

我们一下来看下吧,还会遇到哪些坑点呢?follow me

02 实战配置

2.1 Maven依赖

<!-- 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>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.4</version></dependency>

这里列举了主要配置,其他的辅助配置按需引入。

2.2 配置文件

配置mybaits相关的内容。因为我们不写mapper.xml,所以就不配置mybatis.mapper-locations

# 日志 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl # 开启驼峰匹配 mybatis.configuration.map-underscore-to-camel-case=true

2.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{Propertiesprop=newProperties();prop.put("lex","MYSQL");prop.put("model","src/main/resources/calcite-model.json");Connectionconnection=DriverManager.getConnection("jdbc:calcite:",prop);SingleConnectionDataSourcecalciteDataSource=newSingleConnectionDataSource(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{@SerialprivatestaticfinallongserialVersionUID=1063926652351474739L;/** 订单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的方式更加适合我们日常的编码风格,使用的时候基本和单表的查询没有区别,到这里坑基本上踩的差不多了,老铁们,还遇到什么问题,评论区唠唠!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 13:18:51

内网渗透实战干货:从入门到实操,新手也能快速上手

前言&#xff1a;内网渗透是Web安全、网络安全领域的核心技能&#xff0c;也是企业安全防护的重点痛点。不同于外网渗透的“单点突破”&#xff0c;内网渗透更注重“思路实操隐蔽性”&#xff0c;核心是从已拿下的跳板机出发&#xff0c;逐步渗透整个内网&#xff0c;最终控制核…

作者头像 李华
网站建设 2026/9/15 13:18:51

基于ECharts的海洋气象数据可视化平台设计与实现

文末获取联系开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7、8.0数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 浏览器&#xff1a;谷歌浏览器项目介绍本文围绕基于ECharts的海洋气象数据可视…

作者头像 李华
网站建设 2026/9/15 13:18:44

基于Hadoop大数据的出行方式推荐系统

文末获取联系开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7、8.0数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 浏览器&#xff1a;谷歌浏览器项目介绍1. 数据采集与处理&#xff1a;系统应能…

作者头像 李华
网站建设 2026/9/7 18:07:33

在 UniApp 中使用 uni-data-picker 实现省市区地址选择

在 UniApp 开发中&#xff0c;地址选择是表单场景中的常见需求。借助官方扩展组件 uni-data-picker&#xff0c;可以高效实现省市区三级联动选择&#xff0c;无需重复造轮子&#xff0c;大幅提升开发效率。本文结合实际代码案例&#xff0c;详细讲解如何基于 uni-data-picker 实…

作者头像 李华
网站建设 2026/9/7 21:49:30

干货拉满!Web 安全入门超全讲解,小白也能轻松入门到精通

一、Web 安全概述 &#xff08;一&#xff09;Web 安全的定义与重要性 1.定义 Web 安全是指保护 Web 应用程序免受各种网络威胁&#xff0c;确保 Web 服务的保密性、完整性和可用性。在当今数字化时代&#xff0c;Web 应用广泛存在于各个领域&#xff0c;从电子商务到社交媒…

作者头像 李华