前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mybatis流式查询

mybatis流式查询

作者头像
阿超
发布2022-08-21 13:39:54
7180
发布2022-08-21 13:39:54
举报
文章被收录于专栏:快乐阿超快乐阿超

分享一个mybatis流式查询

用法很简单:

代码语言:javascript
复制
package com.ruben;

import com.ruben.mapper.UserMapper;
import com.ruben.pojo.po.UserPO;
import lombok.SneakyThrows;
import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.stream.StreamSupport;

@SpringBootTest
class SimpleMybatisApplicationTests {

    @Resource
    private SqlSessionFactory sqlSessionFactory;
    @Resource
    private TransactionTemplate transactionTemplate;
    @Resource
    private UserMapper userMapper;

    @Test
    @SneakyThrows
    void sqlSessionWay() {
        Assertions.assertAll(() -> {
            try (SqlSession session = sqlSessionFactory.openSession(); Cursor<UserPO> userCursor = session.getMapper(UserMapper.class).selectPageCursor(new RowBounds(0, 5))) {
                StreamSupport.stream(userCursor.spliterator(), true).forEach(System.out::println);
            }
        });
    }

    @Test
    void transactionTemplateWay() {
        Assertions.assertAll(() -> transactionTemplate.executeWithoutResult(transactionStatus -> {
            try (Cursor<UserPO> userCursor = userMapper.selectPageCursor(new RowBounds(0, 5))) {
                StreamSupport.stream(userCursor.spliterator(), true).forEach(System.out::println);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }));
    }

    @Test
    @Transactional
    void transactionalWay() {
        Assertions.assertAll(() -> {
            try (Cursor<UserPO> userCursor = userMapper.selectPageCursor(new RowBounds(0, 5))) {
                StreamSupport.stream(userCursor.spliterator(), true).forEach(System.out::println);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
    }


}

注意这里返回的Cursor需要关闭,可以用

代码语言:javascript
复制
StreamSupport.stream(userCursor.spliterator(), false);

将其转换为Stream

Mapper

代码语言:javascript
复制
package com.ruben.mapper;

import com.ruben.pojo.po.UserPO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.session.RowBounds;

/**
 * 用户Mapper
 *
 * @author VampireAchao
 */
@Mapper
public interface UserMapper {
    /**
     * 流式分页查询用户
     *
     * @param rowBounds 分页条件
     * @return 用户流
     */
    Cursor<UserPO> selectPageCursor(RowBounds rowBounds);

}

xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruben.mapper.UserMapper">
    <select id="selectPageCursor" resultType="com.ruben.pojo.po.UserPO">
        select *
        from User
    </select>
</mapper>

po

代码语言:javascript
复制
package com.ruben.pojo.po;

import lombok.Data;

import java.io.Serializable;

/**
 * 用户PO
 *
 * @author VampireAchao
 */
@Data
public class UserPO implements Serializable {

    private static final long serialVersionUID = -7219188882388819210L;
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private Integer version;
}

执行以下测试用例:

image-20220514133319228
image-20220514133319228

完整代码:

https://gitee.com/VampireAchao/simple-mybatis.git

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档