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.RegisterMapper
public interface SelectStreamByExampleMapper<T> {
     

    /**
     *   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.RegisterMapper
public interface SelectStreamByExampleRowBoundsMapper<T> {
     

    /**
     *   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とSelectStreamByExampleRowBounds Mapperを一つのインターフェースに組み合わせる。
/**
 *       
 * @param 
 * @author sunchangtan
 */
@tk.mybatis.mapper.annotation.RegisterMapper
public interface StreamMapper<T> extends
        SelectStreamByExampleMapper<T>,
        SelectStreamByExampleRowBoundsMapper<T> {
     
}
BaseMapperにStreamMapperを加える
/**
 * Mapper   
 * @author sunchangtan
 * @param 
 */
public interface BaseMapper<T> extends Mapper<T>, MySqlMapper<T>, StreamMapper<T> {
     
}
使用例:
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);
});