千家信息网

扩展tk.mybatis的流式查询功能如何实现

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"扩展tk.mybatis的流式查询功能如何实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"扩展tk.mybatis的流式查询功能如何实
千家信息网最后更新 2026年11月02日扩展tk.mybatis的流式查询功能如何实现

本篇内容主要讲解"扩展tk.mybatis的流式查询功能如何实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"扩展tk.mybatis的流式查询功能如何实现"吧!

mybatis查询默认是一次获取全部, 有时候需要查询上万上百万数据时,如果一次性读取到内存中,会容易导致OOM问题。这时候需要采用流式查询。以下扩展了tk.mybatis的流式查询功能。

@Options注解是关键

import org.apache.ibatis.annotations.Options;import org.apache.ibatis.annotations.SelectProvider;import org.apache.ibatis.mapping.ResultSetType;import org.apache.ibatis.session.ResultHandler;/** * 通用Mapper接口,流式查询 * * @param  不能为空 * @author sunchangtan */@tk.mybatis.mapper.annotation.RegisterMapperpublic interface SelectStreamByExampleMapper {    /**     * 根据example条件和RowBounds进行流式查询     *     * @param example     * @return     */    @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)    @SelectProvider(type = StreamExampleProvider.class, method = "dynamicSQL")    void selectStreamByExampleMapper(Object example, ResultHandler resultHandler);}

带RowBounds的流式查询

import org.apache.ibatis.annotations.Options;import org.apache.ibatis.annotations.SelectProvider;import org.apache.ibatis.mapping.ResultSetType;import org.apache.ibatis.session.ResultHandler;import org.apache.ibatis.session.RowBounds;/** * 通用Mapper接口,流式查询 * * @param  不能为空 * @author sunchangtan */@tk.mybatis.mapper.annotation.RegisterMapperpublic interface SelectStreamByExampleRowBoundsMapper {    /**     * 根据example条件和RowBounds进行流式查询     *     * @param example     * @return     */    @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)    @SelectProvider(type = StreamExampleProvider.class, method = "dynamicSQL")    void selectStreamByExampleRowBoundsMapper(Object example, RowBounds rowBounds, ResultHandler resultHandler);}

流式ExampleProvider

import org.apache.ibatis.mapping.MappedStatement;import tk.mybatis.mapper.mapperhelper.MapperHelper;import tk.mybatis.mapper.provider.ExampleProvider;/** * 流式查询的SqlProvider * @author sunchangtan */public class StreamExampleProvider extends ExampleProvider {    public StreamExampleProvider(Class mapperClass, MapperHelper mapperHelper) {        super(mapperClass, mapperHelper);    }    /**     * 根据Example流式查询     *     * @param ms     * @return     */    public String selectStreamByExampleMapper(MappedStatement ms) {        return this.selectByExample(ms);    }    /**     * 根据Example和RowBounds流式查询     * @param ms     * @return     */    public String selectStreamByExampleRowBoundsMapper(MappedStatement ms) {        return this.selectByExample(ms);    }}

将SelectStreamByExampleMapper和SelectStreamByExampleRowBoundsMapper组合成一个接口

/** * 流式查询接口 * @param  * @author sunchangtan */@tk.mybatis.mapper.annotation.RegisterMapperpublic interface StreamMapper extends        SelectStreamByExampleMapper,        SelectStreamByExampleRowBoundsMapper {}

在BaseMapper中加入StreamMapper

/** * Mapper的基类 * @author sunchangtan * @param  */public interface BaseMapper extends Mapper, MySqlMapper, StreamMapper {}

使用例子:

this.userMapper.selectStreamByExampleRowBoundsMapper(example, new RowBounds(0, 1), resultContext -> {     User user= (User) resultContext.getResultObject();     System.out.println(user); });this.userMapper.selectStreamByExampleMapper(example, resultContext -> {    User user= (User) resultContext.getResultObject();    System.out.println(User);});

到此,相信大家对"扩展tk.mybatis的流式查询功能如何实现"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0