千家信息网

jdbc和mybatis的流式查询怎么用

发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,这篇文章将为大家详细讲解有关jdbc和mybatis的流式查询怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jdbc流式查询:jdbc的流式查询需要在生成Pr
千家信息网最后更新 2025年11月15日jdbc和mybatis的流式查询怎么用

这篇文章将为大家详细讲解有关jdbc和mybatis的流式查询怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

jdbc流式查询:

jdbc的流式查询需要在生成PreparedStatement的时候设置三个参数。如下:

PreparedStatement stmt = jdbcTemplate.getDataSource().getConnection().prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);stmt.setFetchSize(Integer.MIN_VALUE);

主要使用到的是java.sql.Connection的prepareStatement方法。

PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException;

resultSetType和resultSetConcurrency我们要分别设置为ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY。

还有就是fetchSize设置为Integer.MIN_VALUE,一开始比较疑惑为啥是这个值。后来发现代码里面对这个值其实是有特殊处理的。

这个是com.mysql.cj.jdbc.StatementImpl的setFetchSize方法。

@Override   public void setFetchSize(int rows) throws SQLException {       synchronized (checkClosed().getConnectionMutex()) {           if (((rows < 0) && (rows != Integer.MIN_VALUE)) || ((this.maxRows > 0) && (rows > this.getMaxRows()))) {               throw SQLError.createSQLException(Messages.getString("Statement.7"), MysqlErrorNumbers.SQL_STATE_ILLcom.mysql.cj.jdbc.StatementImpl的方法EGAL_ARGUMENT, getExceptionInterceptor());           }           this.query.setResultFetchSize(rows);       }   }

resultSetType,有以下三种

/**     * The constant indicating the type for a ResultSet object     * whose cursor may move only forward.     * @since 1.2     */    int TYPE_FORWARD_ONLY = 1003;    /**     * The constant indicating the type for a ResultSet object     * that is scrollable but generally not sensitive to changes to the data     * that underlies the ResultSet.     * @since 1.2     */    int TYPE_SCROLL_INSENSITIVE = 1004;    /**     * The constant indicating the type for a ResultSet object     * that is scrollable and generally sensitive to changes to the data     * that underlies the ResultSet.     * @since 1.2     */    int TYPE_SCROLL_SENSITIVE = 1005;
stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);stmt.setFetchSize(Integer.MIN_VALUE);

resultSetConcurrency有以下两种,流式查询要设置为只读的,数据不会被更新。

/**     * The constant indicating the concurrency mode for a     * ResultSet object that may NOT be updated.     * @since 1.2     */    int CONCUR_READ_ONLY = 1007;    /**     * The constant indicating the concurrency mode for a     * ResultSet object that may be updated.     * @since 1.2     */    int CONCUR_UPDATABLE = 1008;

mybatis流式查询:

mapper中的代码:

@Select("select * from xxx order by xx desc")@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = Integer.MIN_VALUE)@ResultType(XxxObject.class)void queryStreamResult(ResultHandler handler);

在查询方法上加入注解@Options和@ResultType。设置参数不用多说和上面jdbc的底层是一样的,参数值也一样。

只不过设置了@ResultType告诉程序应该要返回什么类型的对象。还有这个ResultHandler其实就是Consumer的函数式接口用来处理每一条返回的数据。

具体方法中的代码:

@Override   public Boolean dealDataList() {       mapper.queryStreamResult(resultContext -> {           dealSingleData(resultContext.getResultObject().getUid());       });       return true;   }

这里怎么使用每一条返回的数据只要在resultContext使用ResultObject就可以拿到上面mapper设置的XxxObject对象进行操作了。

关于"jdbc和mybatis的流式查询怎么用"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

查询 方法 代码 参数 数据 篇文章 对象 就是 更多 处理 不错 实用 特殊 三个 不用 内容 函数 只不过 底层 接口 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全应急响应题目 服务器信息安全大数据区块链 香港服务器搭建游戏平台 国家网络安全信息法 一个服务器插2个阵列卡 武汉理工数据库系统综合实验 广州楚越互联网络科技有限公司 信保汇通互联网科技招兼职 使用路由器搭建游戏服务器 台州软件开发专业 严禁软件开发的分包转包 数据库管理系统应具备 金银加工网络技术培训 索尼新机影像数据库文件错误 软件开发全过程有什么资料 关于网页和服务器的关系 scum单人服务器修改 超微服务器在哪里生产 北京前端软件开发靠谱吗 常见网络安全侵害事例 云顶之弈一直连不上服务器怎么办 网络技术设备大全 对软件开发成败影响最大的 怎么才能找到安装的数据库 河北pdu服务器专用电源厂商 计算机网络技术课程实训报告 郑州软件开发收费报价表 网络安全常用软件有哪些 无线个域网络技术的重点 计算机网络安全事例
0