创建 spring boot 项目,添加 mybatis 依赖。
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency>
这是一个普通的 POJO。
package com.xxx.qingdao.entity; public class TargetSnapshot { private String targetId;// 由于 Java 里没有 uint64, 并且这个字段没有算术运算 private Integer mmsi; // 忽略 getter 和 setter 方法 和其他字段 }
注意方法 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); }
注意,实现了一个 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)); } }
在配置文件 application.properties
中配置数据源。
spring.datasource.url=jdbc:mysql://localhost:3306/gateway_target spring.datasource.username=root spring.datasource.password=xxxxxx
整体还是比较清晰的。
没有使用 RowBound 是因为它是逻辑分页,即查出所有的数据,然后再过滤一遍。