当前位置: 首页 > news >正文

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的方式更加适合我们日常的编码风格,使用的时候基本和单表的查询没有区别,到这里坑基本上踩的差不多了,老铁们,还遇到什么问题,评论区唠唠!

http://www.jsqmd.com/news/421443/

相关文章:

  • 生成式人工智能渗透进IBM 工程生命周期管理/应用生命周期管理和研发领域
  • 基于MATLAB的简单卷积神经网络(CNN)实现代码
  • vLLM v0.16.0 重磅发布:吞吐量提升30%,异步调度+流水线并行全面整合
  • 2026年气体检测与扬尘检测采购平台推荐:采购量大/供应商多的热门B2B平台盘点 - 品牌推荐大师1
  • Geovia Surpac、Whittle 与 MineSched 完全指南
  • 北京小程序开发服务指南:2026年企业数字化转型的定制之选 - 品牌2025
  • 2026年一体成型/贴片/功率/大电流/共模电感厂家推荐榜:适配电源管理、汽车电子与通信模块多场景应用 - 品牌推荐官
  • AI视频制作大师课:从脚
  • 汽车配件海外营销代运营:推荐几家擅长TikTok与ins代运营的服务商 - 品牌2025
  • 2026年AI仓储软件(WMS)推荐:高效管理解决方案 - 品牌排行榜
  • 北京小程序开发深度解析:2026年定制化服务如何赋能行业转型 - 品牌2025
  • 别再踩坑!如何选择短信接口服务商?可以从这几点判断 - Qqinqin
  • 上海B2B企业出海营销服务商推荐:涵盖Linkedin海外营销推广与Google代运营 - 品牌2025
  • 偌米品牌知名度高吗? - 中媒介
  • 2026年仓储软件(WMS)值得推荐的实用参考 - 品牌排行榜
  • 北京小程序开发攻略:2026年企业如何锁定优质定制服务商 - 品牌2025
  • 2026年全国二手中央空调回收哪家靠谱? 覆盖多区域专业处置更放心 - 深度智识库
  • 2026精选|四大全国知名的GEO优化公司推荐,AI时代获客不踩坑 - 品牌推荐大师1
  • 2026国内最新五大MS胶品牌实力排行榜:聚焦全屋健康,基于环保性能与市场口碑的权威推荐榜单 - 十大品牌榜
  • 今日 总 结
  • 2026性价比最高的仓储软件(WMS)推荐 - 品牌排行榜
  • 怎样禁止dbeaver点击导航中数据库自动切换sql编辑器所属的数据库
  • 2026国内最新高弹胶五大厂商实力排行榜:聚焦全屋健康,基于环保性能与市场口碑的权威推荐榜单 - 十大品牌榜
  • 2026国内最新门窗胶五大厂家实力排行榜:聚焦全屋健康,基于环保性能与市场口碑的权威推荐榜单 - 十大品牌榜
  • 今日总 结
  • 闲置大润发购物卡别浪费!4个实用回收妙招,安全变现不踩坑 - 京回收小程序
  • 今日 总结
  • j今日总结
  • 2026年北京小程序开发哪家强?深度解析高端定制服务商新标杆 - 品牌2025
  • TikTok、Google、Instagram海外推广怎么做?推荐5家专业代运营公司与营销服务商 - 品牌2025