mybatis流式查询

简介: mybatis流式查询

所谓浮躁,也就是时时刻刻,希望以最短的时间,博取最多的存在感、优越感和自我认同。——张佳玮

分享一个mybatis流式查询

用法很简单:

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需要关闭,可以用

StreamSupport.stream(userCursor.spliterator(), false);

将其转换为Stream

Mapper

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

<?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

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;
}

执行以下测试用例:

完整代码:

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

相关文章
|
2月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
173 8
|
16天前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
12 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
22天前
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
22 1
|
2月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
4月前
|
Java 数据库连接 mybatis
Mybatis查询传递单个参数和传递多个参数用法
Mybatis查询传递单个参数和传递多个参数用法
64 11
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法
|
5月前
|
Java 数据库连接 mybatis
Mybatis基于注解的一对一和一对多查询
Mybatis基于注解的一对一和一对多查询
|
6月前
|
SQL Java 数据库连接
MyBatis 查询数据库
MyBatis 查询数据库