说明:

提示:这篇文章仅是记录自己成长路上的愚笨,不喜勿喷,同时也希望各路大神提出优秀的观点。谢谢!!


问题需求:

项目中想通过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返回自定义结果集相关推荐

  1. java使用mybatis 调用存储过程返回一个游标结果集

    瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:IBM:Linux on System z Red Hat Enterprise Linux 7 版本:6.0,4.5 文档用途 mybat ...

  2. Mybatis ResultType处理返回类型

    目录 1. 使用resultType返回List 2. 使用resultType返回单个对象 3. 使用resultType返回List,适用于多表查询返回结果集 4. 使用resultType返回M ...

  3. Ibatis调用Oracle存储过程,以及返回Cursor结果集的问题

    最近开始接触Oracle了,接触的越多越感受到自己的渺小!(oracle10g ,Ibatis) 昨天需要通过数据库查询一组数据,数据中包含一个表中的一条数据.2个String类型的字符串,想通过Or ...

  4. MyBatis—insert语句返回主键和selectKey标签

    本文已同步至个人博客liaosi's blog - MyBatis-insert语句返回主键和selectKey标签 往数据库中插入一条记录后,有时候我们需要这条记录的主键,用于后续的操作.如果在插入 ...

  5. Cocoapods警告 - CocoaPods没有设置项目的基本配置,因为您的项目已经有自定义配置集

    本文翻译自:Cocoapods Warning - CocoaPods did not set the base configuration of your project because becau ...

  6. mybatis+postgresql+insert返回主键,action,service侧

    mybatis+postgresql+insert返回主键,action,service侧 在网上找了很久主要的内容如下: <insert id="insertDynaVisitInf ...

  7. 【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )

    文章目录 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 二.完整代码示例 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 博客 [C 语言]二级指针案例 ( ...

  8. 【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 )

    文章目录 一.二级指针案例 ( 返回自定义二级指针 ) 二.完整代码示例 一.二级指针案例 ( 返回自定义二级指针 ) 上一篇博客 [C 语言]二级指针案例 ( 字符串切割 | 返回 二维数组 作为结 ...

  9. Spring之RestTemplate如何返回map结果集

    /** * post请求,然后返回Map结果集 * @param baseUrl * @param uri * @param body * @param <T> * @return */ ...

最新文章

  1. android 虚拟机快捷键中英列表
  2. 再谈移动端Web屏幕适配
  3. 关闭串口_USART串口通信,DMA方式,一分钟从入门到大师
  4. IOS 开发一些常用的地址
  5. day05 selenium
  6. 汉诺塔c语言源程序步骤,汉诺塔问题的算法分析及C语言演示程序的实现
  7. C#的变迁史08 - C# 5.0 之并行编程总结篇
  8. ubuntu网站收集
  9. jar包与aar包的区别
  10. 【clickhouse】clickhouse 副本与分片 分片详解
  11. 解决Linux下使用sqlplus不能使用上下键,退格键
  12. CentOS 8 基础命令
  13. IP6K防尘试验测试
  14. Spring Boot入门教程(三十九):微信支付集成-申请服务号和微信支付
  15. android app wifi密码,手机WiFi密码显示APP
  16. word中在分页符后设置标题的段前间距
  17. C语言 | 条件运算符
  18. 程序员颈椎病康复秘籍,你值得拥有!
  19. ECCV 2022开奖!清华、浙大校友斩获最佳论文奖
  20. 基于小波变换的音频压缩

热门文章

  1. 2023 Mycode码支付系统PHP源码
  2. 基于51单片机的智能电子秤设计课程设计毕业设计
  3. 小米应用商店上传apk报图片格式错误,小米手机调试 DELETE_FAILED_INTERNAL_ERROR错误
  4. idea从零到精通08之IDEA常用插件、提升开发效率
  5. Android Studio 安装虚拟机报错 Intel® HAXM installation failed.
  6. JS基础学习(五):多重循环、调试、函数一等公民、break、continue
  7. 【论文详解】—AlphaGo中用到的3个关键技术
  8. 化骨龙 GPS M80Pro 拆解
  9. ECNUOJ 2856 仰望星空
  10. 南京农业大学计算机考研资料汇总