博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql游标
阅读量:4230 次
发布时间:2019-05-26

本文共 3034 字,大约阅读时间需要 10 分钟。

mysql分页查询的时候有深度翻页的问题,如果我们需要查询全部数据的时候,不可能一次查询全部,这个时候就可以使用游标,游标的原理其实就是顺序查询,只是每次查询到一些数据后会先返回给我们,然后继续往后查询。这样解决了等待问题,也解决了内存爆炸问题。下面通过mybatis介绍一下游标的使用。

使用方式

@Componentpublic class PersonResultHandler implements ResultHandler
{ @Override public void handleResult(ResultContext
resultContext) { System.out.println(resultContext.isStopped()); System.out.println(resultContext.getResultObject()); }}@Mapperpublic interface PersonMapper { Person getById(@Param("id") Long id); int create(Person person); void findAll(ResultHandler
resultHandler);}

思路

mybatis提供了两个接口,可以通过游标查询。

void select(String var1, Object var2, ResultHandler var3);    void select(String var1, ResultHandler var2);

根据this.method.returnsVoid() && this.method.hasResultHandler()可以知道,如果接口返回值为void并且包含resultHandler接口,则可以使用游标查询。

public Object execute(SqlSession sqlSession, Object[] args) {        Object param;        Object result;        switch(this.command.getType()) {        case INSERT:            param = this.method.convertArgsToSqlCommandParam(args);            result = this.rowCountResult(sqlSession.insert(this.command.getName(), param));            break;        case UPDATE:            param = this.method.convertArgsToSqlCommandParam(args);            result = this.rowCountResult(sqlSession.update(this.command.getName(), param));            break;        case DELETE:            param = this.method.convertArgsToSqlCommandParam(args);            result = this.rowCountResult(sqlSession.delete(this.command.getName(), param));            break;        case SELECT:            if (this.method.returnsVoid() && this.method.hasResultHandler()) {                this.executeWithResultHandler(sqlSession, args);                result = null;            } else if (this.method.returnsMany()) {                result = this.executeForMany(sqlSession, args);            } else if (this.method.returnsMap()) {                result = this.executeForMap(sqlSession, args);            } else if (this.method.returnsCursor()) {                result = this.executeForCursor(sqlSession, args);            } else {                param = this.method.convertArgsToSqlCommandParam(args);                result = sqlSession.selectOne(this.command.getName(), param);            }            break;        case FLUSH:            result = sqlSession.flushStatements();            break;        default:            throw new BindingException("Unknown execution method for: " + this.command.getName());        }        if (result == null && this.method.getReturnType().isPrimitive() && !this.method.returnsVoid()) {            throw new BindingException("Mapper method '" + this.command.getName() + " attempted to return null from a method with a primitive return type (" + this.method.getReturnType() + ").");        } else {            return result;        }    }

转载地址:http://msjqi.baihongyu.com/

你可能感兴趣的文章
关于#include "stdafx.h"
查看>>
VC下线程同步的三种方法(互斥、事件、临界区)/(转)
查看>>
非常好的一篇U-BOOT的文章--转载
查看>>
【设计模式】学习之创建型 单例模式
查看>>
【设计模式】学习之创建型 原型模式
查看>>
【设计模式】学习之结构型 适配器模式-装饰器模式-代理模式
查看>>
Maven+Eclipse+Tomcat+Spring MVC web 请求 404 问题总结及noHandlerFound
查看>>
SpringMVC API缓存 LastModified的实现总结
查看>>
406 Not Acceptable 415 Unsupported Media Type Spring MVC consumes与produces
查看>>
MyBatis 高级映射与懒加载
查看>>
HCIP-H12-222练习题
查看>>
点到点IPSec VPN的配置
查看>>
MySQL InnoDB何时更新表的索引统计信息
查看>>
MTU 设置错误导致防火墙或者路由器断网
查看>>
子网划分详解与子网划分实例
查看>>
游戏通讯技术:帧同步技术
查看>>
防火墙技术指标---并发连接数/吞吐量
查看>>
V100服务器和T4服务器的性能指标
查看>>
elasticsearch 启动、停止及更改密码
查看>>
Kafka,它为什么速度会这么快?
查看>>