转载

mybatis 物理分页查询(spring boot)

一、准备工作

创建 spring boot 项目,添加 mybatis 依赖。

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>

二、编码

1.创建 entity 实体类

这是一个普通的 POJO。

package com.xxx.qingdao.entity;
public class TargetSnapshot {
    private String targetId;// 由于 Java 里没有 uint64, 并且这个字段没有算术运算
    private Integer mmsi;
// 忽略 getter 和 setter 方法 和其他字段
}

2.创建 TargetSnapshotMapper 接口类

注意方法 findByParamsByPage 包含了分页的参数。

package com.xxx.qingdao.dao;
import com.xxx.qingdao.entity.TargetSnapshot;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Component;
import java.util.List;

@Mapper
@Component
public interface TargetSnapshotMapper {
    @Select("select * from t_target_snapshot where create_time > #{startDate} and create_time < #{endDate} limit #{page}, #{size}")
    List<TargetSnapshot> findByParamsByPage(@Param("startDate") String startDate,
                                            @Param("endDate") String endDate,
                                            @Param("page") int page, @Param("size") int size);
}

3. 创建 QingdaoService 类

注意,实现了一个 CommandLineRunner 接口,目的是在启动时执行这个方法。

package com.xxx.qingdao.dao;
import com.xxx.qingdao.entity.TargetSnapshot;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
public class QingdaoService implements CommandLineRunner {
    private static final Logger logger = LoggerFactory.getLogger(QingdaoService.class);

    @Autowired
    private TargetSnapshotMapper targetSnapshotMapper;

    @Override
    public void run(String... args) throws Exception {
        logger.info("#### start ####");
        long start = System.currentTimeMillis();
        int page = 0;
        int size = 1000;
        int count = targetSnapshotMapper.count("2019-12-04 11:45:00", "2019-12-04 11:47:00");
        logger.info("count:{}", count);
        while (true) {
            List<TargetSnapshot> list = targetSnapshotMapper.findByParamsByPage("2019-12-04 11:45:00", "2019-12-04 11:47:00", page++ * size, size);
            logger.info("size:{},page:{}", list.size(), page);
            if (list.size() == 0) break;
        }
        long end = System.currentTimeMillis();
        logger.info("#### end #### takes(ms): {}", (end - start));
    }
}

4. 配置数据源

在配置文件 application.properties 中配置数据源。

spring.datasource.url=jdbc:mysql://localhost:3306/gateway_target
spring.datasource.username=root
spring.datasource.password=xxxxxx

三、总结

整体还是比较清晰的。

没有使用 RowBound 是因为它是逻辑分页,即查出所有的数据,然后再过滤一遍。

原文  https://lsbc.fun/archives/51/
正文到此结束
Loading...