mybatis通过ResultSets返回自定义结果集
说明:
提示:这篇文章仅是记录自己成长路上的愚笨,不喜勿喷,同时也希望各路大神提出优秀的观点。谢谢!!
问题需求:
项目中想通过mybatis查询后直接返回DataFrame数据结构的数据,但是mybatis的ResultType又不支持,所以“曲线救国”通过ResultSets来返回需要的结果
代码:
ResultSets结果集拦截器
package com.application.interceptor.mybatis;import joinery.DataFrame;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.ibatis.executor.resultset.DefaultResultSetHandler;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
import org.springframework.util.ReflectionUtils;import java.lang.reflect.Field;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Properties;/*** mybatisResultSet结果集拦截器** @author wo* @createDate 2021/5/24 16:00*/
@Intercepts({@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})})
public class ResultHandlerInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {ResultSetHandler resultSetHandler = (ResultSetHandler) invocation.getTarget();Field mappedStatementField = ReflectionUtils.findField(DefaultResultSetHandler.class, "mappedStatement");mappedStatementField.setAccessible(true);MappedStatement mappedStatement = (MappedStatement) ReflectionUtils.getField(mappedStatementField, resultSetHandler);SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();if (sqlCommandType == SqlCommandType.SELECT) {String[] resultSets = mappedStatement.getResultSets();if (ArrayUtils.isNotEmpty(resultSets) && ArrayUtils.contains(resultSets, "dataFrame")) {Statement statement = (Statement) invocation.getArgs()[0];// 这里需要注意:一定要注意使用返回list,因为mybatis所有的查询最终都是使用selectList方法。// 这里即使返回的是list,但是在mapper文件里可以直接使用DataFrame接收参数(也就是说selectOne方法会获取list的第一个值来返回)return Arrays.asList(DataFrame.readSql(statement.getResultSet()));}}return invocation.proceed();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}
}
mybatis的Xml配置,拦截器的注册
<plugins><plugin interceptor="com.application.interceptor.mybatis.ResultHandlerInterceptor"></plugin>
</plugins>
至此已经配置完成了! 接下来就可以使用了
mybatis的Xml配置
<select id="exportData" resultSets="dataFrame">select * from device
</select>
mybatis的mapper配置
DataFrame<Object> exportData();
结尾:
说明:关于mybatis的ResultSets具体使用说明请参考mybatis官网 或者自行度娘。
有关mybatis的查询结果集处理请参考mybatis的源码或者自行度娘。
谢谢!!!
mybatis通过ResultSets返回自定义结果集相关推荐
- java使用mybatis 调用存储过程返回一个游标结果集
瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:IBM:Linux on System z Red Hat Enterprise Linux 7 版本:6.0,4.5 文档用途 mybat ...
- Mybatis ResultType处理返回类型
目录 1. 使用resultType返回List 2. 使用resultType返回单个对象 3. 使用resultType返回List,适用于多表查询返回结果集 4. 使用resultType返回M ...
- Ibatis调用Oracle存储过程,以及返回Cursor结果集的问题
最近开始接触Oracle了,接触的越多越感受到自己的渺小!(oracle10g ,Ibatis) 昨天需要通过数据库查询一组数据,数据中包含一个表中的一条数据.2个String类型的字符串,想通过Or ...
- MyBatis—insert语句返回主键和selectKey标签
本文已同步至个人博客liaosi's blog - MyBatis-insert语句返回主键和selectKey标签 往数据库中插入一条记录后,有时候我们需要这条记录的主键,用于后续的操作.如果在插入 ...
- Cocoapods警告 - CocoaPods没有设置项目的基本配置,因为您的项目已经有自定义配置集
本文翻译自:Cocoapods Warning - CocoaPods did not set the base configuration of your project because becau ...
- mybatis+postgresql+insert返回主键,action,service侧
mybatis+postgresql+insert返回主键,action,service侧 在网上找了很久主要的内容如下: <insert id="insertDynaVisitInf ...
- 【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )
文章目录 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 二.完整代码示例 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 博客 [C 语言]二级指针案例 ( ...
- 【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 )
文章目录 一.二级指针案例 ( 返回自定义二级指针 ) 二.完整代码示例 一.二级指针案例 ( 返回自定义二级指针 ) 上一篇博客 [C 语言]二级指针案例 ( 字符串切割 | 返回 二维数组 作为结 ...
- Spring之RestTemplate如何返回map结果集
/** * post请求,然后返回Map结果集 * @param baseUrl * @param uri * @param body * @param <T> * @return */ ...
最新文章
- android 虚拟机快捷键中英列表
- 再谈移动端Web屏幕适配
- 关闭串口_USART串口通信,DMA方式,一分钟从入门到大师
- IOS 开发一些常用的地址
- day05 selenium
- 汉诺塔c语言源程序步骤,汉诺塔问题的算法分析及C语言演示程序的实现
- C#的变迁史08 - C# 5.0 之并行编程总结篇
- ubuntu网站收集
- jar包与aar包的区别
- 【clickhouse】clickhouse 副本与分片 分片详解
- 解决Linux下使用sqlplus不能使用上下键,退格键
- CentOS 8 基础命令
- IP6K防尘试验测试
- Spring Boot入门教程(三十九):微信支付集成-申请服务号和微信支付
- android app wifi密码,手机WiFi密码显示APP
- word中在分页符后设置标题的段前间距
- C语言 | 条件运算符
- 程序员颈椎病康复秘籍,你值得拥有!
- ECCV 2022开奖!清华、浙大校友斩获最佳论文奖
- 基于小波变换的音频压缩
热门文章
- 2023 Mycode码支付系统PHP源码
- 基于51单片机的智能电子秤设计课程设计毕业设计
- 小米应用商店上传apk报图片格式错误,小米手机调试 DELETE_FAILED_INTERNAL_ERROR错误
- idea从零到精通08之IDEA常用插件、提升开发效率
- Android Studio 安装虚拟机报错 Intel® HAXM installation failed.
- JS基础学习(五):多重循环、调试、函数一等公民、break、continue
- 【论文详解】—AlphaGo中用到的3个关键技术
- 化骨龙 GPS M80Pro 拆解
- ECNUOJ 2856 仰望星空
- 南京农业大学计算机考研资料汇总